มีปัญหา / อัลกอริทึมที่มีชื่อเสียงในการคำนวณทางวิทยาศาสตร์ที่ไม่สามารถเร่งความเร็วด้วยการขนาน ดูเหมือนว่าฉันในขณะที่อ่านหนังสือเกี่ยวกับ CUDA ว่าสิ่งส่วนใหญ่สามารถ
มีปัญหา / อัลกอริทึมที่มีชื่อเสียงในการคำนวณทางวิทยาศาสตร์ที่ไม่สามารถเร่งความเร็วด้วยการขนาน ดูเหมือนว่าฉันในขณะที่อ่านหนังสือเกี่ยวกับ CUDA ว่าสิ่งส่วนใหญ่สามารถ
คำตอบ:
ประเด็นสำคัญคือความยาวของเส้นทางคริติคอลเทียบกับจำนวนการคำนวณทั้งหมด ถ้าเป็นสัดส่วนกับดังนั้นการขนานจะให้ความเร็วคงที่ดีที่สุด ถ้ามีขนาดเล็กกว่า asymptotically จะมีช่องว่างสำหรับการขนานกันมากขึ้นเมื่อขนาดของปัญหาเพิ่มขึ้น สำหรับอัลกอริธึมที่คือพหุนามในขนาดอินพุตกรณีที่ดีที่สุดคือเพราะมีปริมาณน้อยมากที่สามารถคำนวณได้ในเวลาน้อยกว่าเวลาลอการิทึม
ระดับความซับซ้อน NCลักษณะปัญหาที่สามารถแก้ไขได้อย่างมีประสิทธิภาพในแบบคู่ขนาน (เช่นในเวลา polylogarithmic) ไม่ทราบว่าแต่มีการตั้งสมมติฐานอย่างกว้างขวางว่าเป็นเท็จ หากเป็นกรณีนี้แล้วP-complete จะอธิบายถึงปัญหาเหล่านั้นที่ "เรียงลำดับโดยเนื้อแท้" และไม่สามารถเร่งความเร็วได้อย่างมีนัยสำคัญโดยการขนาน
ในการให้แง่มุมทางทฤษฎีกับสิ่งนี้ถูกกำหนดให้เป็นคลาสความซับซ้อนที่สามารถแก้ไขได้ในเวลาบนระบบที่มีตัวประมวลผลแบบขนานยังไม่ทราบว่า (แม้ว่าคนส่วนใหญ่สงสัยว่าไม่ใช่) โดยที่คือชุดของปัญหาที่แก้ไขได้ในเวลาพหุนาม ปัญหา "ที่ยากที่สุด" ในการขนานเป็นที่รู้จักกันว่าปัญหาในแง่ที่ว่าทุกปัญหาในสามารถลดลงเป็นปัญหาสมบูรณ์ผ่านลดลง หากคุณแสดงให้เห็นว่ามีปัญหาสมบูรณ์เดียวในคุณพิสูจน์ว่าO ( n k ) P = N C P P P P N C P N C P = N C (แม้ว่าอาจเป็นเท็จดังกล่าวข้างต้น)
ดังนั้นปัญหาใด ๆ ที่เป็น Complete จะเป็นการยากที่จะทำให้ขนานกัน ปัญหาที่สมบูรณ์ที่เราไม่ได้มีอย่างต่อเนื่องแม้จะดีมาก speedups ปัจจัยคือการเขียนโปรแกรมเชิงเส้น (ดูนี้แสดงความคิดเห็นหรือแลกเปลี่ยน)P
เริ่มต้นด้วยการ grocking กฎหมายของดาห์ล โดยพื้นฐานแล้วอะไรก็ตามที่มีลำดับขั้นตอนจำนวนมากจะได้รับประโยชน์เล็กน้อยจากการขนาน ตัวอย่างเล็ก ๆ น้อย ๆ ได้แก่ การแยกวิเคราะห์ regex และการบีบอัดอัตราส่วนสูงที่สุด
นอกเหนือจากนั้นปัญหาสำคัญมักจะเป็นปัญหาคอขวดในแบนด์วิดธ์หน่วยความจำ โดยเฉพาะอย่างยิ่งกับ GPU ส่วนใหญ่ของทฤษฎี flops ของคุณล้ำกว่าจำนวนจุดลอยตัวที่คุณสามารถเข้าถึงของ ALU ของคุณเช่นอัลกอริทึมดังกล่าวที่มีความเข้มทางคณิตศาสตร์ต่ำ (flops / แคชพลาด) จะใช้เวลาส่วนใหญ่รอ RAM
สุดท้ายทุกครั้งที่โค้ดหนึ่ง ๆ ต้องการการแบรนช์ก็ไม่น่าจะได้รับประสิทธิภาพที่ดีเพราะโดยปกติแล้ว ALU จะมีจำนวนมากกว่าตรรกะ
โดยสรุปตัวอย่างง่ายๆของสิ่งที่ยากที่จะได้รับความเร็วจาก GPU นั้นคือการนับจำนวนศูนย์ในอาร์เรย์ของจำนวนเต็มเนื่องจากคุณอาจต้องแยกสาขาบ่อยครั้งโดยดำเนินการ 1 ครั้ง (เพิ่มขึ้นโดย หนึ่ง) ในกรณีที่คุณพบศูนย์และทำการดึงหน่วยความจำอย่างน้อยหนึ่งครั้งต่อการดำเนินการ
ตัวอย่างที่ไม่มีปัญหาการแตกกิ่งคือการคำนวณเวกเตอร์ซึ่งเป็นผลรวมสะสมของเวกเตอร์อื่น ([1,2,1] -> [1,3,4])
ฉันไม่รู้ว่าสิ่งเหล่านี้นับว่า "มีชื่อเสียง" แต่มีปัญหามากมายที่การคำนวณแบบขนานจะไม่ช่วยคุณ
วิธีเดินเร็ว (ดัง) สำหรับแก้สมการ Eikonal ไม่สามารถเร่งได้โดยการขนาน มีวิธีการอื่น ๆ (เช่นวิธีการกวาดอย่างรวดเร็ว) สำหรับการแก้สมการ Eikonal ที่คล้อยตามการปรับให้เป็นแบบขนานได้มากขึ้น
ปัญหาของสมการ Eikonal คือการไหลของข้อมูลขึ้นอยู่กับการแก้ปัญหาของตัวเอง การพูดอย่างหลวม ๆ ข้อมูลจะไหลไปตามลักษณะ (เช่นแสงของแสงในทัศนศาสตร์) แต่ลักษณะนั้นขึ้นอยู่กับวิธีการแก้ปัญหานั้นเอง และการไหลเวียนของข้อมูลสำหรับสมการ Eikonal แบบไม่ต่อเนื่องนั้นยิ่งแย่กว่านั้นซึ่งต้องการการประมาณเพิ่มเติม (เช่นมีอยู่ในวิธีการกวาดอย่างรวดเร็ว) หากต้องการการเร่งความเร็วแบบขนานใด ๆ
หากต้องการดูความยากลำบากในการทำคู่ขนานจินตนาการเขาวงกตที่ดีเช่นในบางส่วนของตัวอย่างในหน้าเว็บของ Sethian จำนวนเซลล์บนเส้นทางที่สั้นที่สุดผ่านเขาวงกต (อาจ) เป็นขอบเขตที่ต่ำกว่าสำหรับจำนวนขั้นตอน / การวนซ้ำขั้นต่ำของอัลกอริทึม (ขนาน) ใด ๆ ที่แก้ปัญหาที่เกี่ยวข้อง
(ฉันเขียน "(อาจ))" เพราะขอบเขตที่ต่ำกว่านั้นเป็นเรื่องยากที่จะพิสูจน์ได้และมักจะต้องมีข้อสมมติฐานที่สมเหตุสมผลเกี่ยวกับการดำเนินการที่ใช้โดยอัลกอริทึม)
ปัญหาอีกประเภทหนึ่งที่ยากต่อการขนานกันในทางปฏิบัติคือปัญหาที่ละเอียดอ่อนต่อข้อผิดพลาดในการปัดเศษ
ลองพิจารณาตัวอย่างของกระบวนการ Gram – Schmidtและการดัดแปลงแบบอนุกรม อัลกอริทึมทำงานร่วมกับเวกเตอร์ดังนั้นคุณอาจใช้การดำเนินการเวกเตอร์แบบขนาน แต่นั่นไม่ได้ปรับขนาดได้ดี ถ้าจำนวนของเวกเตอร์มีขนาดใหญ่และขนาดของเวกเตอร์มีขนาดเล็กการใช้แบบคลาสสิกแบบขนานแกรม - ชมิดท์และการเปลี่ยนรูปแบบอาจจะเสถียรและเร็วกว่าแบบแกรมเดียวที่แก้ไขเพียงครั้งเดียว