Phương pháp tốt nhất để quản lý một lưới trong tính toán phần tử hữu hạn song song?


11

Tôi hiện đang phát triển một phương pháp phân rã miền cho giải pháp cho vấn đề tán xạ. Về cơ bản, tôi đang giải quyết một hệ thống các Helmholtz BVPs lặp đi lặp lại. Tôi phân biệt các phương trình bằng phương pháp phần tử hữu hạn trên các lưới tam giác hoặc tứ diện. Tôi đang phát triển mã hướng tới luận án tiến sĩ của tôi. Tôi biết một số thư viện phần tử hữu hạn hiện có như deal.ii hoặc DUNE và mặc dù tôi nghĩ chúng rất tuyệt, với thiết kế và API đầy cảm hứng, vì mục đích học tập tôi muốn phát triển ứng dụng nhỏ của riêng mình từ đầu.

Tôi đang ở thời điểm mà tôi có các phiên bản nối tiếp của mình đang chạy và bây giờ tôi muốn song song hóa chúng. Xét cho cùng, đó là một trong những thế mạnh của khung phân rã miền để hình thành các thuật toán dễ song song, ít nhất là về nguyên tắc. Trong thực tế, có nhiều chi tiết người ta phải xem xét. Quản lý lưới là một trong số đó. Nếu các ứng dụng là để đạt được độ phân giải cao trong khi nhân rộng tốt cho nhiều CPU, thì việc sao chép toàn bộ lưới trên mỗi CPU là không hiệu quả.

Tôi muốn hỏi những nhà phát triển làm việc trên các ứng dụng tương tự trong môi trường điện toán hiệu năng cao về cách họ giải quyết vấn đề này.

Có thư viện p4est để quản lý lưới phân tán. Tôi không cần AMR vì vậy nó có thể là quá mức vì tôi chỉ quan tâm đến việc sử dụng các lưới đồng nhất và tôi không chắc liệu nó có thể tinh chỉnh các lưới tam giác hay không. Tôi cũng có thể chỉ cần tạo một lưới đồng nhất sau đó đưa nó vào một trong các phân vùng lưới và thực hiện một số xử lý bài của đầu ra.

Cách tiếp cận đơn giản nhất dường như tạo một tệp riêng cho mỗi phân vùng chứa thông tin lưới chỉ liên quan đến phân vùng cụ thể đó. Tập tin này sẽ được đọc bởi một CPU duy nhất chịu trách nhiệm lắp ráp hệ thống riêng biệt trên phần lưới đó. Tất nhiên, một số thông tin vùng lân cận / kết nối phân vùng toàn cầu cũng sẽ cần được lưu trữ trong một tệp được đọc bởi tất cả các CPU để liên lạc giữa các quá trình.

Những cách tiếp cận khác đang ở ngoài kia? Nếu một số bạn có thể chia sẻ, một số phương pháp thường được sử dụng trong ngành hoặc các tổ chức nghiên cứu của chính phủ liên quan đến việc xử lý vấn đề này là gì? Tôi còn khá mới mẻ khi lập trình một bộ giải phần tử hữu hạn song song và tôi muốn cảm nhận liệu tôi có nghĩ đúng về vấn đề này hay không và cách người khác tiếp cận nó. Bất kỳ lời khuyên hoặc gợi ý cho các bài viết nghiên cứu có liên quan sẽ được đánh giá rất cao!

Cảm ơn trước!


Nếu bạn đang tìm kiếm phân vùng lưới - METIS sẽ là lựa chọn tốt. Kiểm tra ParMETIS. Quản lý lưới là câu chuyện khác nhau, ITAPS iMesh có thể là giải pháp cho bạn. Vui lòng kiểm tra câu trả lời cho câu hỏi của tôi ở đây: scicomp.stackexchange.com/questions/4750/ mẹo
Krzysztof Bzowski

@KrzysztofBzowski: bạn đã sử dụng thư viện Scotch chưa? Tôi đã tự hỏi sự khác biệt giữa Scotch và Metis là gì khi nói đến các yếu tố hữu hạn. Dự án iMesh có vẻ rất thú vị. Tôi sẽ đọc thêm về nó trong vài ngày tới. Tôi biết về deal.II và DUNE. Tôi nhớ đã xem xét openMesh một thời gian trước nhưng hình dung rằng việc triển khai các chức năng tôi cần từ đầu sẽ dễ dàng hơn. Đối với các mắt lưới liên tiếp, về cơ bản tôi đã điều chỉnh cấu trúc dữ liệu nửa cạnh / mặt được trình bày trong liên kết giấy này Cảm ơn!
midurad

Câu trả lời:


7

