วิธีการที่ดีที่สุดสำหรับการจัดการตาข่ายในการคำนวณองค์ประกอบ จำกัด แบบขนาน?


11

ขณะนี้ฉันกำลังพัฒนาวิธีการแยกส่วนโดเมนสำหรับการแก้ปัญหาการกระเจิง โดยทั่วไปฉันกำลังแก้ไขระบบของ Helmholtz BVP ซ้ำ ๆ ฉันยกเลิกสมการโดยใช้วิธีไฟไนต์เอลิเมนต์เหนือตาข่ายสามเหลี่ยมหรือเตตราฮีด ฉันกำลังพัฒนารหัสเพื่อวิทยานิพนธ์ของฉัน ฉันรู้ว่ามีไลต์อิลิเมนต์ไลบรารี่บางตัวที่มีอยู่เช่น deal.ii หรือ DUNE และถึงแม้ว่าฉันคิดว่ามันยอดเยี่ยมด้วยการออกแบบที่สร้างแรงบันดาลใจและ API เพื่อการเรียนรู้ฉันต้องการพัฒนาแอปพลิเคชันเล็ก ๆ

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

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

มีไลบรารี p4est สำหรับการจัดการเครือข่ายแบบกระจาย ฉันไม่ต้องการ AMR ​​ดังนั้นอาจเป็น overkill เพราะฉันสนใจที่จะใช้ตาข่ายแบบเดียวและฉันไม่แน่ใจว่ามันสามารถปรับแต่งตาข่ายแบบสามเหลี่ยมได้หรือไม่ ฉันสามารถสร้างตาข่ายแบบเดียวจากนั้นป้อนเข้าไปในหนึ่งในตัวแบ่งพาร์ติชันและทำการประมวลผลบางส่วนของผลลัพธ์

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

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

ขอบคุณล่วงหน้า!


หากคุณกำลังมองหา mesh partitioner - METIS น่าจะเป็นทางเลือกที่ดี ตรวจสอบ ParMETIS ด้วย การจัดการเมชเป็นเรื่องที่แตกต่าง ITAPS iMesh สามารถช่วยคุณได้ โปรดตรวจสอบคำตอบสำหรับคำถามของฉันที่นี่: scicomp.stackexchange.com/questions/4750/…
Krzysztof Bzowski

@KrzysztofBzowski: คุณเคยใช้ห้องสมุด Scotch ด้วยหรือเปล่า? ฉันสงสัยว่าอะไรคือความแตกต่างระหว่างสก็อตช์และเมติสเมื่อพูดถึงองค์ประกอบที่ จำกัด โครงการ iMesh ดูน่าสนใจมาก ฉันจะอ่านเพิ่มเติมเกี่ยวกับเรื่องนี้ในอีกไม่กี่วันข้างหน้า ฉันรู้เกี่ยวกับดีล II และ DUNE ฉันจำได้ว่าเคยดู openMesh มาแล้ว แต่คิดว่ามันจะง่ายกว่าที่จะใช้ฟังก์ชั่นที่ฉันต้องการตั้งแต่เริ่มต้น สำหรับตาข่ายตามลำดับโดยทั่วไปฉันปรับโครงสร้างข้อมูลขอบครึ่ง / ใบหน้าที่นำเสนอในลิงค์กระดาษนี้ขอบคุณ!
กลางเดือน

คำตอบ:


7

หากคุณไม่ได้ใช้ AMR และไม่ต้องการปรับขนาดเกิน 1K-4K คอร์เพียงแค่ทำสิ่งนี้

  1. อันดับที่ 0 อ่านทั้ง mesh และพาร์ติชั่นโดยใช้ METIS / Scotch เป็นต้น (หมายเหตุ: นี่เป็นการดำเนินการแบบอนุกรม)

  2. อันดับ 0 ออกอากาศข้อมูลการแบ่งพาร์ติชั่นองค์ประกอบ / โหนดไปยังตำแหน่งอื่นทั้งหมดและเพิ่มหน่วยความจำ (ใช้เพื่อเก็บตาข่าย)

  3. อันดับทั้งหมดอ่านโหนด / องค์ประกอบที่เป็นเจ้าของ (รวมถึงโหนดผี) จากไฟล์อินพุตเดียวกัน (หมายเหตุ: 2000 อันดับการเข้าถึงไฟล์อินพุตเดียวกันอาจฟังดูช้า แต่ไม่ได้อยู่ในทางปฏิบัติแม้ว่ามันอาจจะไม่ดีสำหรับระบบไฟล์ แต่เรา กำลังทำเพียงครั้งเดียว)

  4. อันดับทั้งหมดต้องสร้างการแม็พโลคัลกับโหนด / อิลิเมนต์ / dof โลคัลสำหรับแอ็พพลิเคชันของ BCs และการประกอบเมทริกซ์และกำหนดหมายเลขโหนด

