CUDA Academy · บทเรียน

หน่วยความจำร่วมแบบไดนามิก

กำหนดขนาดหน่วยความจำร่วมขณะเรียกใช้

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

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

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

  1. ประกาศอาร์เรย์ __shared__
  2. ซิงโครไนซ์ด้วย __syncthreads
  3. หลีกเลี่ยงความขัดแย้งของแบงก์
  4. หน่วยความจำร่วมแบบไดนามิก
← กลับไปที่ CUDA Academy