2012-03-24 2 views
3

저는 과학적 컴퓨팅 커뮤니티를위한 방정식의 선형 시스템 (Ax = b 형식)을 반복적으로 해결하기위한 코드를 개발 중입니다.Scientific Computing :: OpenMP 또는 Pthreads

필자는 BLAS와 LAPACK을 기본 행렬 서브 루틴에 사용했지만 수동 병렬 처리를위한 범위가 있음을 알게되었습니다. 나는 OpenMP와 PThreads라는 두 가지 선택을 할 수있는 공유 메모리 시스템을 연구 중이다.

시간이 가장 좋은 요소 (코드의 성능은 &)가 아니라고 가정하면 더 나은 미래의 증거가 될 수 있으며 휴대용 (CUDA) 방식으로 병렬화 될 수 있습니까? 성능 향상에 가치가있는 Pthread를 사용하는 데 소요 된 시간입니까?

내 응용 프로그램 (기본적으로 여러 가지 작업을 한 번에 시작한 다음 모든 작업에서 "최상의"값으로 작업하는 방식)은 명시 적 스레드 제어의 이점을 얻을 것이라고 생각하지만 코딩이 어려워집니다. 너무 많은 시간을 들여 결국에는 성과가 없을 것입니다.

나는 이미 비슷한 질문을 거의 보지 않았지만 모두 일반적인 응용 프로그램에 관한 내용입니다.

This 하나는 Linux의 일반적인 멀티 스레드 응용 프로그램에 관한 것입니다.

This도 일반적인 질문입니다.

SciComp.SE에 대해 알고 있지만 주제에 대해 더 많은 것을 느꼈습니다.

+0

"기본적으로 많은 일들을 한 번에 시작한 다음 모든 것을"최상의 "가치로 조작하는 것과 관련이 있습니다."나는 [CPlex] (http://www-01.ibm.com/software/integration/) 최적화/cplex-optimizer /)는 귀하와 유사한 알고리즘을 제공합니다. 그들이 선택한 병렬 처리 도구에 대해 모르는 것이지만 어쩌면 알아낼 수도 있습니다 (반드시 선택이 최선이라고는 할 수 없지만 항상 알고있는 것이 좋습니다). – Francesco

+0

부스트 쓰레드는 C++를 사용한다면 pthreads (또는 무엇이든)에 아주 좋은 인터페이스를 제공합니다. 그만한 가치가있다. 하지만 나는 프로그래밍의 용이함 때문에 결국 openmp를 선택했다. 또한 intel IPP/TBB를 고려하십시오. – Anycorn

+0

BLAS 또는 LAPACK을 사용하는 경우 왜 Eigen 대신 사용합니까? 그것은 SIMD (SSE)와 OpenMP를 지원합니다. –

답변

7

OpenMP의 코딩 효율이 Pthreads보다 높고 Pthreads의 실행 효율성이 OpenMP보다 높을 것으로 예상하는 것처럼 질문을 읽습니다. 일반적으로 당신이 옳다고 생각합니다. 그러나 얼마 지나지 않아 내 컴퓨터의 시간보다 내 시간이 중요하고 OpenMP를 선택하기로 결정했습니다. 그것은 제가 후회해야 할 결정이 아니며 유효성을 입증 할만한 확실한 결정을 내린 결정도 아닙니다.

그러나 OpenMP 및 Pthreads에 대한 선택이 제한적이라고 생각하는 것은 잘못입니다. MPI (나는이 사실을 적어도 들어 보았다고 가정하고, 그렇지 않다면 다시 게시하십시오) 또한 공유 메모리 시스템에서도 실행됩니다. 일부 응용 프로그램의 경우 MPI는 공유 메모리 컴퓨터에서 OpenMP보다 성능이 뛰어날 수 있도록 프로그래밍 할 수 있습니다.

3 년 전 (+/- 몇 년 전) 과학 개발자 도구 상자의 필수 병렬 처리 도구는 OpenMP와 MPI였습니다. 이러한 도구를 사용하는 사람은 Pthreads 및 MPI 사용자 커뮤니티보다 큰 (일화적인 증거가있는) 대규모 사용자 커뮤니티의 일부였습니다. 오늘날 GPU 및 기타 가속기가 자리를 잡으면 서 상황이 훨씬 더 단편화되어 HMPP, ACC, Chapel, MPI-3, OpenMP4, CUDA, OpenCL 등에서 우승자 중 한 명을 선택하기가 어렵습니다. OpenMP + MPI는 유용한 조합이지만 블록의 새로운 애들을 무시할 수는 없습니다.

FWIW 저는 지구 물리학 응용 프로그램을위한 전산 EM 코드의 개발에 힘 쓰고 있습니다. 그래서 아주 핵심적인 '과학적 컴퓨팅'입니다.

+0

글쎄, 공유 메모리에서 BLAS 대신 ScaLapack을 실행 해 보았지만 Hello World 자체가 너무 힘들어서 오프 패싱이 발생하지 않았습니다. 내가 잘못 본 것이 아니라면, CUDA는 pthread "model"을 기반으로합니까? 나는 CUDA에 대한 많은 경험이 없지만 CuBlas 코드가 쓰여진 것처럼 보이지만, pthreads와 유사합니다. 내 응용 프로그램이 곧 GPU로 이식 될 것이라 확신한다면 무엇을 추천하겠습니까? 다른 모든 요소는 그다지 중요하지 않습니다. –

+0

좋은 조언을 제공하기에 GPU 컴퓨팅에 대한 충분한 경험이 없습니다. –

+0

GPU 컴퓨팅! = 일반 병렬 컴퓨팅. OpenCL/CUDA와 동일한 보트에 OpenMP/MPI/"OS threads"를 두는 것은 이상한 일입니다. – rubenvb

1

내 대답은 내가 impatients 먼저 결론을 가하고있어 꽤 긴 너무임을 깨닫게 :

짧은 답변 :

내가 OpenMP를하고 pthreads의 본질적으로 동일 말할 것입니다 당신이해야 어느 쪽이든 당신을 위해 최소 dev 시간을 요구하십시오 (아마 당신의 필요에 맞는 경우 openMP).그러나 개발 시간을 투자하고 싶다면 다른 패러다임에 적응할 수 있도록 코드를 재 설계해야합니다 (예 : 벡터화로 SSE/AVX 또는 GPU 활용).

개발 :

당신이 선형 해법을 개발하는 경우, 나는 당신의 코드가 될 (매우) 긴 수명 (즉, 아마 그것을 사용하는 물리적 모델을 오래 살 것) 것입니다 가정합니다. 이러한 상황에서 특히 대규모 개발 팀이없는 경우에는 개발 시간, 유지 보수성 및 선택의 폭을 우선적으로 고려해야한다고 생각합니다.

또한 "최선의 선택" "최고"라는 뜻)은 내일 "최고의"선택이 아닐 것입니다. 따라서 openMP 대 pthreads 문제가 발생 했더라도 (심지어 스펙트럼이 이미 @ HighPerformanceMark의 답변에서 설명한 것보다 큽니다.) 앞으로 선택할 수있는 대안이 더 많을 것으로 예상됩니다.