หลังจากทุกอย่างถูกพูดและทำข้อมูลทั้งหมดในอันดับแล้วคุณจะสามารถปรับขนาดได้ (หน่วยความจำที่ชาญฉลาด) ฉันทำทั้งหมดนี้ประมาณ 100 บรรทัด (ดูบรรทัดที่ 35-132 ที่นี่ ) ในโค้ดของฉัน

ตอนนี้ถ้า mesh ของคุณมีขนาดใหญ่เกินไป (เช่น> 100-250 ล้านองค์ประกอบ) ที่คุณไม่สามารถแบ่งพาร์ติชันโดยใช้ METIS บนโหนดเดียวและต้องการ ParMETIS / PT-Scotch คุณต้องทำงานเพิ่มเติมในการแบ่งพาร์ติชันแบบขนานก่อนแกนทั้งหมด / อันดับสามารถอ่านได้ ในสถานการณ์ดังกล่าวอาจง่ายกว่าที่จะแยกเฟสการแบ่งพาร์ติชันออกจากรหัสหลักเพื่อเหตุผลด้านลอจิสติกส์

Btw AMR libs มักจะไม่ทำอะไรเลย PETSc เป็นทางเลือกที่ดีสำหรับการขนานของโค้ดของคุณ

แก้ไข: ดูที่นี่และที่นี่ด้วย


ขอบคุณที่แบ่งปันรหัสของคุณ! ฉันมักจะใช้เส้นทางที่คุณระบุไว้ข้างต้น ดูเหมือนว่าซับซ้อนน้อยที่สุดและฉันก็มีความคิดว่าจะทำอย่างไร นอกจากนี้มันจะเป็นการออกกำลังกายที่ดีในการเขียนโปรแกรม MPI คุณพูดถึงว่า AMR libs มักจะไม่จัดการ tets มันอาจเป็นเพราะการปรับแต่งที่ไร้เดียงสาเมื่อพูดว่าต้นไม้รูปสี่เหลี่ยมของตาข่ายรูปสามเหลี่ยมสามารถนำไปสู่ตาข่ายที่มีคุณภาพไม่ดีได้หรือไม่? การกลั่นล่ามดูเหมือนง่าย แต่การแบ่งเทตออกเป็นสี่ดูเหมือนยากถ้าใครต้องการรักษาคุณภาพ อาจมี C ++ wrapper สำหรับ PETSc หรือเปล่า? ฉันสามารถใช้ C แต่ C ++ จะดีกว่า
กลางเดือน

@midurad ถ้าคุณชอบ C ++ มากกว่า C คุณควรพิจารณา Trilinos ซึ่งเป็นไลบรารี่ C ++ ที่เทียบเท่ากับ PETSc นอกจากนี้ Trilinos ยังมีแพ็คเกจ (Zoltan) ซึ่งคุณสามารถใช้สำหรับการแบ่งตาข่าย
Dr_Sam

@midurad คุณต้องใช้ MPI น้อยมากหากคุณใช้ PETSc การกลั่นควรง่าย แต่การจัดการ (อย่างมีประสิทธิภาพ) กับโครงสร้างข้อมูลแบบไดนามิกที่เกี่ยวข้องอาจต้องใช้ความคิดและการทำงาน คุณควรจะสามารถใช้ PETSc กับ C ++ แต่เนื่องจากข้อกำหนดของ libmesh อาจเป็นตัวเลือกที่ทำงานได้ (ฉันคิดว่ามันรองรับ AMR และ tets)
stali

ขอบคุณสำหรับข้อมูลทั้งหมด นั่นเป็นประโยชน์มาก
กลางเดือน

2

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

ในกรณีของคุณคุณได้เห็นวิธีการใช้ตัวแก้ Helmholtz อย่างง่าย แต่คุณจะใช้เวลาอีก 6 เดือนข้างหน้าในการเขียนโค้ดที่จำเป็นในการทำแบบขนานคุณจะใช้เวลาอีก 3 เดือนถ้าคุณต้องการใช้รูปทรงเรขาคณิตที่ซับซ้อนมากขึ้น จากนั้นคุณจะใช้เวลาอีก 6 เดือนหากคุณต้องการตัวแก้ปัญหาที่มีประสิทธิภาพ และทุกครั้งที่คุณเขียนโค้ดที่ถูกเขียนโดยคนอื่นและในแง่หนึ่งไม่ได้ทำให้คุณเข้าใกล้สิ่งที่คุณต้องทำเพื่อปริญญาเอกของคุณ: พัฒนาสิ่งใหม่ที่ไม่เคยมีมาก่อน ทำมาก่อน ถ้าคุณไปตามถนนสายนี้คุณจะใช้เวลา 2-3 ปีในการทำสิ่งที่คนอื่นทำและอาจใช้เวลา 1 ปีในการทำสิ่งใหม่

