petsc4py 대 c / c ++ / fortran 사용의 효율성


11

petsc4py와 c / c ++ / fortran의 속도는 어느 정도입니까?

코드가 실행되는 코드에 크게 의존한다는 것을 알고 있지만 매트릭스 벡터 제품과 같은 간단한 것은 어떻습니까?

답변:


11

이것은 과학적 프로그래밍 커뮤니티에서 널리 알려진 관심사이며, 성능 불확실성은 계산 과학의 주요 "신화"중 하나라고 생각합니다.

으로 @fcruz 나와, petsc4pyPETSc 라이브러리에 대한 래퍼가 아닌 파이썬에서 PETSc의 재 구현입니다. 따라서 어레이를 PETSc로 복사하거나 PETSc에서 복사하거나 드라이버 코드 / 함수 호출의 오버 헤드로 인해 성능 저하가 발생할 수 있습니다. petsc4py매우 신중하게 구현되며 이해하는 한numpy다차원 배열 인터페이스를 사용하면 복사 오버 헤드를 피할 수 있습니다. 필자가 작업하는 대부분의 유스 케이스에서 Python 작업시 성능 저하는 10-40 % 정도이며, 종종이 성능 저하를 보완하는 것 이상의 다른 방식으로 얻을 수 있습니다. 사실, 제가 경험 한 더 경험이 많은 HPC Python 개발자들은이 성능 차이가 보통 훨씬 더 줄어들 수 있으며, 파이썬이 계산 비용이 많이 드는 코드를 구동 할 때 분명히 그럴 것이라고 생각합니다.

petsc4py저장소 자체가 성능 / 유연성의 균형을 설명하는 유용한 예제들을 제공합니다. 찾는 위치 petsc4py라는 데모 소스 저장소 perftest파이썬 드라이버 (제공 포트란 커널을 통해 C 드라이버를 모두 사용하여 방정식의 비선형 시스템을 해결, App.f90해당 디렉토리를). 여기에서 성능 오버 헤드는 10 % 정도입니다.

구체적인 예로, 병렬 그리드 관리를 위해 PETSc에 인터페이스하는 소프트웨어 패키지 인 PyClaw , 셀 인터페이스의 Riemann 문제를 해결하기위한 레거시 포트란 커널을 연구하는 과학자 팀의 일원입니다 . Fortran 드라이버에서 전환하여 성능 저하에 대해 상당히 신중하게 연구했으며, 회의 논문의 표 1에서 5 페이지 하단에 결과가 나와 있습니다. 이 경우 코드를 PETSc 및 Fortran에 쉽게 인터페이스하고 수만 개의 코어에서 효율적으로 병렬로 실행하는 기능을 위해 약간의 온 코어 성능을 교환했습니다.


또한 구조화되지 않은 작은 코드와 비슷한 문제가 있습니다. PETSc는 데이터 구조와 솔버 만 제공하지만 PETSc를 조립하고 해결하기 전에 메쉬 (최대 4GB 입력 파일), 분할, 매핑 생성, 요소 반복, 로컬 (요소) 강성 매트릭스 계산 등을 읽어야합니다. . 이 비 PETSc 관련 항목, 특히 I / O, 매핑 및 요소 수준 계산에 대해서는 파이썬이 느리지 않습니다. 어쨌든 나머지 코드는 단순하기 때문입니다.
stali

요소 수준 계산은 일반적으로 커널로 전달됩니다 (의 App.f90소스 참조 perftest). I / O에는 성능 차이가 없습니다. 더 높은 수준의 패키지를 위해 FEniCS 를 살펴 보셨습니까 ?
Aron Ahmadia

네 말이 맞아 나는 아이디어를 얻지 만 내 특별한 경우에는 코드의 약 90 % 인 많은 커널 (다른 유형의 요소, 요소 레벨 계산, 매핑 등의 모양 함수)이 있습니다. 나는 잠시 후 Fenics를 보았고 외부 메쉬를 다루고 BC를 부과하는 것과 같은 많은 세부 사항이 언뜻보기에 명확하지 않았거나 더 복잡해 보였습니다 (적어도 나에게는). 게다가 나는 CStranon이 아닌 사람들을 위해 사용하기에 상당히 간단한 Fortran을 사용합니다. 나는 실제로 내 작업을 위해 파이썬보다 쉽다는 것을 알았다.
stali

7

Petsc4py는 PETSc에 액세스하는 또 다른 방법이지만 python 또는 petsc4py는 바인딩을 제공하므로 파이썬에서 병렬 PDE 솔버 개발 노력을 줄이는 PETSc 데이터 구조 및 루틴에 액세스 할 수 있습니다. (그 규모).

PETSc는 솔버에 여러 레벨의 추상화를 제공하며 PETSc를 사용하여 자신의 솔버를 구현할 수도 있습니다. 가장 낮은 수준의 소프트웨어 추상화에서 PETSc는 BLAS, LAPACK 및 MPI를 사용하며, 최대한 구현 속도만큼 빠릅니다.

이제 pets4py는 cython을 사용하여 PETSc에 대한 바인딩을 구현합니다. cython 사용의 오버 헤드는 PETSc에서 수행 될 계산량과 관련이 있습니다. PETSc의 고급 PDE 솔버를 사용하는 경우 오버 헤드가 작아 걱정할 필요가 없습니다.

PETSc와 GEMV의 성능 비교보다 더 중요한 질문은 PETSc가 작업에 적합한 도구인지 여부입니다. 사소한 병렬 PDE 솔버를 구현해야하는 경우 PETSc가 실제로 도움이 될 것입니다. 그러나 많은 GEMV를 수행해야하는 경우 BLAS 라이브러리가 필요합니다. 행운을 빕니다!

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