Nếu bạn không sử dụng AMR và không muốn mở rộng ra ngoài lõi 1K-4K thì chỉ cần làm điều này.

  1. Xếp hạng 0 đọc toàn bộ lưới và phân vùng bằng METIS / Scotch, v.v. (Lưu ý: Đây là thao tác nối tiếp).

  2. Xếp hạng 0 phát thông tin phân vùng phần tử / nút cho tất cả các cấp bậc khác và giải phóng bộ nhớ (được sử dụng để lưu trữ lưới)

  3. Tất cả các xếp hạng đọc các nút / phần tử mà chúng sở hữu (bao gồm các nút ma) từ cùng một tệp đầu vào (Lưu ý: 2000 xếp hạng truy cập vào cùng một tệp đầu vào nghe có vẻ chậm nhưng không thực tế, mặc dù nó có thể không tốt cho hệ thống tệp nhưng sau đó chúng tôi có thể xấu chỉ làm một lần).

  4. Tất cả các cấp bậc cần tạo ánh xạ nút / phần tử / dof cục bộ để toàn cầu để áp dụng BC và lắp ráp ma trận và đánh số lại các nút.

Sau khi mọi thứ được nói và thực hiện, tất cả dữ liệu trên một thứ hạng sẽ là cục bộ, do đó bạn sẽ có thể mở rộng quy mô (bộ nhớ khôn ngoan). Tôi làm tất cả điều này trong khoảng 100 dòng (xem dòng 35-132 ở đây ) trong một mã nhỏ của tôi.

Bây giờ nếu lưới của bạn quá lớn (ví dụ:> 100-250 triệu phần tử) mà bạn không thể phân vùng nó bằng METIS trên một nút và cần ParMETIS / PT-Scotch thì bạn có thêm công việc phân vùng song song trước tất cả các lõi / cấp bậc có thể đọc nó. Trong kịch bản như vậy, có thể dễ dàng tách giai đoạn phân vùng khỏi mã chính vì lý do hậu cần.

Libw AMR libs thường không làm gì. Ngoài ra PETSc là lựa chọn tốt để song song hóa mã của bạn.

Chỉnh sửa: Cũng xem ở đâyở đây .


Cảm ơn đã chia sẻ mã của bạn! Tôi rất có thể sẽ đi theo con đường bạn đã vạch ra ở trên. Có vẻ như ít phức tạp nhất và tôi đã có một ý tưởng về cách đi về nó. Ngoài ra, nó sẽ là một bài tập tốt trong lập trình MPI. Bạn đã đề cập rằng các lib AMR thường không xử lý các vòi. Có phải bởi vì một sàng lọc ngây thơ nói rằng một cây tứ giác của một lưới tam giác có thể dẫn đến lưới chất lượng kém? Tinh chỉnh quads có vẻ dễ dàng nhưng chia một tet thành bốn dường như khó khăn nếu người ta muốn giữ chất lượng. Có một trình bao bọc C ++ cho PETSc không? Tôi có thể sử dụng C, nhưng C ++ sẽ tốt hơn.
midurad

@midurad Nếu bạn thích C ++ hơn C, bạn nên xem xét Trilinos, đây là một thư viện C ++ có thể so sánh với PETSc. Hơn nữa, Trilinos có một gói (Zoltan) mà bạn có thể sử dụng để thực hiện phân vùng lưới.
Dr_Sam

@midurad Bạn chỉ cần rất ít cuộc gọi MPI nếu bạn sử dụng PETSc. Tinh chỉnh các vòi nên dễ dàng nhưng xử lý (hiệu quả) với các cấu trúc dữ liệu động liên quan có thể đòi hỏi một số suy nghĩ và công việc. Bạn sẽ có thể sử dụng PETSc với C ++ nhưng với yêu cầu của bạn, libmesh có thể là một lựa chọn khả thi (tôi nghĩ rằng nó hỗ trợ AMR và tets).
stali

Cảm ơn tất cả các thông tin. Điều đó rất hữu ích.
midurad

2

Điều này có thể không gây ngạc nhiên cho bạn khi tôi phát triển thỏa thuận .II, nhưng đây là quan điểm của tôi: Khi tôi nói chuyện với sinh viên, tôi thường bảo họ phát triển nguyên mẫu của riêng họ ngay từ đầu để họ có thể thấy nó đã được thực hiện như thế nào. Nhưng sau đó, khi họ có một thứ gì đó nhỏ bé đang chạy, tôi bắt họ sử dụng một thư viện cho phép họ đi xa hơn bởi vì họ không phải phát minh lại bánh xe với mỗi bước cơ bản họ thực hiện.

