เป็นไปได้หรือไม่ที่จะ จำกัด จำนวนเธรดสำหรับ C ++ 17 parallel `for_each`


10

ฉันใช้std::for_eachกับstd::execution::parเพื่อทำการคำนวณที่ซับซ้อนในการป้อนข้อมูลขนาดใหญ่ที่แสดงเป็นเวกเตอร์ของโครงสร้าง การคำนวณไม่ต้องการความล่าช้าใด ๆ ที่เกี่ยวข้องกับฮาร์ดแวร์ (เช่นเครือข่ายหรือดิสก์ IO) เป็นการคำนวณแบบ "just CPU" สำหรับฉันมันดูเหมือนว่าไม่มีเหตุผลที่จะสร้างเธรด OS เพิ่มเติมที่เรามีฮาร์ดแวร์ อย่างไรก็ตาม Visual C ++ 2019 จะสร้างเธรดโดยเฉลี่ย 50 เธรดและบางครั้งมากถึง 500 เธรดแม้ว่าจะมีเธรดฮาร์ดแวร์เพียง 12 เธรดเท่านั้น

มีวิธี จำกัด เธรดแบบขนานที่นับhardware_concurrencyด้วยstd::for_eachและstd::execution::parหรือวิธีเดียวในการสร้างจำนวนเธรดที่สมเหตุสมผลคือการใช้โค้ดที่กำหนดเองด้วยstd::thread?


open-std.org/jtc1/sc22/wg21/docs/papers/2016/… - แต่ฉันคิดว่ามันยังเป็นข้อเสนออยู่ใช่ไหม
Caramiriel

1
แม้ว่าสิ่งนี้จะกลายเป็นมาตรฐานในทุกวัน แต่ปัญหาหลักของเธรดพูลคือมันอยู่ในระดับที่ต่ำกว่ามากstd::for_eachและอัลกอริทึมอื่น ๆ จาก<algorithm>ส่วนหัว แนวคิดหลักที่อยู่เบื้องหลังstd::execution::parคือการสร้างโค้ดคู่ขนานให้ใกล้เคียงกับความเรียบง่ายตามลำดับและการอัลกอริธึมที่มีอยู่แบบขนานพร้อมกับการเปลี่ยนรหัสและซีแมนทิกส์น้อยที่สุด
Vitalii

คำตอบ:


5

เป็นไปได้หรือไม่ที่จะ จำกัด จำนวนเธรดสำหรับ C ++ 17 แบบขนานfor_each?

ไม่อย่างน้อยไม่ได้อยู่ใน C ++ 17 อย่างไรก็ตามมีข้อเสนอสำหรับexecutorsมาตรฐานที่กำลังจะมาถึงซึ่งโดยทั่วไปจะช่วยให้คุณสามารถมีอิทธิพลต่อบริบทการดำเนินการ (ในแง่ของสถานที่และเวลา) สำหรับอินเทอร์เฟซ STL ระดับสูง:

thread_pool pool{ std::thread::hardware_concurrency() };
auto exec = pool.executor();
std::for_each(std::execution::par.on(exec), begin(data), end(data), some_operation);

ถึงตอนนั้นคุณต้องเชื่อใจผู้จำหน่ายคอมไพเลอร์ของคุณว่าเขารู้ว่าอะไรดีที่สุดสำหรับประสิทธิภาพโดยรวมเช่นผู้พัฒนาสถานะ Visual Studio :

การจัดกำหนดการในการใช้งานของเราได้รับการจัดการโดยกลุ่มเธรดระบบ Windows เธรดพูลใช้ประโยชน์จากข้อมูลที่ไม่พร้อมใช้งานกับไลบรารีมาตรฐานเช่นเธรดอื่น ๆ ในระบบกำลังทำอะไรเธรดทรัพยากรเคอร์เนลที่รอและคล้ายกัน มันเลือกเวลาที่จะสร้างกระทู้เพิ่มเติมและเมื่อจะยุติพวกเขา มันยังแชร์กับส่วนประกอบอื่น ๆ ของระบบรวมถึงที่ไม่ได้ใช้ C ++

ตัวเลือกอื่น ๆ คือยอมแพ้ แต่เพียงผู้เดียวในการใช้ไลบรารี่มาตรฐานและใช้การใช้งาน STL ซึ่งมีข้อเสนอใหม่อยู่แล้ว

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.