CUDA Academy · บทเรียน

printf ภายในเคอร์เนล

ดูเอาต์พุตจากเธรดบนอุปกรณ์

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

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

การแสดงผลจาก GPU

เชื่อหรือไม่ว่า คุณสามารถเรียก printf ได้โดยตรงภายในเคอร์เนล นี่เป็นวิธีที่ง่ายที่สุดในการดูว่าเธรดกำลังทำอะไรอยู่ 👀

__global__ void hi() {
    printf("Hello from the GPU\n");
}

ทุกเธรดจะแสดงผล

โปรดจำไว้ว่าเคอร์เนลทำงานในทุกเธรด ดังนั้นบรรทัด printf เพียงบรรทัดเดียวจะทำงานหนึ่งครั้งต่อหนึ่งเธรด หากเรียกใช้งาน 256 เธรด คุณจะได้ผลลัพธ์ 256 บรรทัด

hi<<<1, 256>>>(); // 256 hellos

ระบุเธรดแต่ละตัว

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

printf("thread %d\n", threadIdx.x);

ลำดับผลลัพธ์ไม่ตายตัว

เธรดทำงานแบบขนาน ดังนั้นลำดับการแสดงผลจึงคาดเดาไม่ได้ อย่าพึ่งพาว่าบรรทัดต่าง ๆ จะมาถึงตามลำดับดัชนี

สตริงรูปแบบใช้งานได้

printf ของอุปกรณ์รองรับตัวระบุรูปแบบทั่วไป เช่น %d, %f และ %s เช่นเดียวกับ printf ของโฮสต์

printf("i=%d val=%f\n", i, x[i]);

ผลลัพธ์จะไปอยู่ในบัฟเฟอร์

ผลลัพธ์จากอุปกรณ์จะถูกเก็บไว้ในบัฟเฟอร์ของ GPU ก่อน แล้วจึงส่งไปยังคอนโซลภายหลัง ไม่ใช่ทันทีที่ printf ทำงาน ซึ่งเป็นพฤติกรรมปกติ

ต้องรอจึงจะเห็นผลลัพธ์

เนื่องจากการเรียกใช้งานเป็นแบบอะซิงโครนัส คุณจะยังไม่เห็นผลลัพธ์จนกว่า GPU จะทำงานเสร็จ ให้เรียก cudaDeviceSynchronize เพื่อส่งผลลัพธ์ออกจากบัฟเฟอร์

hi<<<1, 4>>>();
cudaDeviceSynchronize();

จำกัดการแสดงผลที่มีปริมาณมาก

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

if (threadIdx.x == 0) printf("block done\n");

เหมาะสำหรับการแก้ไขข้อผิดพลาดอย่างรวดเร็ว

printf เป็นเครื่องมือแก้ไขข้อผิดพลาดที่เร็วที่สุดของคุณ แทรกไว้เพื่อตรวจสอบดัชนีหรือค่า ยืนยันข้อผิดพลาด แล้วลบออก

printf("i=%d should be < n=%d\n", i, n);

ทำให้เคอร์เนลช้าลง

การแสดงผลจำนวนมากส่งผลเสียต่อประสิทธิภาพอย่างมาก ใช้เพื่อค้นหาปัญหา แล้วลบออกก่อนวัดความเร็วจริง

GPU รุ่นเก่าอาจแตกต่างกัน

printf ของอุปกรณ์ต้องใช้ความสามารถด้านการประมวลผลที่ค่อนข้างใหม่ (2.0 ขึ้นไป) GPU รุ่นปัจจุบันเกือบทั้งหมดรองรับได้เป็นอย่างดี

ตรวจสอบอย่างรวดเร็ว

ตรวจสอบความเข้าใจของคุณเกี่ยวกับ printf ของอุปกรณ์

สรุป: printf ของเคอร์เนล

ใช้ printf เพื่อดูการทำงานภายในเธรด เพิ่ม threadIdx เพื่อแยกแยะเธรด ซิงโครไนซ์เพื่อส่งผลลัพธ์ออกจากบัฟเฟอร์ และลบออกก่อนจับเวลา เครื่องมือมีประโยชน์มาก! 🎉

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

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

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

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

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

บทเรียน “printf ภายในเคอร์เนล” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “printf ภายในเคอร์เนล”

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

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

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

บทเรียน “printf ภายในเคอร์เนล” ใช้เวลานานแค่ไหน

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

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

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

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

  1. โครงสร้างของเคอร์เนล
  2. การเรียกใช้ด้วยวงเล็บมุมสามชั้น
  3. printf ภายในเคอร์เนล
  4. อธิบาย cudaDeviceSynchronize
← กลับไปที่ CUDA Academy