0Pricing
CUDA Academy · บทเรียน

สูตรดัชนีแบบคลาสสิก

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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. สูตรดัชนีแบบคลาสสิก
  2. ป้องกันดัชนีเกินช่วง
  3. ปัดจำนวนบล็อกขึ้น
  4. ลูปแบบก้าวตามกริด
← กลับไปที่ CUDA Academy