printf ภายในเคอร์เนล
ดูเอาต์พุตจากเธรดบนอุปกรณ์
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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- โครงสร้างของเคอร์เนล
- การเรียกใช้ด้วยวงเล็บมุมสามชั้น
- printf ภายในเคอร์เนล
- อธิบาย cudaDeviceSynchronize