Trong trường hợp của bạn, bạn đã thấy cách triển khai bộ giải Helmholtz đơn giản. Nhưng bạn sẽ dành 6 tháng tiếp theo để viết mã cần thiết để thực hiện song song, bạn sẽ mất thêm 3 tháng nữa nếu bạn muốn sử dụng hình học phức tạp hơn. Sau đó, bạn sẽ dành thêm 6 tháng nữa nếu bạn muốn một người giải quyết hiệu quả. Và tất cả thời gian này bạn đang viết mã đã được viết bởi người khác và điều đó, theo một nghĩa nào đó, sẽ không giúp bạn tiến gần hơn đến những gì bạn thực sự cần làm cho Tiến sĩ của mình: phát triển một thứ mới chưa từng có thực hiện trước. Nếu bạn đi trên con đường này, bạn sẽ dành 2-3 năm thời gian làm Tiến sĩ để làm lại những gì người khác đã làm và có thể 1 năm làm một việc mới.

Thay thế là bây giờ bạn dành 6 tháng để học một trong những thư viện hiện có, nhưng sau đó bạn sẽ có 2-3 năm để thực sự làm những thứ mới, những thứ mà mỗi tuần bạn có thể đến văn phòng cố vấn của mình và cho anh ấy xem một cái gì đó thực sự mới, chạy trên quy mô lớn, hoặc rất tuyệt vời trong các khía cạnh khác. Tôi nghĩ bây giờ bạn có thể thấy tôi đang đi đâu với điều này.


3
Câu hỏi trung thực vì bạn rõ ràng là người có thẩm quyền về vấn đề này: ai sẽ viết thế hệ khung tiếp theo như deal.ii nếu không có ai trong vụ nghiên cứu tiến sĩ hiện tại giải quyết vấn đề như thế này? Chúng ta đã thấy một xu hướng có vấn đề của các sinh viên tiến sĩ sắp tới thậm chí chưa bao giờ biên soạn một chương trình. Đối với tôi, điều hơi đáng lo ngại là các kỹ năng phát triển mã trung bình dường như liên tục giảm trong các nhà khoa học tính toán.
Aurelius

1
Đó là một câu hỏi công bằng. Bạn cần học sinh tốt nghiệp như xương đầu và bướng bỉnh như tôi :-) Nhưng câu trả lời của tôi là chỉ vì chúng ta có thể cần một vài người làm điều đó, điều đó không có nghĩa là chúng ta nên khuyến khích mọi người dành nhiều năm cho cuộc sống của họ. những gì người khác đã thực hiện.
Wolfgang Bangerth

2
Vâng, đủ công bằng. IMO, điều lớn nhất duy nhất kìm hãm thế giới nghiên cứu CFD trong 20 năm qua là thiếu tài năng kỹ thuật phần mềm và từ chối các thực hành phần mềm hiện đại của các greybeards. Bỏ qua các khung, rất nhiều sinh viên tiến sĩ bị kìm hãm bởi mã kế thừa xấu và không thể nhanh chóng xây dựng các phần mềm phức tạp cần thiết cho các phương pháp số hiện đại trên phần cứng hiện đại.
Aurelius

Tôi không đồng ý với tuyên bố về màu xám (mặc dù ngày nay tôi cũng chuyển sang màu xám ...). Nhưng họ cũng thấy rằng bạn phải lựa chọn giữa các mã kế thừa tồi tệ hoặc phát minh lại bánh xe khi bạn có một học sinh mới tốt nghiệp. Rất ít người có được thành công với phần mềm họ viết (tác giả hiện tại không chịu được) và bạn không muốn gửi một sinh viên tốt nghiệp đầy triển vọng xuống con đường đó nếu bạn không biết rằng họ có thể tạo nên sự nghiệp của nó.
Wolfgang Bangerth

0

Đây không phải là một câu trả lời đầy đủ.

Để thực hiện các phương pháp phân rã miền song song, tôi gặp một số biến chứng. Đầu tiên, người ta có thể sử dụng nhiều bộ xử lý cho một tên miền phụ hoặc cung cấp một bộ xử lý có nhiều tên miền phụ và người ta có thể muốn thực hiện cả hai mô hình. Thứ hai, hình thức cấu trúc của các phương thức phân rã miền đòi hỏi phải tách ra các mặt, cạnh, đỉnh của các tên miền phụ (không phải phần tử). Tôi không nghĩ rằng những biến chứng này dễ dàng được đưa vào quản lý lưới song song. Tình huống sẽ trở nên đơn giản hơn nếu bạn xem xét một bộ xử lý cho một tên miền phụ và sử dụng phương thức RAS / RASHO chồng chéo. Ngay cả trong trường hợp này, bạn sẽ tự mình quản lý bố cục song song tốt hơn,

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.