CUDA บล็อก / warps / threads แผนที่บนแกน CUDA ได้อย่างไร


142

ฉันใช้ CUDA มาหลายสัปดาห์แล้ว แต่ฉันมีข้อสงสัยเกี่ยวกับการจัดสรรบล็อก / warps / thread ฉันกำลังศึกษาสถาปัตยกรรมจากมุมมองการสอน (โครงการมหาวิทยาลัย) ดังนั้นการเข้าถึงประสิทธิภาพสูงสุดจึงไม่ใช่สิ่งที่ฉันกังวล

ก่อนอื่นฉันอยากจะเข้าใจถ้าฉันได้รับข้อมูลตรงนี้:

  1. โปรแกรมเมอร์เขียนเคอร์เนลและจัดระเบียบการดำเนินการในกริดของบล็อกเธรด

  2. แต่ละบล็อกถูกกำหนดให้กับ Streaming Multiprocessor (SM) เมื่อกำหนดแล้วจะไม่สามารถโยกย้ายไปยัง SM อื่นได้

  3. SM แต่ละตัวแยกบล็อกของตัวเองออกเป็น Warps (ปัจจุบันมีขนาดสูงสุด 32 เธรด) เธรดทั้งหมดในวิปริตดำเนินการพร้อมกันกับทรัพยากรของ SM

  4. การดำเนินการจริงของเธรดนั้นดำเนินการโดย CUDA Cores ที่อยู่ใน SM ไม่มีการแมปเฉพาะระหว่างเธรดและแกน

  5. ถ้าวาร์ปประกอบด้วยเธรด 20 เธรด แต่ในปัจจุบันมีเพียง 16 คอร์ที่ใช้ได้วิปริตจะไม่ทำงาน

  6. ในทางกลับกันหากบล็อกมี 48 เธรดบล็อกจะถูกแยกออกเป็น 2 วาร์ปและจะดำเนินการควบคู่กันโดยมีหน่วยความจำเพียงพอ

  7. หากเธรดเริ่มทำงานบนคอร์นั้นจะถูกหยุดทำงานเพื่อเข้าถึงหน่วยความจำหรือสำหรับการดำเนินการจุดลอยตัวที่ยาวนาน

พวกเขาถูกต้องหรือไม่

ตอนนี้ฉันมี GeForce 560 Ti ดังนั้นตามข้อกำหนดที่ติดตั้งไว้กับ 8 SM แต่ละตัวมี 48 CUDA แกน (รวม 384 แกน)

เป้าหมายของฉันคือเพื่อให้แน่ใจว่าทุกแกนของสถาปัตยกรรมดำเนินการตามคำแนะนำเดียวกัน สมมติว่ารหัสของฉันไม่ต้องการการลงทะเบียนมากกว่ารหัสที่มีอยู่ในแต่ละ SM ฉันจินตนาการถึงวิธีการที่แตกต่างกัน:

  1. ฉันสร้าง 8 บล็อกจาก 48 เธรดแต่ละรายการเพื่อให้แต่ละ SM มี 1 บล็อกที่จะดำเนินการ ในกรณีนี้ 48 เธรดจะดำเนินการแบบขนานใน SM (ใช้ประโยชน์จาก 48 คอร์ทั้งหมดที่มีให้)

  2. มีความแตกต่างหรือไม่ถ้าฉันเปิดใช้ 64 บล็อก 6 เธรด (สมมติว่าพวกเขาจะถูกแมปอย่างเท่าเทียมกันในหมู่ SM)

  3. ถ้าฉัน "จมลงใต้น้ำ" GPU ในงานที่กำหนดเวลาไว้ (สร้าง 1024 บล็อกของแต่ละกระทู้ 1024 เช่น) มันมีเหตุผลที่จะคิดว่าแกนทั้งหมดจะถูกนำมาใช้ในจุดที่แน่นอนและจะทำการคำนวณเดียวกัน (สมมติว่ากระทู้ ไม่เคยหยุด)

  4. มีวิธีใดบ้างในการตรวจสอบสถานการณ์เหล่านี้โดยใช้ตัวสร้างโปรไฟล์?

  5. มีการอ้างอิงสำหรับสิ่งนี้หรือไม่? ฉันอ่านคู่มือการเขียนโปรแกรม CUDA และบทที่อุทิศให้กับสถาปัตยกรรมฮาร์ดแวร์ใน "การเขียนโปรแกรมตัวประมวลผลแบบขนานขนาดใหญ่" และ "การออกแบบและพัฒนาแอปพลิเคชัน CUDA" แต่ฉันไม่สามารถหาคำตอบได้อย่างแม่นยำ