지금 개발할 시간이 있다면 코드에서 모든 계산 집약적 인 커널을 추상화하여 다른 병렬화 패러다임에 쉽게 적용 할 수 있다면 더 많은 투자를 할 수 있다고 말하고 싶습니다. GPGPU 계산을 병합 할 경우 기존의 캐시 최적화 방식과 다른 순서로 데이터를 배치해야합니다.

결론적으로 모든 스레드 기반 솔루션은 본질적으로 성능 및 코드 아키텍처 측면에서 모두 동일하므로 최소한의 개발 시간으로 솔루션을 선택해야합니다. 그러나 개발 시간을 투자하고 싶다면 코드를 병렬화하거나 벡터화하여 SSE/AVX 또는 GPU를 활용할 수 있도록 코드를 재 설계해야합니다. 이렇게하면 하드웨어/소프트웨어 발전을 따라 성능을 유지할 수 있습니다.

+0

".. : 모든 스레드 기반 솔루션은 본질적으로 성능과 코드면에서 동일합니다 아키텍처), 최소한의 개발 시간을 필요로하는 솔루션을 선택해야합니다. "OpenMP에서 코드를 작성하는 것이 Pthreads보다 훨씬 빠르기 때문에 OpenMP가 사실이라고 가정하면 OpenMP가 기본 우승자가 아닙니다. –

+0

@Nunoxic 네,하지만 pThreads는 OpenMP가 (코드를 개발하는 것이 더 어려울지라도) 할 수있는 모든 것을 할 수 있습니다. 반대로 OpenMP가 할 수없는 것들이 있습니다 (또는 쉽게 할 수없는 것들이 있습니다)하지만 pThreads 수 있습니다. (실제 예제로서 [이 질문 (http://stackoverflow.com/q/9685403/1225607)을보십시오.] 여러 개의 중첩 된 OpenMP 구조가 이웃과 다른 작업을 수행하는 단일 스레드를 설정하는 데 필요할 때 그러한 일은 pThreads 구현에서 아무 문제도 일으키지 않았을 것입니다. – Francesco

+0

단순함과 유연성의 전형적인 경우. 꿰매다. 감사 +1! –

0

이미 우수한 답변을 추가하려면 : OpenMP는 일반적으로 pthread를 작성할 때보다 코드를 병렬 처리하는 것이 더 효과적입니다. OpenMP가 더 쉽다는 것을 감안할 때, 필자가 선택할 수있는 것이라면 항상 선택하겠습니다. 나는 당신이 pthread 전문가가 아니므로이 질문을하고 있다면, pthread보다 OpenMP를 사용하는 것이 좋습니다.