หน่วยความจำตรึงด้วย cudaMallocHost
บัฟเฟอร์ที่ล็อกหน้าไว้สำหรับ DMA ที่รวดเร็ว
หน่วยความจำตรึงด้วย 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ทำไมหน่วยความจำแบบแบ่งหน้าได้จึงช้า
- หน่วยความจำตรึงด้วย cudaMallocHost
- cudaMemcpyAsync ในสตรีม
- ไปป์ไลน์แบบบัฟเฟอร์คู่