병렬 유한 요소 계산에서 메시 관리를위한 최상의 방법론?


11

현재 산란 문제의 해결을 위해 도메인 분해 방법을 개발 중입니다. 기본적으로 Helmholtz BVP 시스템을 반복적으로 해결하고 있습니다. 삼각 메쉬 또는 사면체 메쉬에 유한 요소 방법을 사용하여 방정식을 이산합니다. 박사 학위 논문에 대한 코드를 개발 중입니다. 나는 deal.ii 또는 DUNE와 같은 기존의 유한 요소 라이브러리를 알고 있으며 영감을주는 디자인과 API로 학습 목적을 위해 훌륭하다고 생각하지만 작은 응용 프로그램을 처음부터 개발하고 싶었습니다.

직렬 버전을 실행하고 있고 병렬화하려는 시점에 있습니다. 결국, 최소한 원칙적으로 병렬화하기 쉬운 알고리즘을 공식화하는 것이 도메인 분해 프레임 워크의 장점 중 하나입니다. 그러나 실제로는 고려해야 할 많은 세부 사항이 있습니다. 메시 관리도 그 중 하나입니다. 응용 프로그램이 많은 CPU로 잘 확장되는 동안 높은 해상도를 얻으려면 모든 CPU에서 전체 메시를 복제하는 것이 비효율적입니다.

고성능 컴퓨팅 환경에서 유사한 응용 프로그램을 사용하는 개발자에게이 문제를 처리하는 방법을 문의하고 싶었습니다.

분산 메쉬 관리를위한 p4est 라이브러리가 있습니다. 균일 한 메쉬 만 사용하는 데 관심이 있고 삼각 메쉬를 다듬을 수 있는지 확실하지 않기 때문에 AMR이 필요하지 않으므로 과잉이 될 수 있습니다. 또한 균일 한 메쉬를 만든 다음 메쉬 파티 셔너 중 하나에 공급하고 출력의 사후 처리를 수행 할 수도 있습니다.

가장 간단한 방법은 특정 파티션과 관련된 메시 정보를 포함하는 각 파티션에 대해 별도의 파일을 만드는 것 같습니다. 이 파일은 단일 CPU에서 읽을 수 있으며,이 CPU는 메시의 해당 부분에 개별 시스템의 조립을 담당합니다. 물론 일부 글로벌 파티션 연결 / 이웃 정보도 프로세스 간 통신을 위해 모든 CPU에서 읽은 파일에 저장해야합니다.

다른 어떤 접근법이 있습니까? 여러분 중 일부가 공유 할 수 있다면, 업계에서 일반적으로 사용되는 방법 또는이 문제를 처리하는 데 관련된 정부 연구 기관은 무엇입니까? 나는 병렬 유한 요소 솔버를 프로그래밍하는 것에 익숙하지 않아서이 문제에 대해 올바르게 생각하고 있는지 여부와 다른 사람들이 어떻게 접근하고 있는지 느끼고 싶었습니다. 관련 연구 기사에 대한 조언이나 조언은 대단히 감사하겠습니다!

미리 감사드립니다!


메시 파티 셔 너를 찾고 있다면 METIS를 선택하는 것이 좋습니다. ParMETIS도 확인하십시오. 메시 관리는 다른 이야기입니다. ITAPS iMesh는 여러분을위한 솔루션이 될 수 있습니다. 또한 여기에 내 질문에 대한 답변을 확인하시기 바랍니다 : scicomp.stackexchange.com/questions/4750/...
르지 Bzowski

@ KrzysztofBzowski : Scotch 라이브러리를 사용해 보셨습니까? 유한 요소에 관해서는 Scotch와 Metis의 차이점이 무엇인지 궁금합니다. iMesh 프로젝트는 매우 흥미로운 것 같습니다. 앞으로 며칠 안에 더 읽어 볼 것입니다. 나는 거래 II에 대해 알고있다. 얼마 전에 openMesh를 살펴본 것을 기억하지만 처음부터 필요한 기능을 구현하는 것이 더 쉬울 것이라고 생각했습니다. 순차 메쉬의 경우 기본적으로이 백서 링크에 표시된 절반 가장자리 / 얼굴 데이터 구조를 조정했습니다. 감사합니다!
midurad