ฉันต้องการผนวกความคิดเห็นว่า "CUDA core" คืออะไร "CUDA core" หรือ "Execution unit" เป็นจำนวนเต็ม pipelined ALU และ FPU ที่รันคำสั่งทางคณิตศาสตร์หนึ่งคำสั่งต่อรอบสัญญาณนาฬิกาในหนึ่ง cuda thread
bruziuz

คำตอบ:


123

การอ้างอิงที่ดีที่สุดสองประการคือ

  1. เอกสารข้อมูลสถาปัตยกรรมของ NVIDIA Fermi
  2. ความคิดเห็น GF104

ฉันจะพยายามตอบคำถามของคุณแต่ละข้อ

โปรแกรมเมอร์แบ่งงานเป็นเธรดเธรดออกเป็นบล็อกเธรดและบล็อกเธรดเป็นกริด ผู้จัดจำหน่ายที่ทำงานของคอมพิวเตอร์คำนวณจัดสรรบล็อกเธรดให้กับสตรีมมัลติโพรเซสเซอร์ (SM) เมื่อบล็อกเธรดถูกแจกจ่ายไปยัง SM ทรัพยากรสำหรับบล็อกเธรดจะถูกจัดสรร (warps และหน่วยความจำที่แบ่งใช้) และเธรดจะถูกแบ่งออกเป็นกลุ่มของเธรด 32 ที่เรียกว่า warps เมื่อวิปริตได้รับการจัดสรรจะเรียกว่าวิปริตที่ใช้งานอยู่ ตัวกำหนดเวลาวาร์ปสองตัวเลือกวาร์ปที่แอ็คทีฟสองรอบต่อรอบ สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับหน่วยปฏิบัติและการสอนการจัดส่งดู1 p.7-10 และ2

4' มีการแม็พระหว่าง laneid (ดัชนีเธรดในวาร์ป) และแกน

5' ถ้าวาร์ปประกอบด้วยเธรดน้อยกว่า 32 เธรดโดยส่วนใหญ่จะถูกดำเนินการเหมือนกับว่ามี 32 เธรด Warps สามารถมีเธรดที่แอ็คทีฟน้อยกว่า 32 เธรดด้วยเหตุผลหลายประการ: จำนวนเธรดต่อบล็อกไม่สามารถหารได้ด้วย 32 โปรแกรมรันบล็อก divergent ดังนั้นเธรดที่ไม่ได้ใช้พา ธ ปัจจุบันจะถูกทำเครื่องหมายไม่ใช้งานหรือเธรดใน warp exited

6' บล็อกเธรดจะถูกแบ่งออกเป็น WarpsPerBlock = (ThreadsPerBlock + WarpSize - 1) / WarpSize ไม่มีข้อกำหนดสำหรับตัวกำหนดเวลา warp เพื่อเลือกสอง warps จากบล็อกเธรดเดียวกัน

7' หน่วยดำเนินการจะไม่หยุดทำงานในการทำงานของหน่วยความจำ หากทรัพยากรไม่สามารถใช้ได้เมื่อคำสั่งพร้อมที่จะส่งคำสั่งจะถูกส่งอีกครั้งในอนาคตเมื่อทรัพยากรพร้อมใช้งาน Warps สามารถหยุดที่สิ่งกีดขวาง, ในการดำเนินงานของหน่วยความจำ, การดำเนินการพื้นผิว, การพึ่งพาข้อมูล, ... warp ที่ถูกเลื่อนนั้นไม่มีคุณสมบัติที่จะถูกเลือกโดยตัวจัดตารางเวลาของ warp ในแฟร์มีประโยชน์ที่จะมี warps ที่มีสิทธิ์อย่างน้อย 2 รอบต่อรอบเพื่อให้ warp scheduler สามารถออกคำสั่ง

ดูการอ้างอิง2สำหรับความแตกต่างระหว่าง GTX480 และ GTX560

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

