더 빠르게 실행되는 시뮬레이션을 작성하는 방법


16

CFD에서 모든 과제를 수행하기 위해 프로그래밍 언어로 파이썬을 사용하기 시작했습니다. 프로그래밍 경험이 거의 없습니다. 저는 기계 공학 분야 출신이며 항공 우주 공학 분야의 고등 교육을 추구하고 있습니다.

때때로 CFD의 컴퓨팅 측면은 방정식을 조작하거나 수학을 수행하는 것보다 지루합니다.

프로그램을보다 빠르게 실행시키는 일반적인 지침은 무엇입니까? 병렬 처리를 수행하는 요령은 무엇입니까? 더 빨리 실행되는 코드를 작성하는 방법?

위의 질문에 답할 수있는 자료 (나 같은 평신도에게 이해하기 쉬운)는 어디서 구할 수 있습니까?



@ Dan, 나는 그렇게 생각하지 않습니다. 나는 새로운 이민자 프로그래밍 전술을 이해하는 데 도움이되는 가능한 모든 자료를 요구하고있다. 특정 요구 사항이나 조건이 없습니다. 더 구체적으로 말하면 코드를 더 우아하게 만드는 데 도움이되는 리소스를 요구하고 있습니다.
Subodh

파이썬에 고정되어 있습니까? 아니면 C ++을 고려 하시겠습니까? 이 경우 C ++을 배우고 오픈 소스 라이브러리 (내 경우에는 OpenFOAM)를 찾고 처음부터 개발하지는 않지만 고급 코드를 배우고 그 측면에 대해 배우고 변경하고 실험은 공기 역학적 시뮬레이션과 같은 특정 목적으로 구동됩니다.
tmaric

@ tomislav-maric, 대단히 감사합니다. 나는 엄격한 'pythonian'이 아닙니다. 사실,이 분야에 새로 온 사람이기 때문에, 내 앞에는 많은 옵션이 있다고 생각합니다. OpenFOAM도 배우고 있습니다. 그래서 나는 프로젝트를 시작하고 그것을 통해 (또는 짧게 손을 더럽히는) 배우어야한다는 견해에 동의합니다.
Subodh

@ smj btw, 나는 기계 공학 분야에서 왔으며 이제는 컴퓨터 과학 대학원생입니다 (기계 공학은 이것을 준비하지 못했습니다) ... OF와 함께 작업하는 경우 C ++ 책을 검색하십시오. 스택 오버플로에 나열하고 학습을 시작하십시오. C ++, OpenFOAM 및 전산 과학 지식의 3 가지가 필요합니다. OpenFOAM 및 전산 과학을 통해 수지상 방식으로 학습 할 수 있습니다. 과제를 찾아서 완료하여 필요한 것을 따라 학습하십시오. 무언가를 끝내면 동기가됩니다. C ++의 경우 : C ++ Primer로 시작하여 배우십시오. 행운을 빕니다! :)
tmaric

답변:


19

파이썬을 구체적으로 요구한다는 점을 고려하여 귀하의 질문에 대답하려고 노력할 것입니다. 시뮬레이션 문제를 해결하는 방법을 설명하겠습니다. 더 빠른 시뮬레이션 전략이이 설명에 나와 있습니다.

먼저, 파이썬으로 새로운 시뮬레이션을 프로토 타이핑합니다. 물론 NumPySciPy 를 최대한 활용하려고 노력합니다 . NumPy는 수치 시뮬레이션에 적합한 어레이 데이터 유형을 제공하는 반면, SciPy는 NumPy 어레이로 작업하는 광범위한 수치 루틴을 제공합니다.

프로토 타입이 어느 정도 작동하면 프로그램이나 스크립트의 어느 부분이 병목 현상인지 알아 봅니다. 이에 대한 일반적인 후보가 있습니다.

  • 파이썬의 루프는 느립니다. 아주 느린.
  • Python은 duck typing을 사용하므로 함수 호출이 느려질 수 있습니다.

간단한 프로파일 링 전략을 사용하여 모든 런타임이 소비되는 위치를 습득합니다. IPython 쉘 (충분히 추천 할 수 없음)을 사용하여 스크립트를 다음과 같이 실행합니다.

%timeit script.py

이 "마법 명령"은 프로파일 링을 수행합니다 ( timeit 사용) ) 스크립트가 종료 된 후 시간을 목록으로 표시합니다. 이 목록을 사용하여 코드가 너무 느린 위치를 찾으십시오.

속도를 높여야하는 부분을 정리 한 후에는 컴파일 된 언어 사용을 고려할 수 있습니다. 나는 두 가지 해결책을 지적 할 것이다.