답변:


7

AMR을 사용하지 않고 1K-4K 코어 이상으로 확장하지 않으려면 간단하게 수행하십시오.

  1. Rank 0은 전체 메시를 읽고 METIS / Scotch 등을 사용하여 분할합니다 (참고 : 이것은 직렬 작업입니다).

  2. Rank 0은 요소 / 노드 파티셔닝 정보를 다른 모든 순위로 브로드 캐스트하고 메모리를 해제합니다 (메시 저장에 사용)

  3. 모든 순위는 동일한 입력 파일에서 자신이 소유 한 노드 / 요소 (고스트 노드 포함)를 읽습니다 (참고 : 동일한 입력 파일에 액세스하는 2000 순위는 느리게 들릴 수 있지만 실제로는 아닙니다. 파일 시스템에는 좋지 않을 수 있지만 한 번만하고 있습니다).

  4. 모든 등급은 BC 적용 및 매트릭스 조립을 위해 로컬 대 글로벌 노드 / 요소 / dof 매핑을 생성하고 노드의 번호를 다시 매겨 야합니다.

모든 것을 말하고 수행 한 후에는 순위에있는 모든 데이터가 로컬에 있으므로 잘 확장 할 수 있어야합니다 (현명한 메모리). 나는이 모든 것을 작은 코드로 약 100 줄 ( 여기 에서 35-132 줄 참조 )으로 수행합니다.

이제 메시가 너무 커서 (예를 들어,> 1 억-2 억 5 천만 요소) 단일 노드에서 METIS를 사용하여 분할 할 수없고 ParMETIS / PT-Scotch가 필요한 경우 모든 코어 / 계급이 읽을 수 있습니다. 이러한 시나리오에서는 논리적 이유로 분할 단계를 기본 코드와 분리하는 것이 더 쉬울 수 있습니다.

Btw AMR 라이브러리는 일반적으로 테트를 수행하지 않습니다. 또한 PETSc는 코드 병렬화에 적합합니다.

편집 : 여기여기를 참조 하십시오 .


코드를 공유해 주셔서 감사합니다! 나는 위에서 설명한 경로를 취할 것입니다. 가장 복잡하지 않은 것 같습니다. 나는 이미 그것에 대해 어떻게 생각하는지 알고 있습니다. 또한 MPI 프로그래밍에서 좋은 연습이 될 것입니다. AMR 라이브러리는 일반적으로 테트를 처리하지 않는다고 언급했습니다. 삼각형 메쉬의 쿼드 트리가 품질이 좋지 않은 메쉬로 이어질 수 있다고 말하면 순진한 개선 때문일까요? 쿼드를 정제하는 것은 쉬운 것처럼 보이지만 품질을 유지하려면 tet를 4로 나누는 것이 어려워 보입니다. PETSc 용 C ++ 래퍼가 있습니까? C를 사용할 수는 있지만 C ++이 더 좋습니다.
midurad

@midurad C보다 C ++을 선호하는 경우 PETSc와 비슷한 C ++ 라이브러리 인 Trilinos를 고려해야합니다. 또한 Trilinos에는 메시 파티셔닝을 수행하는 데 사용할 수있는 패키지 (Zoltan)가 있습니다.
Dr_Sam

@midurad PETSc를 사용하는 경우 MPI 호출이 거의 필요하지 않습니다. 정제는 쉽지만 관련 동적 데이터 구조를 효율적으로 처리하려면 약간의 생각과 노력이 필요할 수 있습니다. C ++과 함께 PETSc를 사용할 수 있어야하지만 요구 사항에 따라 libmesh가 가능한 옵션 일 수 있습니다 (AMR 및 Tets를 지원한다고 생각합니다).
stali

정보를 주셔서 감사합니다. 매우 도움이되었습니다.
midurad

2

II. 그러나 여기에 나의 관점이 있습니다 : 학생들과 이야기 할 때, 나는 처음에 그들 자신의 프로토 타입을 개발하라고 지시합니다. 그러나 일단 작은 달리기를 한 후에는 기본적으로 모든 단계를 수행하면서 바퀴를 재발 명 할 필요가 없으므로 훨씬 더 멀리 갈 수있는 라이브러리를 사용하게합니다.

