0Pricing
CUDA Academy · บทเรียน

พอยน์เตอร์เดียว ใช้ได้ทั้งสองฝั่ง

ดูว่า cudaMallocManaged ทำงานอย่างไร

พอยน์เตอร์เดียว ใช้ได้ทั้งสองฝั่ง เป็นบทเรียน CUDA Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน CUDA Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส CUDA Academy มีบทเรียนทั้งหมด 4 บทเรียน

ปัญหาปวดหัวจากตัวชี้สองตัว

จนถึงตอนนี้คุณต้องจัดการตัวชี้สองตัว ตัวหนึ่งสำหรับโฮสต์และอีกตัวสำหรับอุปกรณ์ Unified Memory แก้ปัญหานี้ด้วยการใช้ ตัวชี้เดียวที่ทั้งสองฝั่งใช้ได้ 🙂

ทำความรู้จัก cudaMallocManaged

คุณจัดสรรหน่วยความจำแบบจัดการด้วย cudaMallocManaged ฟังก์ชันนี้จะคืนที่อยู่เดียวซึ่งใช้งานได้ทั้งในโค้ด CPU และภายในเคอร์เนล

float *data;
cudaMallocManaged(&data, n * sizeof(float));

ไม่ต้องใช้ cudaMemcpy อีกต่อไป

ประโยชน์สำคัญคือ โดยปกติคุณไม่ต้องคัดลอกข้อมูลด้วยตนเอง หน่วยความจำแบบจัดการจะให้ระบบขณะทำงานย้ายข้อมูลให้ ดังนั้น cudaMemcpy จึงมักหายไปจากโค้ดของคุณ

เขียนข้อมูลบนโฮสต์

คุณสามารถเติมข้อมูลลงในบัฟเฟอร์ด้วยโค้ด CPU ทั่วไปได้ทันทีหลังจัดสรร ตัว ตัวชี้เดียวกับที่ได้รับมาคือที่อยู่ปกติซึ่งลูปของคุณเข้าถึงได้

for (int i = 0; i < n; i++)
    data[i] = i;

อ่านข้อมูลบนอุปกรณ์

ส่งตัวชี้เดียวกันนั้นให้เคอร์เนล แล้วเธรดของ GPU จะอ้างอิงข้อมูลผ่านตัวชี้โดยตรง ที่อยู่เดียวรองรับทั้งสองฝั่งโดยไม่ต้องมีขั้นตอนแปลง

kernel<<<blocks, threads>>>(data, n);

ซิงโครไนซ์ก่อนอ่านข้อมูลกลับ

หลังจากเคอร์เนลเขียนข้อมูลแบบจัดการแล้ว ให้เรียก cudaDeviceSynchronize ก่อนที่ CPU จะอ่านข้อมูล การทำเช่นนี้รับรองว่า GPU ทำงานเสร็จและผลลัพธ์พร้อมใช้งาน

kernel<<<b, t>>>(data, n);
cudaDeviceSynchronize();

คืนหน่วยความจำเหมือนบัฟเฟอร์ทั่วไป

หน่วยความจำแบบจัดการยังคงเป็นหน่วยความจำของอุปกรณ์ ดังนั้นให้คืนหน่วยความจำด้วย cudaFree ไม่มีฟังก์ชันคืนหน่วยความจำแบบจัดการเฉพาะที่ต้องจำ

cudaFree(data);

โค้ดประกอบน้อยลง บั๊กน้อยลง

เมื่อคุณตัดขั้นตอนจัดสรร-คัดลอก-เรียกใช้-คัดลอก-คืนหน่วยความจำออก โปรแกรมก็สั้นลง การคัดลอกที่น้อยลงหมายถึงโอกาสสับสนทิศทางหรือขนาดก็น้อยลง

เหมาะสำหรับการสร้างต้นแบบ

Unified Memory เหมาะอย่างยิ่งเมื่อคุณต้องการให้เคอร์เนลทำงานได้รวดเร็ว คุณสามารถสร้าง ต้นแบบได้อย่างรวดเร็ว แล้วค่อยปรับการถ่ายโอนเฉพาะจุดที่มีผลจริงภายหลัง

ไม่ใช่เวทมนตร์ที่ใช้ฟรี

เบื้องหลัง ข้อมูลยังคงต้องเดินทางผ่าน PCIe ความสะดวกมีอยู่จริง แต่ ประสิทธิภาพอาจช้ากว่าการคัดลอกที่ปรับแต่งด้วยตนเอง จนกว่าคุณจะเพิ่มคำแนะนำในภายหลัง

ควรเลือกใช้เมื่อใด

เลือกหน่วยความจำแบบจัดการเมื่อคุณต้องการโค้ดที่เรียบง่าย โครงสร้างตัวชี้ที่ซับซ้อน หรือการจัดสรรหน่วยความจำ GPU เกินขนาดที่มี หน่วยความจำนี้เหมาะเมื่อ ความชัดเจนสำคัญกว่าความเร็วสูงสุดดิบ

ตรวจสอบอย่างรวดเร็ว

มาทบทวนกันว่าการจัดสรรหน่วยความจำแบบจัดการแตกต่างจากกระบวนการแบบเดิมอย่างไร

ทบทวน: ตัวชี้เดียวสำหรับทั้งสองฝั่ง

คุณได้เรียนรู้ว่า cudaMallocManaged คืนตัวชี้เดียวสำหรับโฮสต์และอุปกรณ์ ทำให้ไม่ต้องคัดลอกข้อมูลส่วนใหญ่ ซิงโครไนซ์ก่อนอ่าน และคืนหน่วยความจำด้วย cudaFree ทำได้ดีมากครับ/ค่ะ 🎉

คำถามที่พบบ่อย

บทเรียน “พอยน์เตอร์เดียว ใช้ได้ทั้งสองฝั่ง” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “พอยน์เตอร์เดียว ใช้ได้ทั้งสองฝั่ง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส CUDA Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส CUDA Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “พอยน์เตอร์เดียว ใช้ได้ทั้งสองฝั่ง”

ดูว่า cudaMallocManaged ทำงานอย่างไร คุณปฏิบัติ CUDA Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน CUDA Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน CUDA Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “พอยน์เตอร์เดียว ใช้ได้ทั้งสองฝั่ง” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน CUDA Academy นี้ได้ไหม

ได้ บทเรียน CUDA Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. พอยน์เตอร์เดียว ใช้ได้ทั้งสองฝั่ง
  2. ย้ายหน้าหน่วยความจำตามต้องการ
  3. ดึงข้อมูลล่วงหน้าด้วย cudaMemPrefetchAsync
  4. ให้คำแนะนำผ่าน cudaMemAdvise
← กลับไปที่ CUDA Academy