เคอร์เนลบวกเวกเตอร์
เธรดหนึ่งตัวบวกสมาชิกหนึ่งคู่
เคอร์เนลบวกเวกเตอร์ เป็นบทเรียน CUDA Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน CUDA Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส CUDA Academy มีบทเรียนทั้งหมด 4 บทเรียน
แนวคิดสำคัญ
การบวกเวกเตอร์เป็นเคอร์เนลแรกที่เหมาะอย่างยิ่ง: เอาต์พุตแต่ละตัวมีเพียง C[i] = A[i] + B[i] สมาชิกทุกตัว เป็นอิสระต่อกัน จึงทำงานพร้อมกันได้ทั้งหมด 🚀
หนึ่งเธรดต่อหนึ่งสมาชิก
หลักการทั้งหมดเรียบง่ายมาก: กำหนด หนึ่งเธรดให้กับหนึ่งสมาชิก แทนที่จะวนลูปทั่วอาร์เรย์ ให้เธรดหลายพันตัวทำการบวกคนละหนึ่งครั้งพร้อมกัน
ระบุว่าเป็นเคอร์เนล
ฟังก์ชันที่ทำงานบน GPU เรียกว่าเคอร์เนล และระบุด้วยตัวปรับคุณสมบัติ __global__ คำนี้บอก nvcc ว่าโค้ดดังกล่าวจะเปิดใช้งานบนอุปกรณ์
__global__ void vecAdd(const float* A, const float* B, float* C, int n) {
// body comes next
}เคอร์เนลคืนค่าเป็น void
เคอร์เนลมีชนิดค่าที่ส่งคืนเป็น void เสมอ ไม่มีค่าที่จะส่งกลับไปยัง CPU ดังนั้นต้องเขียนผลลัพธ์ลงในหน่วยความจำอุปกรณ์แทน
ค้นหาดัชนีของเธรดนี้
เธรดแต่ละตัวคำนวณ ดัชนีโกลบอล ของตนเอง เพื่อให้รู้ว่าต้องจัดการกับสมาชิกใด สูตรมาตรฐานจะรวมพิกัดของบล็อกและเธรดเข้าด้วยกัน
int i = blockIdx.x * blockDim.x + threadIdx.x;งานหนึ่งบรรทัด
เมื่อเธรดทราบดัชนี i ของตนเองแล้ว งานจริงก็มีเพียงหนึ่งบรรทัด ไม่มีลูป ไม่มีการแตกแขนง มีเพียงการบวกหนึ่งครั้งต่อเธรด
C[i] = A[i] + B[i];เหตุใดการตรวจสอบขอบเขตจึงสำคัญ
โดยทั่วไปคุณจะเปิดใช้เธรดมากกว่าจำนวนสมาชิก ดังนั้นให้เพิ่มเงื่อนไขป้องกัน if (i < n) หากไม่มี เธรดส่วนเกินจะอ่านข้อมูลเลยอาร์เรย์และทำให้โปรแกรมหยุดทำงาน 🛡️
if (i < n) {
C[i] = A[i] + B[i];
}เคอร์เนลฉบับเต็ม
เมื่อนำทุกอย่างมารวมกัน เคอร์เนล vecAdd ทั้งหมดมีเพียงไม่กี่บรรทัด โค้ดเล็กน้อยแต่ทำงานบนเธรดหลายพันตัวพร้อมกัน
__global__ void vecAdd(const float* A, const float* B, float* C, int n) {
int i = blockIdx.x * blockDim.x + threadIdx.x;
if (i < n) C[i] = A[i] + B[i];
}ตัวชี้อยู่บนอุปกรณ์
ตัวชี้ A, B และ C ต้องชี้ไปยัง หน่วยความจำอุปกรณ์ หากส่งตัวชี้โฮสต์ธรรมดาให้เคอร์เนล เคอร์เนลจะอ่านข้อมูลขยะหรือเกิดข้อผิดพลาด
กำหนดอินพุตเป็น const
A และ B มีไว้สำหรับอ่านเท่านั้น จึงควรกำหนดเป็น const float* วิธีนี้บอกเจตนาอย่างชัดเจนและเปิดโอกาสให้คอมไพเลอร์ปรับปรุงการอ่านอินพุตแบบอ่านอย่างเดียวได้มากขึ้น
ไม่จำเป็นต้องใช้สถานะร่วมกัน
เนื่องจากเธรดแต่ละตัวเข้าถึงสมาชิกที่ แตกต่างกัน จึงไม่มีการแย่งชิงข้อมูลและไม่ต้องใช้ล็อก ความเป็นอิสระนี้เองที่ทำให้ GPU เหมาะกับงานนี้
ตรวจสอบความเข้าใจ
เหตุใดเคอร์เนลการบวกเวกเตอร์จึงต้องมีเงื่อนไขป้องกัน if (i < n)
สรุปทบทวน
คุณเขียนเคอร์เนลแรกของตนเองแล้ว: __global__ void vecAdd โดยมีหนึ่งเธรดต่อหนึ่งสมาชิก ดัชนีโกลบอล และการตรวจสอบขอบเขต โค้ดเรียบง่าย แต่ทำงานแบบขนานได้มหาศาล 🎉
เรียนรู้ 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 ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “เคอร์เนลบวกเวกเตอร์” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน CUDA Academy นี้ได้ไหม
ได้ บทเรียน CUDA Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- เคอร์เนลบวกเวกเตอร์
- เชื่อมต่อส่วนโฮสต์
- ตรวจสอบผลลัพธ์บน CPU
- จับเวลาการเพิ่มความเร็วครั้งแรก