CUDA Academy · บทเรียน

หน่วยความจำตรึงด้วย cudaMallocHost

บัฟเฟอร์ที่ล็อกหน้าไว้สำหรับ DMA ที่รวดเร็ว

บทเรียน 2 จาก 413 ขั้นตอน

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

ทำความรู้จักหน่วยความจำแบบตรึง

หน่วยความจำแบบตรึง คือหน่วยความจำของโฮสต์ที่ระบบปฏิบัติการรับรองว่าจะไม่ย้ายหรือสลับออก ตำแหน่งทางกายภาพของหน่วยความจำจึงคงที่ และ GPU สามารถอ่านข้อมูลได้โดยตรง

เรียกอีกอย่างว่าหน่วยความจำล็อกหน้า

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

จัดสรรให้ถูกต้อง

ขอหน่วยความจำแบบตรึงจาก CUDA ด้วย cudaMallocHost ฟังก์ชันนี้จะคืนตัวชี้โฮสต์ทั่วไป ซึ่งคุณสามารถอ่านและเขียนได้เหมือนอาร์เรย์ C++ ทั่วไป

float* h_data;
cudaMallocHost(&h_data, N * sizeof(float));

ใช้งานเหมือนปกติ

ตัวชี้ที่คืนมาจะทำงานเหมือนบัฟเฟอร์โฮสต์ทั่วไป ดังนั้นโค้ดของ CPU จึงไม่ต้องเปลี่ยนแปลง เพียงเติมข้อมูลและอ่านข้อมูลเหมือนเดิม

for (int i = 0; i < N; ++i) h_data[i] = i * 1.0f;

ไม่ต้องใช้พื้นที่พักอีกต่อไป

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

การถ่ายโอนที่เร็วขึ้น

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

คืนหน่วยความจำให้ถูกต้อง

หน่วยความจำแบบตรึงต้องใช้ฟังก์ชันคืนหน่วยความจำที่ตรงกัน ให้ใช้ cudaFreeHost และอย่าใช้ free แบบทั่วไป มิฉะนั้นอาจเกิดข้อขัดข้องและหน่วยความจำรั่วได้

cudaFreeHost(h_data);

หน่วยความจำนี้ไม่ได้ใช้ฟรี

หน้าหน่วยความจำแบบตรึงไม่สามารถสลับออกได้ จึงยึด RAM จริงไว้ หากตรึงมากเกินไป ระบบส่วนที่เหลือจะมีหน่วยความจำที่ใช้งานได้ไม่เพียงพอ

การจัดสรรช้าลง

การล็อกหน้าหน่วยความจำต้องใช้การดำเนินการเพิ่มเติม ดังนั้น cudaMallocHost จึงจัดสรรได้ ช้ากว่า malloc ให้ใช้บัฟเฟอร์แบบตรึงเดิมซ้ำกับการถ่ายโอนหลายครั้ง แทนการจัดสรรใหม่ทุกครั้ง

ความสามารถที่แท้จริง

นอกเหนือจากความเร็ว หน่วยความจำแบบตรึงคือกุญแจสำคัญที่ทำให้การคัดลอกแบบ อะซิงโครนัสทำงานได้อย่างแท้จริง หากไม่มีหน่วยความจำนี้ cudaMemcpyAsync จะทำงานซ้อนทับกับสิ่งอื่นไม่ได้

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

ตรึงบัฟเฟอร์ที่คุณถ่ายโอนบ่อยหรือใช้ป้อนข้อมูลให้กับ สตรีม สำหรับการคัดลอกอาร์เรย์ขนาดเล็กเพียงครั้งเดียว malloc แบบทั่วไปก็เพียงพอแล้ว 🙂

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

คุณจัดสรรบัฟเฟอร์ด้วย cudaMallocHost แล้วควรคืนหน่วยความจำด้วยวิธีใด

ทบทวน

cudaMallocHost จะตรึงหน้าโฮสต์ไว้ ทำให้ GPU อ่านข้อมูลได้โดยตรง จึงคัดลอกได้เร็วขึ้นและทำให้การทำงานซ้อนทับแบบอะซิงโครนัสเป็นไปได้ ให้คืนหน่วยความจำด้วย cudaFreeHost เสมอ 🔒

เริ่มต้นได้ฟรี

เรียนรู้ C++ ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
30
บทเรียน
120

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

บทเรียน “หน่วยความจำตรึงด้วย cudaMallocHost” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “หน่วยความจำตรึงด้วย cudaMallocHost”

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

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

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

บทเรียน “หน่วยความจำตรึงด้วย cudaMallocHost” ใช้เวลานานแค่ไหน

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

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

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

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

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