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