ฟังก์ชัน Ballot และ Vote
ตรวจสอบเพรดิเคตของเธรดภายในวาร์ป
ฟังก์ชัน Ballot และ Vote เป็นบทเรียน CUDA Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน CUDA Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส CUDA Academy มีบทเรียนทั้งหมด 4 บทเรียน
เลนต่าง ๆ ลงคะแนนได้
นอกจากการย้ายข้อมูลแล้ว วาร์ปยังสามารถตอบคำถามแบบใช่หรือไม่ใช่ร่วมกันได้ อินทรินสิก Vote ช่วยให้ทุกเลนแชร์เพรดิเคตแบบจริงหรือเท็จได้ในขั้นตอนเดียวที่มีต้นทุนต่ำ
ทำความรู้จัก ballot_sync
การลงคะแนนที่ยืดหยุ่นที่สุดคือ ballot_sync ซึ่งคืนค่าตัวเลขขนาด 32 บิต โดยบิตที่ i จะเป็น 1 ก็ต่อเมื่อเพรดิเคตของเลนที่ i เป็นจริง
unsigned bits = __ballot_sync(mask, pred);หนึ่งบิตต่อหนึ่งเลน
จำนวนเต็มที่ส่งกลับมานั้นเป็น บิตแมป ขนาดเล็กของวาร์ป การอ่านบิตที่ i จะบอกว่าเลนที่ i ลงคะแนนเป็นจริงหรือไม่ โดยข้อมูลทั้งหมดถูกรวมไว้ในรีจิสเตอร์เดียว
นับค่าจริง
ต้องการทราบว่ามีกี่เลนตอบว่าใช่ใช่ไหม ให้ทำ pop-count กับผลลัพธ์จาก ballot ฟังก์ชัน popc จะนับบิตที่เป็น 1 และให้จำนวนการลงคะแนนจริงในวาร์ปทันที
int yes = __popc(__ballot_sync(mask, pred));ทั้งหมดหรืออย่างน้อยหนึ่ง
มีทางลัดสองแบบสำหรับคำถามที่พบบ่อย all_sync จะคืนค่า true ก็ต่อเมื่อทุกเลนเห็นพ้องกัน ส่วน any_sync จะคืนค่า true หากมีอย่างน้อยหนึ่งเลนเห็นด้วย
bool every = __all_sync(mask, pred);Any หมายถึงอย่างน้อยหนึ่ง
ใช้ any_sync สำหรับการออกจากการทำงานก่อนกำหนด หากมีเลนใดพบค่าที่ตรงกัน วาร์ปทั้งหมดก็สามารถตอบสนองพร้อมกันได้โดยไม่ต้องตรวจทีละเลน
bool found = __any_sync(mask, pred);การบีบอัดสตรีม
Ballot ช่วยขับเคลื่อน การบีบอัด โดยแต่ละเลนจะตัดสินใจว่าจะเก็บสมาชิกของตนไว้หรือไม่ จากนั้นลงคะแนน แล้วบิตแมปจะบอกตำแหน่งที่เลนต่าง ๆ ควรเขียนลงในอาร์เรย์ผลลัพธ์ที่ถูกจัดเรียงให้แน่น
ค้นหาตำแหน่งของตน
เพื่อวางค่าของตนเอง เลนจะนับบิตจริงที่อยู่ก่อนตำแหน่งของตน จำนวน คำนำหน้าจาก ballot นี้คือดัชนีของเลนในผลลัพธ์ที่ถูกบีบอัด
int slot = __popc(bits & ((1u << lane) - 1));เลือกเลนผู้นำ
บางครั้งควรให้เลนเดียวทำงานร่วมกัน บิตที่เป็น 1 ซึ่งอยู่ต่ำสุดใน ballot และค้นพบด้วย ffs เป็นผู้นำตามธรรมชาติที่ทั้งวาร์ปสามารถเห็นพ้องร่วมกันได้
ส่ง mask เสมอ
เช่นเดียวกับการสลับข้อมูล อินทรินสิกสำหรับการลงคะแนนจะรับ mask ของเลนที่ทำงานอยู่ เลนที่ไม่ทำงานจะส่งบิตค่า 0 ดังนั้นควรส่งชุดเลนที่ถูกต้องเพื่อหลีกเลี่ยงการนับเลนที่ไม่มีอยู่
การประสานงานต้นทุนต่ำ
การลงคะแนนใช้เพียงคำสั่งเดียวและไม่แตะหน่วยความจำ จึงช่วยให้วาร์ป ประสานงาน การตัดสินใจได้ถูกกว่าการใช้อะตอมิกหรือแฟล็กในหน่วยความจำร่วมมาก
ตรวจสอบอย่างรวดเร็ว
ลองนึกดูว่า ballot_sync ส่งสิ่งใดกลับคืนมาให้แต่ละเลน
สรุปทบทวน
คุณสำรวจวาร์ปด้วย ballot และ vote ทั้งการนับค่าจริง การตรวจว่าทั้งหมดหรืออย่างน้อยหนึ่งเป็นจริง และการบีบอัดสตรีมด้วยต้นทุนต่ำ ต่อไป: กลุ่มทำงานร่วมกันสำหรับการประสานงานที่ยืดหยุ่น ✨
เรียนรู้ C++ ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 30
- บทเรียน
- 120
คำถามที่พบบ่อย
บทเรียน “ฟังก์ชัน Ballot และ Vote” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ฟังก์ชัน Ballot และ Vote” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส CUDA Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส CUDA Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ฟังก์ชัน Ballot และ Vote”
ตรวจสอบเพรดิเคตของเธรดภายในวาร์ป คุณปฏิบัติ CUDA Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน CUDA Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน CUDA Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “ฟังก์ชัน Ballot และ Vote” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน CUDA Academy นี้ได้ไหม
ได้ บทเรียน CUDA Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- วาร์ป เลน และมาสก์
- ใช้ __shfl_down_sync เพื่อลดรูป
- ฟังก์ชัน Ballot และ Vote
- กลุ่มแบบร่วมมือ