ทางเลือกคือตอนนี้คุณใช้เวลา 6 เดือนในการเรียนรู้หนึ่งในห้องสมุดที่มีอยู่ แต่หลังจากนั้นคุณจะมีเวลา 2-3 ปีในการทำสิ่งใหม่ ๆ สิ่งต่าง ๆ ทุกสัปดาห์คุณสามารถเดินเข้าไปในสำนักงานที่ปรึกษาของคุณและแสดงให้เขา / บางสิ่งที่เธอใหม่จริง ๆ นั้นมีขนาดใหญ่มากหรือดูเท่ห์มาก ๆ ฉันคิดว่าคุณคงเห็นว่าฉันจะไปกับเรื่องนี้ตอนนี้


3
คำถามที่ตรงไปตรงมาเนื่องจากคุณเห็นได้ชัดว่ามีอำนาจในเรื่องนี้: ใครจะเป็นคนเขียนโครงร่างต่อไปเช่น deal.ii ถ้าไม่มีใครในกลุ่มนักศึกษาปริญญาเอกในปัจจุบันที่กำลังฝึกฝนปัญหาแบบนี้ เราได้เห็นแนวโน้มที่เป็นปัญหาของนักศึกษาปริญญาเอกที่เข้ามาซึ่งไม่เคยแม้แต่จะรวบรวมโปรแกรม เป็นเรื่องน่ารำคาญสำหรับฉันที่ทักษะการพัฒนารหัสโดยเฉลี่ยดูเหมือนว่าจะลดลงอย่างต่อเนื่องในนักวิทยาศาสตร์การคำนวณ
Aurelius

1
มันเป็นคำถามที่ยุติธรรม คุณต้องการให้ผู้สำเร็จการศึกษาเป็นคนหัวกระดูกและดื้อรั้นเหมือนฉัน :-) แต่คำตอบของฉันคือเพียงเพราะเราอาจต้องการคนสองสามคนที่ทำเช่นนั้นนั่นไม่ได้หมายความว่าเราควรสนับสนุนให้ทุกคนใช้ชีวิตเป็นเวลาหลายปี สิ่งที่ผู้อื่นนำไปใช้แล้ว
Wolfgang Bangerth

2
ใช่ยุติธรรมพอ IMO สิ่งที่ยิ่งใหญ่ที่สุดเพียงอย่างเดียวที่ช่วยกันยึดครองโลกการวิจัย CFD ในช่วง 20 ปีที่ผ่านมาคือการขาดความสามารถด้านวิศวกรรมซอฟต์แวร์และการปฏิเสธการใช้ซอฟต์แวร์ที่ทันสมัยโดย greybeards นอกเหนือจากโครงร่างแล้วนักศึกษาระดับปริญญาเอกจำนวนมากถูกระงับด้วยรหัสดั้งเดิมที่ไม่ดีและไม่สามารถสร้างซอฟต์แวร์ที่ซับซ้อนได้อย่างรวดเร็วซึ่งจำเป็นสำหรับวิธีการเชิงตัวเลขที่ทันสมัยบนฮาร์ดแวร์ที่ทันสมัย
Aurelius

ฉันไม่เห็นด้วยกับแถลงการณ์เกี่ยวกับ greybeards (แม้ว่าฉันจะกลายเป็นสีเทาเช่นกันในวันนี้ ... ) แต่พวกเขายังเห็นว่าคุณต้องเลือกระหว่างรหัสมรดกที่โหดเหี้ยมหรือสร้างวงล้อใหม่เมื่อคุณมีนักเรียนใหม่ มีเพียงไม่กี่คนที่จะได้รับความสำเร็จจากซอฟต์แวร์ที่พวกเขาเขียน (ผู้เขียนปัจจุบันไม่สามารถต้านทานได้) และคุณไม่ต้องการส่งนักศึกษาจบการศึกษาที่มีแนวโน้มไปสู่ถนนสายนั้นถ้าคุณไม่รู้ว่าพวกเขาสามารถสร้างอาชีพได้
Wolfgang Bangerth

0

นี่ไม่ใช่คำตอบที่สมบูรณ์

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

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