CUDA Academy · บทเรียน

เคอร์เนลบวกเวกเตอร์

เธรดหนึ่งตัวบวกสมาชิกหนึ่งคู่

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

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

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

  1. เคอร์เนลบวกเวกเตอร์
  2. เชื่อมต่อส่วนโฮสต์
  3. ตรวจสอบผลลัพธ์บน CPU
  4. จับเวลาการเพิ่มความเร็วครั้งแรก
← กลับไปที่ CUDA Academy