CUDA Academy · บทเรียน

โครงสร้างอาร์เรย์เทียบกับอาร์เรย์ของโครงสร้าง

เลือกการจัดวางที่ทำให้การเข้าถึงรวมกลุ่ม

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

โครงสร้างอาร์เรย์เทียบกับอาร์เรย์ของโครงสร้าง เป็นบทเรียน CUDA Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน CUDA Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส CUDA Academy มีบทเรียนทั้งหมด 4 บทเรียน

สองวิธีในการจัดเก็บระเบียน

สมมติว่าอนุภาคแต่ละรายการมีค่า x, y และ z คุณสามารถเก็บค่าเหล่านี้ไว้ด้วยกันหรือแยกออกจากกันก็ได้ และตัวเลือกนี้จะเปลี่ยนวิธีที่ทุกวาร์ปรวมการเข้าถึง

อาร์เรย์ของโครงสร้าง

การจัดวางตามธรรมชาติของ C++ จะบรรจุฟิลด์ของแต่ละระเบียนไว้ติดกัน นี่คืออาร์เรย์ของโครงสร้างซึ่งมักย่อว่า AoS

struct Particle { float x, y, z; };
Particle p[N];

เหตุใด AoS จึงกระจายการเข้าถึง

เมื่อวาร์ปอ่านเฉพาะค่า x จากแต่ละระเบียน ค่า x จะอยู่ห่างกัน 12 ไบต์ ระยะก้าวที่ติดมากับการจัดวางนี้ทำให้พื้นที่ส่วนใหญ่ของแต่ละบรรทัดที่ดึงมาเสียเปล่า

float xi = p[i].x; // x values are spaced by sizeof(Particle)

โครงสร้างของอาร์เรย์

ลองสลับรูปแบบ: เก็บค่า x ทั้งหมดไว้ด้วยกัน ค่า y ทั้งหมดไว้ด้วยกัน และค่า z ทั้งหมดไว้ด้วยกัน นี่คือโครงสร้างของอาร์เรย์ หรือ SoA

float x[N];
float y[N];
float z[N];

เหตุใด SoA จึงรวมการเข้าถึงได้ดี

ตอนนี้การอ่านค่า x สำหรับ 32 เธรดจะแตะค่าจุดลอยตัว 32 ค่าที่ต่อเนื่องกัน นั่นคือบรรทัดเดียวที่จัดแนว และธุรกรรมเดียวที่เป็นระเบียบสำหรับแต่ละฟิลด์

float xi = x[i]; // neighbors land in one line

การทดสอบการเข้าถึงฟิลด์

ลองถามว่าเคอร์เนลของคุณอ่านข้อมูลอย่างไร หากเธรดไล่อ่านฟิลด์เดียวจากระเบียนจำนวนมาก SoA แทบจะมีประสิทธิภาพเหนือกว่าเสมอบน GPU

กรณีที่ AoS ก็เหมาะสม

หากแต่ละเธรดใช้ฟิลด์ทั้งหมดของระเบียนร่วมกัน AoS จะเก็บฟิลด์เหล่านั้นไว้ในบรรทัดเดียว และยังเหมาะกับแคช

แบนด์วิดท์ ไม่ใช่แค่รูปแบบ

ประเด็นนี้ไม่ใช่เรื่องความชอบ การเปลี่ยนจาก AoS เป็น SoA อาจเพิ่มอัตรารับส่งข้อมูลจริงได้หลายเท่าสำหรับการคำนวณแบบเดิม เพียงลดไบต์ที่สูญเปล่า

ทางเลือกแบบผสม

คุณสามารถจัดกลุ่มระเบียนจำนวนหนึ่ง แล้วแยกฟิลด์ภายในแต่ละกลุ่มได้ การจัดวางแบบAoSoAนี้สร้างสมดุลระหว่างการรวมการเข้าถึงกับความใกล้กันของข้อมูลในแคช

ออกแบบก่อนปรับประสิทธิภาพ

การเปลี่ยนรูปแบบการจัดวางภายหลังทำได้ยาก เพราะกระทบเคอร์เนลและการคัดลอกทั้งหมด เลือกรูปแบบ SoA หรือ AoS ตั้งแต่เนิ่น ๆ โดยพิจารณาจากรูปแบบการเข้าถึง 🧩

การแมปที่ควรจำ

กฎง่าย ๆ สำหรับ GPU: แยกฟิลด์เป็นอาร์เรย์ เพื่อให้แต่ละวาร์ปอ่านช่วงข้อมูลที่ต่อเนื่องกัน เลือกใช้ SoA สำหรับเคอร์เนลที่ประมวลผลทีละฟิลด์

ตรวจสอบอย่างรวดเร็ว

เลือกรูปแบบการจัดวางที่รวมการเข้าถึงรูปแบบนี้ได้

สรุปทบทวน

คุณได้เปรียบเทียบ AoS กับ SoA แล้ว: ให้เก็บฟิลด์ไว้ด้วยกันเมื่อใช้ข้อมูลทั้งระเบียน แต่ให้แยกเป็นอาร์เรย์เมื่อวาร์ปไล่อ่านฟิลด์เดียวทีละรายการ 🎉

เริ่มต้นได้ฟรี

เรียนรู้ 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 ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “โครงสร้างอาร์เรย์เทียบกับอาร์เรย์ของโครงสร้าง” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน CUDA Academy นี้ได้ไหม

ได้ บทเรียน CUDA Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

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