2011-01-28 6 views
2

나는 스레드 풀이 OpenMP 문 (주로 병렬)을 포함 할 수있는 코드 블록을 실행할 것이라고 생각하고 있습니다. (유사 : How to deal with OpenMP thread pool contention) OpenMP 병렬 영역이 다른 스레드에 의해 매번 실행되면 문제가 발생하거나 성능이 저하 될 수 있는지 궁금합니다.스레드 풀에서 실행 된 OpenMP 코드

편집 :

대상 리눅스 (GCC) 및 Windows (MSVC를)입니다.

첫 번째 프로토 타입이 완성 될 때 벤치마킹 할 것입니다. (여기에 나와있는 대답의 영향을받습니다). 이제 Task의 인스턴스가 스레드 풀 (thread에 0, ..., 스레드-N)에 제공 만드는 상상

class Task 
{ 
public: 
    void doTask() 
    { 
     #pragma omp parallel 
     { 
      // do work in parallel 
     } 
    } 
}; 

:

다음은 간단한 예입니다. 하나의 스레드가 doTask()을 실행합니다. 나중에 동일한 Task 객체를 다시 스레드 풀에 넣고 다시 .... 그래서 doTask() (및 병렬 섹션)이 다른 스레드에 의해 실행됩니다. 이것이 OpenMP에 의해 효율적으로 처리되는지 궁금합니다 (예 : 섹션의 스레드가 매번 다시 작성되지 않음).

+0

어떤 컴파일러 에서요? –

+2

필자의 경험에 비추어 볼 때 코드가 성능 향상을 가져올지를 알 수있는 한 가지 방법이 있습니다. 무언가가 느리거나 가망이 없다면 생각하고 가설을 세우는 것은 구현이 지나치게 복잡하면 유용합니다. 현실적인 테스트 데모를 만들고 벤치마킹하십시오. –

답변

4

Vitor의 의견은 정확합니다. 답변이 여러 가지 요소 (예 : 데이터 레이아웃, 데이터 액세스 방법, 캐시 크기, 실행중인 프로세서 유형 및 목록)에 따라 달라 지므로 문제가 발생할지 여부를 판단하기가 어렵습니다. 계속).

내가 말할 수있는 것은,이 기능을 작동 시키거나 작동시키지 못할 수도 있다는 것입니다. 다른 스레딩 모델 대부분은 물론 OpenMP 사양도 모델이 "훌륭하게 함께 작동"하는지 여부에 대해 아무 말도하지 않습니다. 예를 들어 일부 OpenMP 구현이 기본 구현에 pthread를 사용하더라도 구현이 일부 작업을 수행하지 않으면 사용자는 직접 pthreads 라이브러리를 호출하여 OpenMP와 함께 작동시킬 수 없습니다. 현재이 예제는 gcc 버그 42616입니다 (pthread 내의 OMP가 적용된 루프가 충돌로 이어짐). 또 다른 예로 Intel이 있습니다. Intel의 컴파일러는 많은 병렬 모델을 지원하지만 함께 작동하도록 노력했습니다. 어떤 컴파일러를 사용할지 말하지 않았으므로, 내가 할 수있는 말은 작은 샘플 코드를 사용하여 커다란 작업을하기 전에 작동하는지 확인하는 것입니다.

나는 과거에 이렇게 해보았습니다. 나는 OpenMP 구조체를 사용하는 pthread를 사용했다. 내가 찾은 것은 응용 프로그램에서 괜찮 았던 것입니다. 각 pthread는 OpenMP 병렬 영역이 발생할 때 초기 스레드로 간주됩니다. OpenMP 런타임은 영역에 대한 추가 스레드를 작성하고 영역을 실행했습니다. 대부분의 OpenMP 구현은 스레드를 파괴하지 않지만 다른 영역이 발생할 때 재사용 할 수있는 빈 풀에 넣으면 오버 헤드가 잘 보였지만이 지역에서해야 할 일이 많았습니다. 이렇게 그것은 작동 할 수있다 - 그러나 당신은 조심해야한다.

+0

감사합니다. 요약하자면, 매우 안전한면에 있기를 원한다면 OpenMP 구조는 주 스레드에서만 실행되어야합니다. 하지만 버그 보고서에서 나는 그것이 작동해야하며, gcc에 대해서는 (적어도) 금지 된 것은 아무것도 아니라고 생각합니다. – tauran

관련 문제