1' หากคุณเรียกใช้เคอร์เนล <<< 8, 48 >>> คุณจะได้รับ 8 บล็อกต่อบล็อกด้วย 2 warps จาก 32 และ 16 เธรด ไม่มีการรับประกันว่า 8 บล็อกเหล่านี้จะถูกกำหนดให้กับ SM ที่แตกต่างกัน หากมีการจัดสรร 2 บล็อกให้กับ SM ดังนั้นจึงเป็นไปได้ที่ตัวกำหนดตารางวาร์ปแต่ละตัวสามารถเลือกวาร์ปและดำเนินการวาร์ปได้ คุณจะใช้ 32 จาก 48 คอร์เท่านั้น

2' มีความแตกต่างใหญ่ระหว่าง 8 บล็อกของ 48 เธรดและ 64 บล็อกของ 6 เธรด สมมติว่าเคอร์เนลของคุณไม่มีความแตกต่างและแต่ละเธรดจะเรียกใช้งาน 10 คำสั่ง

  • 8 บล็อกที่มี 48 เธรด = 16 warps * 10 คำแนะนำ = 160 คำแนะนำ
  • 64 บล็อกที่มี 6 เธรด = 64 วาร์ป * 10 คำแนะนำ = 640 คำแนะนำ

เพื่อให้ได้ประสิทธิภาพสูงสุดการแบ่งงานควรอยู่ในทวีคูณของ 32 เธรด ฮาร์ดแวร์จะไม่รวมตัวกันของเธรดจากการแปรปรวนที่แตกต่างกัน

3' GTX560 สามารถมี 8 SM * 8 บล็อก = 64 บล็อกในแต่ละครั้งหรือ 8 SM * 48 warps = 512 warps หากเคอร์เนลไม่ได้ลงทะเบียนหรือหน่วยความจำที่ใช้ร่วมกันสูงสุด ในช่วงเวลาหนึ่งของการทำงานจะมีผลกับ SMs SM แต่ละหน่วยมีหน่วยดำเนินการหลายหน่วย (มากกว่าแกน CUDA) ทรัพยากรใดที่ใช้งานอยู่ในเวลาที่กำหนดจะขึ้นอยู่กับตัวกำหนดเวลาวาร์ปและคำสั่งผสมของแอปพลิเคชัน หากคุณไม่ดำเนินการ TEX หน่วย TEX จะไม่ทำงาน หากคุณไม่ดำเนินการจุดลอยตัวพิเศษหน่วย SUFU จะไม่ทำงาน

4' Parallel Nsight และ Visual Profiler แสดง

ดำเนินการ IPC

ข ออก IPC

ค. warps ที่ใช้งานอยู่ต่อวงจรที่ใช้งานอยู่

d วาร์ปที่มีสิทธิ์ต่อรอบการใช้งาน (Nsight เท่านั้น)

อี เหตุผลแผงวิปริต (เฉพาะ Nsight เท่านั้น)

ฉ กระทู้ที่ใช้งานต่อคำสั่งดำเนินการ

ตัวสร้างโปรไฟล์ไม่แสดงเปอร์เซ็นต์การใช้ประโยชน์ของหน่วยการดำเนินการใด ๆ สำหรับ GTX560 การประมาณคร่าวๆน่าจะเป็น IssuedIPC / MaxIPC สำหรับ MaxIPC ถือว่า GF100 (GTX480) คือ 2 GF10x (GTX560) คือ 4 แต่เป้าหมายคือ 3 คือเป้าหมายที่ดีกว่า


1
ขอบคุณสำหรับคำตอบ. ฉันอ่านข้อมูลอ้างอิง แต่มีบางสิ่งที่ฉันไม่เข้าใจในคำตอบของคุณ ในคำถามต่อไปนี้ฉันสมมติว่าเราใช้สถาปัตยกรรม Fermi ที่มี 48 คอร์ (16 คอร์ * 3 "กลุ่มแกน"): 1. คุณพูดถึงการทำแผนที่ระหว่างคอร์กับเลน มันเป็นแผนที่แบบไหน? 2. จากการอ้างอิงฉันพบว่า "กลุ่มแกน" แต่ละกลุ่มประมวลผลได้มากที่สุดครึ่งนึง (16 เธรด) ต่อรอบนาฬิกา ดังนั้นในทางทฤษฎีถ้าเรามี 48 เธรดในบล็อกเดียวกันพวกมันจะถูกจัดแบ่งเป็น 3 ครึ่งวาร์ปและทำงานขนานกันบน 48 คอร์ ฉันถูกไหม?
Daedalus

