CUDA Academy · บทเรียน

ถ่ายโอนข้อมูลจากโฮสต์ไปอุปกรณ์

อัปโหลดข้อมูลเข้าไปยัง GPU

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

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

หน่วยความจำสองแบบ เป้าหมายเดียว

ข้อมูลของคุณเริ่มต้นใน RAM ของโฮสต์ แต่ GPU สามารถคำนวณได้เฉพาะตัวเลขที่อยู่ในหน่วยความจำอุปกรณ์ของตนเอง ก่อนอื่นคุณต้องย้ายข้อมูลข้ามไป 🚚

ทำความรู้จัก cudaMemcpy

ฟังก์ชัน cudaMemcpy เปรียบเสมือนรถส่งของของคุณ: มันคัดลอกกลุ่มไบต์จากแอดเดรสหนึ่งไปยังอีกแอดเดรสหนึ่ง ไม่ว่าจะอยู่บนโฮสต์หรืออุปกรณ์

cudaMemcpy(dst, src, bytes, kind);

ทิศทางการอัปโหลด

สำหรับส่งข้อมูลอินพุตไปยัง GPU ให้ใช้ cudaMemcpyHostToDevice โดยต้นทางคือหน่วยความจำ RAM ของโฮสต์ และปลายทางคือหน่วยความจำของอุปกรณ์

cudaMemcpy(d_a, h_a, n*sizeof(float), cudaMemcpyHostToDevice);

ลำดับอาร์กิวเมนต์มีความสำคัญ

เช่นเดียวกับ memcpy ต้องระบุ ปลายทางก่อน แล้วจึงระบุต้นทาง หากเผลอสลับลำดับ บัฟเฟอร์บน GPU จะยังว่างอยู่ 😬

cudaMemcpy(d_dst, h_src, bytes, cudaMemcpyHostToDevice);

นับเป็นไบต์ ไม่ใช่จำนวนสมาชิก

อาร์กิวเมนต์ขนาดวัดเป็น ไบต์ ดังนั้นให้คูณจำนวนสมาชิกด้วยขนาดของชนิดข้อมูลโดยใช้ sizeof

size_t bytes = n * sizeof(float);

จัดสรรก่อนคัดลอก

ตัวชี้อุปกรณ์ต้องชี้ไปยังหน่วยความจำ GPU จริงอยู่ก่อนแล้ว ให้ใช้ cudaMalloc จัดสรรปลายทางก่อนอัปโหลดข้อมูลลงไปเสมอ

cudaMalloc(&d_a, bytes);
cudaMemcpy(d_a, h_a, bytes, cudaMemcpyHostToDevice);

การรอแบบทำงานพร้อมกัน

cudaMemcpy แบบปกติเป็นการทำงานแบบ บล็อก เธรดของ CPU จะหยุดรอจนกว่าไบต์ทั้งหมดจะถูกส่งไปถึง GPU อย่างปลอดภัย

จากนั้นจึงเรียกใช้เคอร์เนล

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

cudaMemcpy(d_a, h_a, bytes, cudaMemcpyHostToDevice);
myKernel<<<blocks, threads>>>(d_a, n);

ขนาดต้องตรงกัน

ตรวจสอบให้แน่ใจว่าจำนวนไบต์ที่อัปโหลดพอดีกับบัฟเฟอร์ที่จัดสรรไว้ การคัดลอกข้อมูลเกินพื้นที่ที่จองไว้เป็นข้อผิดพลาดแบบ ล้น ที่พบได้บ่อย

ตรวจสอบรหัสผลลัพธ์

cudaMemcpy ส่งคืนค่า cudaError_t ให้ตรวจสอบค่านี้ เพื่อให้ตัวชี้หรือขนาดที่ไม่ถูกต้องแสดงข้อผิดพลาดอย่างชัดเจน แทนที่จะทำให้การทำงานเสียหาย

cudaError_t err = cudaMemcpy(d_a, h_a, bytes, cudaMemcpyHostToDevice);

การคัดลอกไม่ได้ฟรี

การอัปโหลดทุกครั้งต้องเดินทางผ่านบัส PCIe ที่ช้า ดังนั้นให้คัดลอกเฉพาะข้อมูลที่จำเป็นต้องใช้บน อุปกรณ์ จริง ๆ

ตรวจสอบความเข้าใจ

คุณต้องการส่งอาร์เรย์อินพุตจาก RAM ของ CPU ไปยัง GPU ควรใช้การเรียกใด

สรุปทบทวน

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

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

เรียนรู้ C++ ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
30
บทเรียน
120

คำถามที่พบบ่อย

บทเรียน “ถ่ายโอนข้อมูลจากโฮสต์ไปอุปกรณ์” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “ถ่ายโอนข้อมูลจากโฮสต์ไปอุปกรณ์”

อัปโหลดข้อมูลเข้าไปยัง GPU คุณปฏิบัติ CUDA Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน CUDA Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน CUDA Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “ถ่ายโอนข้อมูลจากโฮสต์ไปอุปกรณ์” ใช้เวลานานแค่ไหน

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

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

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

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

  1. ถ่ายโอนข้อมูลจากโฮสต์ไปอุปกรณ์
  2. ถ่ายโอนข้อมูลจากอุปกรณ์ไปโฮสต์
  3. ชนิดแจกแจงทิศทางการคัดลอก
  4. คอขวดการถ่ายโอน PCIe
← กลับไปที่ CUDA Academy