วิธีการระบุที่ไม่ใช่ความสัมพันธ์เชิงตัวเลขสำหรับการลดแบบขนานได้อย่างไร


17

การลดลงแบบขนานถือว่าการดำเนินการที่สอดคล้องกันนั้นเชื่อมโยงกัน สมมติฐานนี้ถูกละเมิดเนื่องจากการเพิ่มจำนวนจุดลอยตัว คุณอาจถามว่าทำไมฉันถึงสนใจเรื่องนี้ มันทำให้ได้ผลลัพธ์ที่ทำซ้ำได้น้อยลง และจะแย่ลงเมื่อใช้การอบแบบจำลองเพื่อเพิ่มประสิทธิภาพ (หรือพารามิเตอร์ที่เหมาะสม) ให้กับรูทีนย่อยที่ให้ผลลัพธ์ที่ไม่สามารถทำซ้ำได้

วิธีทั่วไปในการจัดการกับปัญหานี้มีอะไรบ้าง สิ่งที่สามารถพูดเกี่ยวกับกลยุทธ์ต่อไปนี้?

  • ไม่สนใจเกี่ยวกับความไม่สามารถทำซ้ำได้
  • อย่าใช้การลดแบบขนานพร้อมกับจำนวนจุดลอยตัวและการเพิ่ม
  • สร้างแพคเกจงานที่มีขนาดที่เหมาะสมในวิธีที่ทำซ้ำได้และทำการลดขั้นสุดท้ายด้วยมือ
  • ใช้ความแม่นยำที่สูงขึ้นสำหรับการเติม (แต่ไม่ใช่คอมไพเลอร์ทั้งหมดที่เสนอประเภทจุดลอยตัวที่มีความแม่นยำสูงกว่า)

คุณมีความกังวลเกี่ยวกับความสามารถในการทำซ้ำในจำนวนกระบวนการเดียวกันหรือความสามารถในการทำซ้ำในจำนวนโปรเซสเซอร์ที่แตกต่างกันหรือไม่? คุณยินดีที่จะรับการแสดงผลระดับบิตเป็นจำนวนเท่าใด คุณสนใจที่จะทำการจำลองการอบหรือไม่?
Jed Brown

@JedBrown ฉันกังวลเกี่ยวกับความเป็นไปได้ที่จะได้ผลลัพธ์ที่สามารถทำซ้ำได้เช่นเพื่อแก้ไขปัญหาที่อาจเกิดขึ้น เป็นเรื่องที่ดีสำหรับฉันหากมีวิธีการทำซ้ำผลลัพธ์เช่นใช้ตัวประมวลผลจำนวนเท่าเดิม (หรือเพียงแค่ "รู้" จำนวนตัวประมวลผลที่ใช้ในตอนแรก) ฉันยินดีที่จะรับชมการแสดงที่เกี่ยวข้องกับการใช้ประเภททศนิยมที่มีความแม่นยำสูงกว่าสำหรับการเพิ่มตัวเอง ปัญหาคอนกรีตของฉันส่วนใหญ่เกี่ยวข้องกับการหลอมจำลองและความแตกต่างที่ไม่คาดคิด แต่สิ่งเหล่านี้กลายเป็นข้อบกพร่องจริง
โทมัส

คำตอบ:


15

การลดการใช้งานMPI_Allreduce()นั้นสามารถทำซ้ำได้ตราบใดที่คุณใช้โปรเซสเซอร์จำนวนเท่าเดิมหากการใช้งานสังเกตว่าบันทึกต่อไปนี้ปรากฏในส่วน 5.9.1 ของมาตรฐาน MPI-2.2

คำแนะนำเพื่อ implementors ขอแนะนำอย่างยิ่งให้MPI_REDUCEดำเนินการเพื่อให้ได้ผลลัพธ์เดียวกันทุกครั้งที่มีการใช้ฟังก์ชันในอาร์กิวเมนต์เดียวกันโดยปรากฏในลำดับเดียวกัน โปรดทราบว่าสิ่งนี้อาจป้องกันการปรับให้เหมาะสมที่ใช้ประโยชน์จากตำแหน่งทางกายภาพของโปรเซสเซอร์ ( สิ้นสุดการให้คำแนะนำแก่ผู้ดำเนินการ )

หากคุณต้องการรับประกันความสามารถในการทำซ้ำได้ทั้งหมดคุณสามารถทำตามคำแนะนำในย่อหน้าถัดไป:

แนะนำให้กับผู้ใช้ แอปพลิเคชันบางอย่างอาจไม่สามารถเพิกเฉยต่อลักษณะที่ไม่เกี่ยวข้องของการดำเนินการจุดลอยตัวหรืออาจใช้การดำเนินการที่ผู้ใช้กำหนดเอง (ดูหัวข้อ 5.9.5) ที่จำเป็นต้องมีคำสั่งลดพิเศษและไม่สามารถใช้เป็นสมาคมได้ แอปพลิเคชันดังกล่าวควรบังคับใช้ลำดับการประเมินผลอย่างชัดเจน ตัวอย่างเช่นในกรณีของการดำเนินการที่ต้องการลำดับการประเมินผลจากซ้ายไปขวา (หรือจากขวาไปซ้าย) ที่เข้มงวดสามารถทำได้โดยรวบรวมตัวถูกดำเนินการทั้งหมดในกระบวนการเดียว (เช่นกับ MPI_GATHER) โดยใช้การดำเนินการลด ในลำดับที่ต้องการ (เช่นด้วย MPI_REDUCE_LOCAL) และหากจำเป็นให้กระจายหรือกระจายผลลัพธ์ไปยังกระบวนการอื่น ๆ (เช่นด้วยMPI_BCAST) ( สิ้นสุดการให้คำแนะนำแก่ผู้ใช้ )

