การอ่านแบบรวมกลุ่มเทียบกับแบบมีระยะก้าว
ดูว่าการจับคู่เธรดกับแอดเดรสมีความสำคัญอย่างไร
การอ่านแบบรวมกลุ่มเทียบกับแบบมีระยะก้าว เป็นบทเรียน CUDA Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน CUDA Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส CUDA Academy มีบทเรียนทั้งหมด 4 บทเรียน
ทุกอย่างขึ้นอยู่กับการจับคู่ตำแหน่ง
การรวมการเข้าถึงขึ้นอยู่กับว่าแต่ละเธรดแตะที่อยู่ใด การแมปจาก เธรดไปยังที่อยู่ เป็นตัวตัดสินว่าธุรกรรมเดียวจะให้บริการทั้งวาร์ปได้หรือไม่
รูปแบบการเข้าถึงแบบรวม
เมื่อเธรดที่อยู่ติดกันอ่านที่อยู่ที่อยู่ติดกัน วาร์ปจะครอบคลุมช่วงที่ต่อเนื่องกันหนึ่งช่วง การจัดวางที่เป็นระเบียบนี้เรียกว่าการเข้าถึงแบบ รวม
int i = blockIdx.x * blockDim.x + threadIdx.x;
float v = data[i];เหตุผลที่รูปแบบนี้มีประสิทธิภาพ
เธรด 0 เข้าถึงดัชนี 0 เธรด 1 เข้าถึงดัชนี 1 และต่อไปเรื่อย ๆ ที่อยู่ทั้ง 32 แห่งอยู่ในบรรทัดที่จัดแนวเดียวกัน ดังนั้น GPU จึงต้องใช้ธุรกรรมเดียว
เริ่มใช้ระยะก้าว
ระยะก้าวคือช่องว่างคงที่ระหว่างที่อยู่ที่เธรดต่อเนื่องกันแตะเข้าถึง ทันทีที่ช่องว่างนี้มากกว่าหนึ่งองค์ประกอบ การรวมการเข้าถึงก็จะเริ่มเสียประสิทธิภาพ
float v = data[i * stride];การอ่านแบบมีระยะก้าวกระจายออก
เมื่อระยะก้าวเท่ากับ 2 เธรด 0 จะอ่าน 0 เธรด 1 จะอ่าน 2 และเธรด 2 จะอ่าน 4 ตอนนี้วาร์ปครอบคลุมหน่วยความจำกว้างขึ้นเป็นสองเท่า จึงต้องใช้ธุรกรรมมากขึ้น
ต้นทุนเพิ่มขึ้นตามขนาด
เมื่อเพิ่มระยะก้าวเป็นสองเท่า จำนวนบรรทัดที่แตะเข้าถึงก็จะเพิ่มขึ้นประมาณสองเท่า ระยะก้าวขนาดใหญ่อาจทำให้วาร์ปต้องใช้ธุรกรรมจำนวนมาก ทั้งที่ใช้เพียงส่วนเล็ก ๆ ของแต่ละบรรทัด
กับดักที่พบบ่อย
การให้แต่ละเธรดรับผิดชอบทั้งคอลัมน์ของเมทริกซ์แบบจัดเก็บตามแถวจะสร้างระยะก้าวขนาดใหญ่ โค้ดดูเป็นระเบียบ แต่กลับทำให้ทุกวาร์ปกระจายการเข้าถึงโดยไม่รู้ตัว
float v = matrix[threadIdx.x * width + row];สลับการแมป
บ่อยครั้งวิธีแก้มีเพียงการสลับว่าดัชนีใดเปลี่ยนเร็วที่สุดตามเธรด ให้เธรดที่ต่อเนื่องกันเดินผ่านหน่วยความจำที่ต่อเนื่องกัน แล้วการอ่านก็จะรวมกันอีกครั้ง
float v = matrix[row * width + threadIdx.x];ออฟเซ็ตก็ส่งผลเสียเช่นกัน
แม้รูปแบบจะรวมกันได้ดี ก็ยังเสียประสิทธิภาพหากเริ่มต้นกลางบรรทัด ออฟเซ็ตที่ไม่จัดแนวจะเลื่อนวาร์ปให้ข้ามขอบเขต ทำให้การอ่านหนึ่งครั้งต้องแบ่งเป็นสองครั้ง
คิดเป็นวาร์ป
เมื่อต้องประเมินรูปแบบ อย่านึกภาพเพียงเธรดเดียว ให้นึกถึงเลนทั้ง 32 เลนพร้อมกัน แล้วถามว่าที่อยู่ของพวกมันครอบคลุมกี่บรรทัดโดยรวม 🔍
กฎง่าย ๆ ที่ใช้ได้จริง
กำหนดให้ดัชนีที่เปลี่ยนเร็วที่สุดเดินตาม threadIdx.x นิสัยเพียงอย่างเดียวนี้จะช่วยให้การอ่านหน่วยความจำส่วนกลางส่วนใหญ่ของคุณรวมกันได้โดยแทบไม่ต้องทำอะไรเพิ่ม
ตรวจสอบอย่างรวดเร็ว
เลือกรูปแบบการเข้าถึงที่รวมกันได้ดีที่สุด
สรุปทบทวน
คุณได้เห็นแล้วว่าการอ่านแบบรวมกันทำให้ข้อมูลที่อยู่ใกล้กันยังอยู่ใกล้กัน ขณะที่ระยะก้าวทำให้ข้อมูลกระจายข้ามบรรทัด ให้ threadIdx.x เป็นตัวขับดัชนีที่เปลี่ยนเร็วที่สุด 🎉
เรียนรู้ 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 ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “การอ่านแบบรวมกลุ่มเทียบกับแบบมีระยะก้าว” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน CUDA Academy นี้ได้ไหม
ได้ บทเรียน CUDA Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ธุรกรรมหน่วยความจำคืออะไร
- การอ่านแบบรวมกลุ่มเทียบกับแบบมีระยะก้าว
- โครงสร้างอาร์เรย์เทียบกับอาร์เรย์ของโครงสร้าง
- วัดแบนด์วิดท์ที่ใช้งานได้จริง