หน่วยความจำร่วมแบบไดนามิก
กำหนดขนาดหน่วยความจำร่วมขณะเรียกใช้
หน่วยความจำร่วมแบบไดนามิก เป็นบทเรียน CUDA Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน CUDA Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส CUDA Academy มีบทเรียนทั้งหมด 4 บทเรียน
เมื่อยังไม่ทราบขนาด
บางครั้งขนาดอาร์เรย์ในหน่วยความจำร่วมขึ้นอยู่กับค่าขณะทำงาน จึงกำหนดขนาดตายตัวในโค้ดไม่ได้ CUDA แก้ปัญหานี้ด้วยหน่วยความจำร่วมแบบไดนามิก
การประกาศ extern
คุณประกาศสิ่งนี้ด้วย extern __shared__ และวงเล็บเหลี่ยมว่างเปล่า จะไม่มีการระบุขนาดในโค้ด ทำให้คอมไพเลอร์เว้นขนาดไว้
extern __shared__ float sdata[];กำหนดขนาดตอนเรียกใช้
คุณส่งจำนวนไบต์เป็นพารามิเตอร์ตัวที่สามของการเรียกใช้ โดยอยู่ระหว่างจำนวนเธรดกับวงเล็บปิด วิธีนี้จะกำหนดขนาดขณะทำงาน
kern<<<blocks, threads, n * sizeof(float)>>>();เป็นหน่วยไบต์เสมอ
ข้อผิดพลาดที่พบบ่อยคือ อาร์กิวเมนต์ตัวที่สามมีขนาดเป็นไบต์ ไม่ใช่จำนวนสมาชิก ให้คูณจำนวนสมาชิกด้วย sizeof เสมอเพื่อให้ได้ค่าที่ถูกต้อง
ค่าเริ่มต้นคือศูนย์ไบต์
หากไม่ระบุอาร์กิวเมนต์ตัวที่สาม CUDA จะจองหน่วยความจำร่วมแบบไดนามิกศูนย์ไบต์ การอ่าน sdata หลังจากนั้นจึงมีพฤติกรรมที่ไม่กำหนด ดังนั้นอย่าลืมระบุค่า
ใช้แบบคงที่และแบบไดนามิกร่วมกัน
คุณสามารถใช้ทั้งสองชนิดในเคอร์เนลเดียวกันได้ อาร์เรย์แบบคงที่จะมีขนาดตายตัว ส่วนบล็อกแบบไดนามิกจะปรับตามอาร์กิวเมนต์ตอนเรียกใช้
บัฟเฟอร์เดียว หลายอาร์เรย์
หน่วยความจำร่วมแบบไดนามิกให้บัฟเฟอร์แบนเพียงหนึ่งบัฟเฟอร์ หากต้องการเก็บหลายอาร์เรย์ คุณต้องแบ่งพื้นที่ด้วยตัวชี้และออฟเซ็ตด้วยตนเอง 🔪
แบ่งพื้นที่ด้วยออฟเซ็ต
ให้ตัวชี้ของอาร์เรย์ที่สองชี้ไปยังตำแหน่งหนึ่งภายในบัฟเฟอร์ เพียงระวังให้จัดแนวแต่ละส่วนอย่างถูกต้อง เพื่อไม่ให้ค่า float เริ่มต้นกลางคำข้อมูล
extern __shared__ float buf[];
float* a = buf;
float* b = &buf[blockDim.x];เหตุใดจึงควรใช้แบบไดนามิก
วิธีนี้ทำให้เคอร์เนลที่คอมไพล์แล้วหนึ่งชุดรองรับขนาดไทล์ได้หลายแบบ คุณปรับขนาดหน่วยความจำร่วมในแต่ละครั้งที่เรียกใช้ได้ โดยไม่ต้องคอมไพล์ใหม่สำหรับแต่ละกรณี
ระวังขีดจำกัดฮาร์ดแวร์
คุณยังคงใช้เกินค่าสูงสุดต่อบล็อกไม่ได้ หากขอไบต์มากเกินไปตอนเรียกใช้ เคอร์เนลจะเริ่มทำงานไม่ได้
เปิดใช้การจองขนาดใหญ่
หากต้องการเกินขีดจำกัดเริ่มต้นบน GPU รุ่นใหม่ คุณต้องเลือกเปิดใช้ด้วย cudaFuncSetAttribute ก่อนเรียกใช้ มิฉะนั้นคำขอขนาดใหญ่จะถูกปฏิเสธ
ตรวจสอบอย่างรวดเร็ว
มาดูกันว่ากำหนดขนาดหน่วยความจำร่วมแบบไดนามิกอย่างไร
สรุปทบทวน
คุณได้เรียนรู้ว่าอาร์เรย์ extern __shared__ จะได้รับขนาดเป็นไบต์ตอนเรียกใช้ สามารถแบ่งเป็นหลายอาร์เรย์ และต้องไม่เกินขีดจำกัดต่อบล็อก เรียนจบหลักสูตรแล้ว! 🎉
เรียนรู้ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ประกาศอาร์เรย์ __shared__
- ซิงโครไนซ์ด้วย __syncthreads
- หลีกเลี่ยงความขัดแย้งของแบงก์
- หน่วยความจำร่วมแบบไดนามิก