สูตรดัชนีแบบคลาสสิก
blockIdx.x * blockDim.x + threadIdx.x
สูตรดัชนีแบบคลาสสิก เป็นบทเรียน CUDA Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน CUDA Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส CUDA Academy มีบทเรียนทั้งหมด 4 บทเรียน
หนึ่งเธรดต่อหนึ่งองค์ประกอบ
จุดประสงค์ทั้งหมดของเคอร์เนล CUDA คือให้เธรดแต่ละเธรดจัดการข้อมูลหนึ่งส่วน เพื่อทำเช่นนั้น เธรดแต่ละเธรดจึงต้องมี ดัชนีสากลที่ไม่ซ้ำกัน
เหตุใดรหัสเฉพาะที่จึงไม่เพียงพอ
ภายในบล็อก threadIdx.x จะนับตั้งแต่ 0 ถึง blockDim ลบหนึ่งเท่านั้น หลายบล็อกใช้ตัวเลขเล็ก ๆ ชุดเดียวกันซ้ำ จึงไม่สามารถใช้เป็นดัชนีสุดท้ายได้
บล็อกวางต่อกัน
ลองนึกภาพกริดเป็นบล็อกที่วางต่อกันเป็นแถว แต่ละบล็อกเป็นเจ้าของช่วงต่อเนื่องของอาร์เรย์ และ blockIdx.x จะบอกว่าคุณอยู่ในช่วงใด
บล็อกกว้างเท่าใด
blockDim.x คือจำนวนเธรดต่อบล็อก ซึ่งเป็นความกว้างของแต่ละช่วง จึงใช้ปรับขนาดระยะเลื่อนของบล็อกให้ไปอยู่ในตำแหน่งที่ถูกต้อง
สูตรมาตรฐาน
นำทั้งสามค่ามารวมกัน: ข้ามบล็อกก่อนหน้าไปก่อน แล้วบวกตำแหน่งของคุณภายในบล็อกนี้ บรรทัดเดียวนี้จะให้ดัชนีที่ ไม่ซ้ำกันแก่เธรดทุกเธรด
int i = blockIdx.x * blockDim.x + threadIdx.x;ลองไล่ดูทีละขั้น
เมื่อมี 4 เธรดต่อบล็อก บล็อก 0 ครอบคลุม 0 ถึง 3 บล็อก 1 ครอบคลุม 4 ถึง 7 และบล็อก 2 ครอบคลุม 8 ถึง 11 ระยะเลื่อนจะไม่ทับซ้อนกัน
ตัวอย่างที่ชัดเจน
เธรดที่ 2 ในบล็อก 3 เมื่อ blockDim เท่ากับ 256 จะอยู่ที่ 3 คูณ 256 บวก 2 ซึ่งเท่ากับ 770 นั่นคือ ตำแหน่งสากลของเธรดในข้อมูล
// blockIdx.x=3, blockDim.x=256, threadIdx.x=2
int i = 3 * 256 + 2; // i == 770การใช้ดัชนี
เมื่อมี i แล้ว ให้ใช้ i เป็นตัวห้อยของอาร์เรย์ เธรดแต่ละเธรดจะอ่านและเขียนเฉพาะองค์ประกอบของตนเอง โดยไม่ทับซ้อนกัน
out[i] = a[i] + b[i];จับคู่แบบหนึ่งต่อหนึ่ง
เมื่อเริ่มทำงานด้วย n เธรด สูตรจะสร้างค่าทุกค่าตั้งแต่ 0 ถึง n ลบหนึ่งได้เพียงครั้งเดียวพอดี นี่คือการครอบคลุมอาร์เรย์แบบ หนึ่งต่อหนึ่งอย่างสมบูรณ์
ลำดับมีความสำคัญ
ให้คูณก่อนบวกเสมอ blockIdx.x * blockDim.x คือจุดเริ่มต้นของช่วงของคุณ ส่วน threadIdx.x คือระยะภายในช่วงนั้น
นอกเหนือจากหนึ่งมิติ
แนวคิดเดียวกันนี้ขยายไปยัง 2 มิติและ 3 มิติได้โดยใช้สมาชิก .y และ .z แต่สำหรับอาร์เรย์แบบแบน สูตร .x ก็เพียงพอแล้ว 🚀
ตรวจสอบอย่างรวดเร็ว
คำนวณดัชนีสากลของเธรดหนึ่งเธรด
สรุป
คุณได้เรียนรู้สูตรที่เคอร์เนลทุกตัวใช้แล้ว: blockIdx.x * blockDim.x + threadIdx.x สูตรนี้กำหนดช่องที่ไม่ซ้ำกันหนึ่งช่องในอาร์เรย์ให้เธรดแต่ละเธรด 🎉
คำถามที่พบบ่อย
บทเรียน “สูตรดัชนีแบบคลาสสิก” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “สูตรดัชนีแบบคลาสสิก” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส CUDA Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส CUDA Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “สูตรดัชนีแบบคลาสสิก”
blockIdx.x * blockDim.x + threadIdx.x คุณปฏิบัติ CUDA Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน CUDA Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน CUDA Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “สูตรดัชนีแบบคลาสสิก” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน CUDA Academy นี้ได้ไหม
ได้ บทเรียน CUDA Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- สูตรดัชนีแบบคลาสสิก
- ป้องกันดัชนีเกินช่วง
- ปัดจำนวนบล็อกขึ้น
- ลูปแบบก้าวตามกริด