1
แกน CUDA คือจำนวนของ FP หน่วยความแม่นยำเดียว การคิดถึงการดำเนินการในแง่ของแกน CUDA นั้นไม่ถูกต้อง วาร์ปแต่ละอันมี 32 เธรด เธรดเหล่านี้จะถูกส่งไปยังกลุ่มของหน่วยดำเนินการ (เช่น 16 cuda cores) ในการออก 48 คอร์ทั้งหมดในหนึ่งนาฬิกาตัวจับเวลาหนึ่งในสองตัวตั้งค่าวาร์ปจำเป็นต้องเลือกวาร์ปที่ตรงตามความต้องการของคู่ซูเปอร์คาร์ นอกจากนี้ตัวกำหนดตารางวาร์ปอื่นต้องเลือกวาร์ปซึ่งคำสั่งถัดไปจะถูกดำเนินการโดย CUDA แกน
Greg Smith

1
ไม่มีข้อกำหนดว่า warps จะอยู่ในบล็อกเดียวกันหรือ warps ในบล็อกนั้นมีตัวนับโปรแกรมเหมือนกัน
Greg Smith

2
ในตัวอย่างคุณแต่ละตัวจัดตารางเวลากำลังเลือก warp และออกคำสั่ง 1 ในกรณีนี้จะมีการใช้งานหน่วยประมวลผล 2 กลุ่มเท่านั้น ในการใช้หน่วยการดำเนินการเพิ่มเติม 1 ของตัวกำหนดตารางเวลาต้องดำเนินการกับปัญหาคู่ ตามที่ระบุในการอ้างอิงมีหน่วยการดำเนินการหลายประเภท (ไม่ใช่เฉพาะสิ่งที่เป็น cuda cores) และมีกฎการจับคู่การเรียนการสอน
Greg Smith

1
@GregSmith ฉันกำลังค้นหาทั่วทั้งเว็บเพื่อหาว่า 8 บล็อกที่ใช้งานต่อ SM ในสถาปัตยกรรม Fermi นั้นมาจากไหน มันไม่ได้พูดถึงแม้แต่ในกระดาษสีขาวแฟร์ คุณมีข้อมูลอ้างอิงเพิ่มเติมเกี่ยวกับเรื่องนี้อีกหรือไม่?
เกร็กเค

8

"E. หากวาร์ปมี 20 เธรด แต่ปัจจุบันมี 16 คอร์เท่านั้นการแปรปรวนจะไม่ทำงาน"

ไม่ถูกต้อง คุณสร้างความสับสนให้กับคอร์ในความรู้สึกปกติ (ใช้ในซีพียู) - จำนวนของ "มัลติโปรเซสเซอร์" ใน GPU โดยมีแกนกลางในการตลาด nVIDIA พูด ("การ์ดของเรามี CUDA หลายพันแกน")

วาร์ปสามารถกำหนดเวลาได้ในแกนเดียวเท่านั้น (= มัลติโปรเซสเซอร์) และสามารถรันได้สูงสุด 32 เธรดในเวลาเดียวกัน มันไม่สามารถใช้มากกว่าแกนเดียว

หมายเลข "48 วาร์ป" คือจำนวนสูงสุดของวาร์ปที่แอคทีฟ (วาร์ปซึ่งอาจถูกเลือกให้กำหนดไว้สำหรับการทำงานในรอบถัดไป, ในรอบใด ๆ ก็ตาม) ต่อมัลติโปรเซสเซอร์, บน nVIDIA GPUs ที่มีความสามารถในการคำนวณ 2.x; และจำนวนนี้สอดคล้องกับ 1536 = 48 x 32 กระทู้

คำตอบจากwebinar นี้


@GregSmith: แก้ไขคำตอบเพื่อแก้ไขปัญหานี้ ก็ปรับว่าคุณเป็นผู้ป่วยที่มี แต่ - จะได้รับห้าปี ...
einpoklum

แกนเดียว (= มัลติโปรเซสเซอร์)? ฉันคิดว่าคำถามถือว่าเป็นคำศัพท์ single core = processor และไม่ใช่มัลติโปรเซสเซอร์ ด้วยคำศัพท์ของคุณคำตอบของคุณถูกต้อง
Adarsh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.