귀하의 경우, 간단한 Helmholtz 솔버를 구현하는 방법을 이미 보았습니다. 그러나 다음 6 개월 동안 코드를 작성하는 데 필요한 코드를 작성하고 더 복잡한 형상을 사용하려면 3 개월을 더 소비하게됩니다. 효율적인 솔버를 원할 경우 6 개월이 더 소요됩니다. 그리고이 모든 시간에 당신은 이미 다른 사람이 작성한 코드를 작성하고 있으며, 어떤 의미에서, 박사 학위를 위해 실제로해야 할 일에 더 가까워지지 않습니다. 전에 했어. 이 길을 따라 가면 다른 사람들이 한 일을 다시 수행하는 데 2-3 년의 박사 학위를, 아마도 새로운 일을하는 데 1 년이 걸릴 것입니다.

대안은 이제 기존 라이브러리 중 하나를 배우는 데 6 개월을 소비하지만 그 후에는 새로운 일을하는 데 2-3 년이 걸리며 매주마다 고문 사무실에 들어가서 그를 보여줄 수있는 것들이 있습니다. 그녀는 정말로 새롭거나 대규모로 실행되거나 다른 측면에서 매우 시원합니다. 아마 지금까지 내가 어디로 가고 있는지 알 것 같습니다.


3
당신이 이것에 대해 분명히 권위가 있기 때문에 정직한 질문입니다. deal과 같은 차세대 프레임 워크를 누가 쓸 것입니까? 우리는 이미 프로그램을 컴파일 한 적이없는 신입 박사 과정 학생들의 문제 추세를 이미보고 있습니다. 평균 코드 개발 기술이 계산 과학자의 지속적인 감소에있는 것처럼 보입니다.
Aurelius

1
좋은 질문입니다. 당신은 내가 그랬던 것처럼 머리가 완고하고 완고한 대학원생이 필요합니다 :-) 그러나 내 대답은 아마도 우리 가 그것을 할 사람 이 명 필요하기 때문에 모든 사람들 이 수년간의 삶을 반복 하도록 권장해야한다는 것을 의미하지는 않습니다 다른 사람들이 이미 구현 한 것
Wolfgang Bangerth

2
예, 충분합니다. 지난 20 년 동안 CFD 연구 세계를지지 해 온 가장 큰 것 중 하나 인 IMO는 소프트웨어 엔지니어링 인력의 부족과 그레이 비어드에 의한 현대적인 소프트웨어 관행 거부입니다. 프레임 워크를 제외하고, 많은 박사 과정 학생들은 잘못된 레거시 코드와 현대 하드웨어에서 현대 수치 방법에 필요한 복잡한 소프트웨어를 신속하게 구성 할 수 없기 때문에 보류됩니다.
Aurelius

나는 greybeards에 대한 진술에 동의하지 않습니다 (요즘은 회색으로 변하고 있습니다 ...). 그러나 그들은 또한 새로운 대학원생이있을 때 잔인한 레거시 코드 중에서 선택하거나 바퀴를 재발 명해야한다는 것을 알았습니다. 자신이 작성하는 소프트웨어 (현재 저자는 견딜 수 없음)로 성공하는 것을 즐기는 사람은 거의 없으며, 경력을 쌓을 수 있는지 모른다면 유망한 대학원생을 그 길로 보내지 않으려 고합니다.
Wolfgang Bangerth

0

이것은 완전한 답변이 아닙니다.

병렬 도메인 분해 방법을 구현할 때 몇 가지 복잡한 문제가 발생했습니다. 첫째, 하나의 서브 도메인에 많은 프로세서를 사용하거나 많은 서브 도메인으로 하나의 프로세서에 피드를 제공 할 수 있으며 두 패러다임을 구현하려고 할 수 있습니다. 둘째, 구조화 된 형태의 도메인 분해 방법은 서브 도메인 (요소가 아닌)면, 모서리, 정점을 분리해야한다. 이러한 복잡성이 병렬 메시 관리에 쉽게 포함되지는 않는다고 생각합니다. 하나의 서브 도메인에 대해 하나의 프로세서를 고려하고 중복되는 RAS / RASHO 방법을 사용하면 상황이 더 단순 해집니다. 이 경우에도 병렬 레이아웃을 직접 관리하는 것이 좋습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.