ฉันใช้ CUDA มาหลายสัปดาห์แล้ว แต่ฉันมีข้อสงสัยเกี่ยวกับการจัดสรรบล็อก / warps / thread ฉันกำลังศึกษาสถาปัตยกรรมจากมุมมองการสอน (โครงการมหาวิทยาลัย) ดังนั้นการเข้าถึงประสิทธิภาพสูงสุดจึงไม่ใช่สิ่งที่ฉันกังวล
ก่อนอื่นฉันอยากจะเข้าใจถ้าฉันได้รับข้อมูลตรงนี้:
โปรแกรมเมอร์เขียนเคอร์เนลและจัดระเบียบการดำเนินการในกริดของบล็อกเธรด
แต่ละบล็อกถูกกำหนดให้กับ Streaming Multiprocessor (SM) เมื่อกำหนดแล้วจะไม่สามารถโยกย้ายไปยัง SM อื่นได้
SM แต่ละตัวแยกบล็อกของตัวเองออกเป็น Warps (ปัจจุบันมีขนาดสูงสุด 32 เธรด) เธรดทั้งหมดในวิปริตดำเนินการพร้อมกันกับทรัพยากรของ SM
การดำเนินการจริงของเธรดนั้นดำเนินการโดย CUDA Cores ที่อยู่ใน SM ไม่มีการแมปเฉพาะระหว่างเธรดและแกน
ถ้าวาร์ปประกอบด้วยเธรด 20 เธรด แต่ในปัจจุบันมีเพียง 16 คอร์ที่ใช้ได้วิปริตจะไม่ทำงาน
ในทางกลับกันหากบล็อกมี 48 เธรดบล็อกจะถูกแยกออกเป็น 2 วาร์ปและจะดำเนินการควบคู่กันโดยมีหน่วยความจำเพียงพอ
หากเธรดเริ่มทำงานบนคอร์นั้นจะถูกหยุดทำงานเพื่อเข้าถึงหน่วยความจำหรือสำหรับการดำเนินการจุดลอยตัวที่ยาวนาน
พวกเขาถูกต้องหรือไม่
ตอนนี้ฉันมี GeForce 560 Ti ดังนั้นตามข้อกำหนดที่ติดตั้งไว้กับ 8 SM แต่ละตัวมี 48 CUDA แกน (รวม 384 แกน)
เป้าหมายของฉันคือเพื่อให้แน่ใจว่าทุกแกนของสถาปัตยกรรมดำเนินการตามคำแนะนำเดียวกัน สมมติว่ารหัสของฉันไม่ต้องการการลงทะเบียนมากกว่ารหัสที่มีอยู่ในแต่ละ SM ฉันจินตนาการถึงวิธีการที่แตกต่างกัน:
ฉันสร้าง 8 บล็อกจาก 48 เธรดแต่ละรายการเพื่อให้แต่ละ SM มี 1 บล็อกที่จะดำเนินการ ในกรณีนี้ 48 เธรดจะดำเนินการแบบขนานใน SM (ใช้ประโยชน์จาก 48 คอร์ทั้งหมดที่มีให้)
มีความแตกต่างหรือไม่ถ้าฉันเปิดใช้ 64 บล็อก 6 เธรด (สมมติว่าพวกเขาจะถูกแมปอย่างเท่าเทียมกันในหมู่ SM)
ถ้าฉัน "จมลงใต้น้ำ" GPU ในงานที่กำหนดเวลาไว้ (สร้าง 1024 บล็อกของแต่ละกระทู้ 1024 เช่น) มันมีเหตุผลที่จะคิดว่าแกนทั้งหมดจะถูกนำมาใช้ในจุดที่แน่นอนและจะทำการคำนวณเดียวกัน (สมมติว่ากระทู้ ไม่เคยหยุด)
มีวิธีใดบ้างในการตรวจสอบสถานการณ์เหล่านี้โดยใช้ตัวสร้างโปรไฟล์?
มีการอ้างอิงสำหรับสิ่งนี้หรือไม่? ฉันอ่านคู่มือการเขียนโปรแกรม CUDA และบทที่อุทิศให้กับสถาปัตยกรรมฮาร์ดแวร์ใน "การเขียนโปรแกรมตัวประมวลผลแบบขนานขนาดใหญ่" และ "การออกแบบและพัฒนาแอปพลิเคชัน CUDA" แต่ฉันไม่สามารถหาคำตอบได้อย่างแม่นยำ