나는 스레드 풀이 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에 의해 효율적으로 처리되는지 궁금합니다 (예 : 섹션의 스레드가 매번 다시 작성되지 않음).
어떤 컴파일러 에서요? –
필자의 경험에 비추어 볼 때 코드가 성능 향상을 가져올지를 알 수있는 한 가지 방법이 있습니다. 무언가가 느리거나 가망이 없다면 생각하고 가설을 세우는 것은 구현이 지나치게 복잡하면 유용합니다. 현실적인 테스트 데모를 만들고 벤치마킹하십시오. –