CUDA Academy · บทเรียน

หลีกเลี่ยงหน่วยความจำรั่วและการคืนซ้ำ

จัดการช่วงอายุการจองหน่วยความจำอย่างมีวินัย

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

หลีกเลี่ยงหน่วยความจำรั่วและการคืนซ้ำ เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. cudaMalloc และ cudaFree
  2. พอยน์เตอร์ไปยังหน่วยความจำ GPU
  3. เริ่มต้นข้อมูลด้วย cudaMemset
  4. หลีกเลี่ยงหน่วยความจำรั่วและการคืนซ้ำ
← กลับไปที่ CUDA Academy