ในรูปแบบที่กว้างขึ้นของสิ่งต่าง ๆ อัลกอริธึมที่มีประสิทธิภาพสำหรับการใช้งานส่วนใหญ่ใช้ประโยชน์จากพื้นที่ เนื่องจากอัลกอริทึมนั้นแตกต่างกันอย่างแท้จริงเมื่อทำงานกับกระบวนการที่แตกต่างกันจำนวนมากจึงไม่เหมาะที่จะทำซ้ำผลลัพธ์อย่างแน่นอนเมื่อทำงานกับกระบวนการที่แตกต่างกัน ข้อยกเว้นที่เป็นไปได้คือ multigrid ที่มี Jacobi หรือ polynomial (เช่น Chebyshev) ที่นุ่มนวลซึ่งเป็นไปได้ที่วิธีการง่ายๆนี้จะทำงานได้ดีมาก

ด้วยจำนวนกระบวนการที่เท่ากันก็มักจะเป็นประโยชน์ต่อประสิทธิภาพในการประมวลผลข้อความตามลำดับที่ได้รับ (เช่นการใช้MPI_Waitany()) ซึ่งแนะนำการไม่กำหนดระดับ ในกรณีเช่นนี้คุณสามารถใช้สองรูปแบบได้คือแบบเร็วที่ได้รับในลำดับใด ๆ และแบบ "ดีบั๊ก" ที่ได้รับในลำดับคงที่ สิ่งนี้ต้องการให้ไลบรารีพื้นฐานทั้งหมดเขียนขึ้นเพื่อเสนอพฤติกรรมนี้

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


6

ส่วนใหญ่ฉันตอบคำถามของ Jed อย่างไรก็ตามมีวิธีที่แตกต่างออกไป: เนื่องจากขนาดของจำนวนจุดลอยตัวปกติคุณสามารถจัดเก็บทุกหมายเลขในหมายเลขจุดคงที่ 4000 หรือดังนั้นบิต ดังนั้นหากคุณลดจำนวนจุดลอยตัวลงไปดังนั้นคุณจะได้รับการคำนวณที่แน่นอนไม่ว่าจะมีความสัมพันธ์ใด (ขออภัยฉันไม่มีการอ้างอิงถึงผู้ที่คิดไอเดียนี้)


1
ฉันไม่คิดว่าเขาเป็นคนแรก แต่เพื่อนร่วมงานของคุณดร. แบนด์วิดท์มีการเขียนที่ดีในหัวข้อนี้: sites.utexas.edu/jdm4372/2012/02/15/ …
เจฟฟ์

5

คุณสามารถใช้อัลกอริทึมการลดความเสถียรเชิงตัวเลขใน MPI เช่นเดียวกับที่คุณสามารถทำได้ในอนุกรม แน่นอนว่าอาจมีผลงานยอดเยี่ยม หากคุณสามารถที่จะทำซ้ำเวกเตอร์ได้ให้ใช้ MPI_Gather และทำการลดความเสถียรเชิงตัวเลขในอนุกรมบนรูท ในบางกรณีคุณอาจพบว่าประสิทธิภาพการทำงานไม่เป็นเรื่องใหญ่

ทางออกก็คือการใช้สะสมกว้างตามที่อธิบายไว้ที่นี่ คุณสามารถทำเช่นนี้กับ MPI เป็นการลดผู้ใช้กำหนดแม้ว่ามันจะใช้แบนด์วิดท์มากขึ้น

การประนีประนอมสำหรับข้างต้นคือการใช้การรวมยอดชดเชย ดูการอ้างอิง“ Kahan summation” สำหรับรายละเอียด “ ความแม่นยำและความเสถียรของอัลกอริธึมเชิงตัวเลข ” ของ Higham เป็นทรัพยากรที่ยอดเยี่ยมในหัวข้อนี้



2

ฉันอยากจะชี้ให้เห็นว่าแทนที่จะใช้เลขคณิตความแม่นยำสูงกว่าสำหรับการเติมมีความเป็นไปได้ที่จะใช้ผลรวมที่ชดเชย (ดู [1]) สิ่งนี้สามารถเพิ่มความแม่นยำของการรวมโดยไม่จำเป็นต้องหันไปใช้ประเภทข้อมูลขนาดใหญ่

[1] Higham, NJ ความแม่นยำของการรวมจุดที่เป็นทศนิยม วารสารวิทยาศาสตร์คอมพิวเตอร์ 14, 783–799 (1993)

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