CUDA Academy · บทเรียน

การอ่านแบบรวมกลุ่มเทียบกับแบบมีระยะก้าว

ดูว่าการจับคู่เธรดกับแอดเดรสมีความสำคัญอย่างไร

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

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

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

  1. ธุรกรรมหน่วยความจำคืออะไร
  2. การอ่านแบบรวมกลุ่มเทียบกับแบบมีระยะก้าว
  3. โครงสร้างอาร์เรย์เทียบกับอาร์เรย์ของโครงสร้าง
  4. วัดแบนด์วิดท์ที่ใช้งานได้จริง
← กลับไปที่ CUDA Academy