먼저 Cython 언어가 있습니다. Cython은 Python과 매우 유사한 프로그래밍 언어입니다 (사실, Python 코드는 종종 유효한 Python 코드이기도합니다). 그러나 Cython 컴파일러는 Cython 파일을 C 코드로 변환 한 다음 Python에서 사용 가능한 모듈로 컴파일 할 수 있습니다. Cython은 NumPy 배열을 이해합니다. Cython을 사용하면 두 가지 방법으로 도움을받을 수 있습니다. 먼저 데이터 유형을 소개 할 수 있습니다. 함수 호출 속도가 빨라집니다. 또한 배열을 반복하면 루프가 더 빨리 실행됩니다 (사실 더미 변수와 배열을 모두 입력하면 일반 C 루프가 나타납니다!). 둘째, 내 실험에서 형식화되지 않은 스크립트조차도 해석되지 않고 컴파일되었다는 사실 때문에 조금 더 빠르게 실행됩니다.

유용한 다른 컴파일 된 언어는 포트란입니다. 파이썬에서 포트란을 사용하는 방법에는 여러 가지가 있습니다 ( f2py , fortwrap , Cython ) . 나에게 개인적으로 f2py가 가장 쉬운 방법 인 것처럼, 나는 그것이 무엇을하는지 빨리 설명 할 것입니다. f2py는 포트란 코드를 파이썬 모듈로 컴파일 할 수 있습니다. NumPy 배열을 파이썬 공간의 입력 및 출력 변수로 사용할 수 있습니다. 포트란 공간에서는 일반적인 포트란 배열이됩니다. 최대 포트란 속도로 조작 할 수 있습니다.

개인적으로 함수 호출 수가 병목 현상이 발생하는 Cython을 사용하는 경향이 있습니다. 루프가 많은 항목의 경우 f2py를 선호합니다 (강한 포트란 배경이 있기 때문에).

Fortran에 대한 추가 참고 사항 : 현대 Fortran은 NumPy와 매우 유사하게 읽고 씁니다. 구문은 매우 가깝습니다. 따라서 NumPy 코드를 Fortran 코드로 쉽게 변환 할 수 있습니다.

Cython과 f2py는 어떤 방식 으로든 패러 시즘을 지원합니다. Cython의 경우 여기 에서 도움말을 찾을 수 있지만 Fortran의 경우 OpenMP 또는 MPI 와 같은 표준 기술이 있습니다 . 또한 MPI를위한 Python 래퍼가 있습니다. 도 있습니다. 개인적으로, 나는 파이썬 레벨에서 mpi4py를 사용하고 포트란에서 OpenMP를 사용합니다.

H.-P의 Python Scripting For Computational Science 책을 추천 해 드리겠습니다. Langtangen은 일반적으로 Python과 Python을 조금 더 빠르게 만드는 전략에 대한 훌륭한 리소스입니다. 불행히도, AFAIR는 Cython에 대해서는 언급하지 않았습니다. 두 번째 자료 로이 슬라이드를수 있습니다 . 이것들은이 게시물에서 언급 한 모든 것에 대한 예를 제공합니다 ( 여기 의 코드 및 소스 참조 ). 인터넷에는 다른 좋은 슬라이드 세트가 많이 있습니다.

보다 구체적인 질문이 있으시면 기꺼이 도와 드리겠습니다!


1
Python 프로파일 러에 대한 개요는 코드 최적화에 대한 scipy 강의를 참조하십시오 .
데니스

7

CFD + Python의 경우 솔루션이 있습니다 : http://pythonflu.wikidot.com/ 이것들은 OpenFOAM 위에 파이썬 바인딩입니다 (이것은 이미 질문에 대한 의견에서 언급되었습니다). 이 바인딩은 "솔버 레벨"에서의 프로그래밍을 가능하게합니다 (원래 OpenFOAM 솔버가 파이썬에서 복제되고 원본보다 느리지 않은 예가 있습니다. 다른 응답에서 언급 된 느린 루프는 여기서 "내부 루프"가 발생할 때 문제가되지 않습니다 OpenFOAM의 C ++ 코드에서).

이러한 바인딩의 장점은 OpenFOAM의 모든 병렬화가 솔버 레벨 아래에서 발생하므로이를 방해 할 필요가 없습니다 (OpenFOAM 코어가 처리하는 다른 것들 : 입력 / 출력, 선형 솔버, 연산자 이산화)

따라서 새로운 솔버를 작성하고 OF 코어 (경계 조건, 선형 솔버 등)에 새로운 기능을 추가하지 않으려는 경우 PythonFlu로 충분할 수 있으며 C ++ (학습 치료법보다 훨씬 높은 학습 치료법)을 피할 수 있습니다 파이썬)

추신 : 원래 원래 질문에 대한 토론에 이것을 주석으로 추가하고 싶었지만 내 명성으로 인해 이것을 허용하지 않습니다.


안녕 베른하르트! Scicomp에 오신 것을 환영합니다! :)
tmaric
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.