หลีกเลี่ยงหน่วยความจำรั่วและการคืนซ้ำ
จัดการช่วงอายุการจองหน่วยความจำอย่างมีวินัย
หลีกเลี่ยงหน่วยความจำรั่วและการคืนซ้ำ เป็นบทเรียน CUDA Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน CUDA Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส CUDA Academy มีบทเรียนทั้งหมด 4 บทเรียน
หน่วยความจำที่คุณลืมคืนพื้นที่
หากคุณเรียก cudaMalloc เพื่อจองบัฟเฟอร์แล้วไม่คืนพื้นที่ หน่วยความจำ GPU นั้นจะยังถูกยึดไว้ การสิ้นเปลืองนี้เรียกว่า หน่วยความจำรั่ว 💧
หน่วยความจำรั่วสะสมอย่างรวดเร็ว
บัฟเฟอร์ที่ลืมคืนเพียงหนึ่งรายการมักไม่สร้างปัญหา แต่ การรั่วไหลภายในลูปจะใช้หน่วยความจำ GPU จนหมดอย่างรวดเร็ว และทำให้การจองใหม่เริ่มล้มเหลว
ทุก Malloc ต้องมี Free
วิธีแก้คือมีวินัยง่าย ๆ: สำหรับ cudaMalloc แต่ละครั้ง ให้เขียน cudaFree ที่ตรงกันก่อนตัวชี้จะพ้นขอบเขต
cudaMalloc(&d_a, bytes);
// ... use it ...
cudaFree(d_a);คืนพื้นที่สองครั้งคือบั๊ก
การเรียก cudaFree กับตัวชี้เดิมซ้ำอีกครั้งเรียกว่า การคืนพื้นที่ซ้ำ ซึ่งทำให้ตัวจัดสรรหน่วยความจำเสียหายและมักทำให้โปรแกรมหยุดทำงาน 💥
ตั้งค่าเป็นค่าว่างหลังคืนพื้นที่
ตั้งค่าตัวชี้เป็น nullptr ทันทีหลัง cudaFree การคืนพื้นที่ nullptr ครั้งที่สองไม่ก่อให้เกิดอันตราย จึงช่วยป้องกันการคืนพื้นที่ซ้ำ
cudaFree(d_a);
d_a = nullptr;การคืนพื้นที่ nullptr ปลอดภัย
CUDA กำหนดให้ cudaFree(nullptr) เป็นการไม่ทำงานที่ไม่ก่อให้เกิดอันตราย นี่คือเหตุผลที่การตั้งตัวชี้เป็นค่าว่างหลังคืนพื้นที่เป็นนิสัยที่เชื่อถือได้
ตัวชี้ลอยตัวสร้างปัญหา
หลังจาก cudaFree แอดเดรสเดิมจะกลายเป็น ตัวชี้ลอยตัว การใช้มันในเคอร์เนลจะอ่านหน่วยความจำที่ไม่ได้เป็นของคุณอีกต่อไป
ระวังการคืนค่าก่อนกำหนด
ข้อผิดพลาดที่ทำให้คืนค่าก่อนกำหนดอาจข้ามขั้นตอนการล้างข้อมูลและทำให้เกิดการรั่วไหล ให้คืนพื้นที่บัฟเฟอร์ใน ทุกเส้นทางออก ไม่ใช่เฉพาะเส้นทางปกติ
จับคู่อายุการใช้งานของการจองพื้นที่
จองพื้นที่ให้ช้าที่สุดเท่าที่ทำได้ และคืนพื้นที่ทันทีที่ใช้งานเสร็จ อายุการใช้งานที่สั้นลงช่วยลดช่วงเวลาที่การรั่วไหลจะแอบซ่อนอยู่
ให้ RAII คืนพื้นที่แทนคุณ
ตัวห่อหุ้มขนาดเล็กที่คืนพื้นที่ในตัวทำลายจะนำ RAII มาใช้กับหน่วยความจำอุปกรณ์ ทำให้ล้างข้อมูลโดยอัตโนมัติเมื่อขอบเขตสิ้นสุด 🧰
เครื่องมือช่วยตรวจจับส่วนที่เหลือ
เมื่อวินัยบกพร่อง คอมพิวต์-แซนิไทเซอร์จะรายงานการรั่วไหลและการคืนพื้นที่ที่ไม่ถูกต้อง ควรเรียกใช้เป็นประจำเพื่อรักษาความสะอาดของการจัดการหน่วยความจำ
ตรวจสอบอย่างรวดเร็ว
มาดูกันว่าจะป้องกันการคืนพื้นที่ซ้ำได้อย่างไร
สรุปทบทวน
คุณได้เรียนรู้ให้จับคู่ cudaMalloc ทุกครั้งกับ cudaFree หนึ่งครั้ง ตั้งตัวชี้เป็นค่าว่างภายหลัง คืนพื้นที่ในทุกเส้นทาง และพึ่งพา ตัวตรวจสอบเพื่อดักจับข้อผิดพลาด 🎉
เรียนรู้ C++ ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 30
- บทเรียน
- 120
คำถามที่พบบ่อย
บทเรียน “หลีกเลี่ยงหน่วยความจำรั่วและการคืนซ้ำ” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “หลีกเลี่ยงหน่วยความจำรั่วและการคืนซ้ำ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส CUDA Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส CUDA Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “หลีกเลี่ยงหน่วยความจำรั่วและการคืนซ้ำ”
จัดการช่วงอายุการจองหน่วยความจำอย่างมีวินัย คุณปฏิบัติ CUDA Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน CUDA Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน CUDA Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “หลีกเลี่ยงหน่วยความจำรั่วและการคืนซ้ำ” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน CUDA Academy นี้ได้ไหม
ได้ บทเรียน CUDA Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- cudaMalloc และ cudaFree
- พอยน์เตอร์ไปยังหน่วยความจำ GPU
- เริ่มต้นข้อมูลด้วย cudaMemset
- หลีกเลี่ยงหน่วยความจำรั่วและการคืนซ้ำ