CUDA Academy · บทเรียน

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

ดาวน์โหลดผลลัพธ์กลับมายัง CPU

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

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

นำผลลัพธ์กลับมา

เคอร์เนลของคุณเพิ่งเติมคำตอบลงในบัฟเฟอร์ของอุปกรณ์ แต่ CPU ไม่สามารถอ่านหน่วยความจำ GPU ได้โดยตรง คุณต้อง ดาวน์โหลด ผลลัพธ์กลับมา 📥

ทิศทางการดาวน์โหลด

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

cudaMemcpy(h_c, d_c, bytes, cudaMemcpyDeviceToHost);

ปลายทางยังคงอยู่ก่อน

กฎนี้ไม่เคยเปลี่ยน: อาร์กิวเมนต์ ปลายทาง มาก่อน แล้วจึงเป็นต้นทาง สำหรับการดาวน์โหลด ตัวชี้โฮสต์จะอยู่ด้านหน้า

cudaMemcpy(h_dst, d_src, bytes, cudaMemcpyDeviceToHost);

บัฟเฟอร์โฮสต์ต้องมีอยู่

ปลายทางต้องมีหน่วยความจำ CPU จริงรอรับข้อมูลอยู่ จัดสรรพื้นที่บน โฮสต์ ด้วย malloc หรือ new ก่อนคัดลอกข้อมูลกลับ

float* h_c = (float*)malloc(bytes);

รอให้เคอร์เนลทำงานเสร็จ

cudaMemcpy แบบบล็อกจะรอการทำงานก่อนหน้าในสตรีมเริ่มต้น ดังนั้น เคอร์เนล จะทำงานเสร็จก่อนที่จะอ่านผลลัพธ์ใด ๆ

myKernel<<<blocks, threads>>>(d_c, n);
cudaMemcpy(h_c, d_c, bytes, cudaMemcpyDeviceToHost);

จำนวนไบต์เท่าเดิม

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

size_t bytes = n * sizeof(float);

ตอนนี้คุณอ่านข้อมูลได้แล้ว

เมื่อการคัดลอกเสร็จสิ้น ค่าเหล่านั้นจะอยู่ในหน่วยความจำ CPU ปกติ คุณสามารถพิมพ์ ตรวจสอบ หรือบันทึกค่าได้เหมือนอาร์เรย์ โฮสต์ ทั่วไป

printf("%f\n", h_c[0]);

การเดินทางไปกลับ

งาน GPU ที่สมบูรณ์คือการ เดินทางไปกลับ: อัปโหลดอินพุต เรียกใช้เคอร์เนล แล้วดาวน์โหลดเอาต์พุตกลับมา แต่ละช่วงใช้ cudaMemcpy

ตรวจสอบก่อนเชื่อถือผลลัพธ์

หลังดาวน์โหลด ให้เปรียบเทียบผลลัพธ์จาก GPU กับผลอ้างอิงที่คำนวณอย่างรวดเร็วบน CPU การตรวจสอบช่วยจับ ข้อผิดพลาด ก่อนที่จะลุกลาม ✅

คืนหน่วยความจำที่จัดสรรไว้

เมื่อผลลัพธ์กลับมาแล้ว ให้คืนหน่วยความจำทั้งสองฝั่ง: ใช้ cudaFree กับบัฟเฟอร์ของอุปกรณ์ และคืนบัฟเฟอร์ของโฮสต์เพื่อป้องกันหน่วยความจำรั่ว

cudaFree(d_c);
free(h_c);

การดาวน์โหลดก็ใช้เวลาเช่นกัน

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

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

เคอร์เนลของคุณเขียนผลลัพธ์ลงในบัฟเฟอร์อุปกรณ์ d_c แล้วจะอ่านผลลัพธ์เหล่านั้นบน CPU ได้อย่างไร

สรุปทบทวน

คุณได้เรียนรู้การเดินทางกลับด้วย cudaMemcpyDeviceToHost: จัดสรรพื้นที่บนโฮสต์ วางตัวชี้โฮสต์ไว้ก่อน รอเคอร์เนล แล้วตรวจสอบและคืนหน่วยความจำ 🎉

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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