ทำไมตัวแก้แบบขนานของฉันจึงช้ากว่าตัวแก้ไขแบบลำดับของฉัน


14

ฉันกำลังเล่นกับPETScและสังเกตว่าเมื่อฉันรันโปรแกรมด้วยกระบวนการมากกว่าหนึ่งผ่านMPIดูเหมือนว่าจะทำงานช้าลง ! ฉันจะตรวจสอบเพื่อดูว่าเกิดอะไรขึ้น?


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

คำตอบ:


13

สิ่งนี้สามารถเกิดขึ้นได้จากปัจจัยทางสถาปัตยกรรม :

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

อาจเป็นกรณีที่การสื่อสารอยู่เหนือการคำนวณของคุณ ตัวอย่างเช่นในวิธีการวนซ้ำแบบเชิงเส้นเราแนะนำให้มีอย่างน้อย 10,000 unknowns ต่อกระบวนการ

หรือปัจจัยที่เป็นตัวเลข :

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


8

เมื่อใดก็ตามที่พยายามขนานโปรแกรมที่คุณต้องสมดุลจำนวนค่าใช้จ่าย แต่ส่วนใหญ่มี

  • ค่าใช้จ่ายในการดำเนินการคำนวณแต่ละครั้ง
  • ค่าใช้จ่ายของการสื่อสารใด ๆ ระหว่างการคำนวณเหล่านั้น
  • ค่าใช้จ่ายในการจัดการการคำนวณเหล่านั้น

หากการคำนวณของคุณขนานกันอย่างน่าอายค่าใช้จ่ายในการสื่อสารจะต่ำมาก (อินพุตและเอาต์พุตเท่านั้น) และค่าใช้จ่ายในการจัดการควรต่ำมาก

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

เช่นเดียวกับการเพิ่มประสิทธิภาพในรูปแบบใด ๆ ที่สำคัญคือมาตรฐาน ดูว่ามันทำงานอย่างไรโดยไม่ใช้ MPI, มันทำงานอย่างไรกับ MPI และกระบวนการเดียวจากนั้นดูว่ามันขยายขนาดได้อย่างไร

หากคุณกำลังเล่นกับ CUDA ลองให้มันมากข้อมูลได้มากขึ้น หนึ่งการทดสอบที่นี่ส่งผลให้เกิดความเร็วเชิงลบ เราให้ข้อมูลกับมันมากขึ้น 1,000 เท่าและรุ่น GP-GPU จะเสร็จในเวลาใกล้เคียงกันในขณะที่รุ่นที่ใช้งานบน CPU หลักนั้นใช้เวลานานกว่า 1,000 เท่า


3

ฉันอยากจะแนะนำให้คุณทำต่อไปนี้:

  • สร้างโปรไฟล์ของการประมวลผลเวลาของรหัสของคุณโดยมีและไม่มีการขนาน หากคุณมีข้อสงสัยเกี่ยวกับวิธีการทำเช่นนี้เราสามารถช่วยคุณได้หากคุณอธิบายรหัสของคุณได้ดีขึ้น

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

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


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