2017-03-20 1 views
1

내 프로그램을 실행하기 전에, 나는이 작업을 수행 :OpenMP에서 특정 스레드 ID를 고유 한 태스크 그룹으로 그룹화 할 수 있습니까?

#pragma omp parallel num_threads(48) 
{ 
    int id = omp_get_thread_num(); 
} 

병렬 구조의 각 스레드는 이제 프로세서 ID와 일치하는 ID가 있습니다

export KMP_AFFINITY=explicit,proclist=[0-47],granularity=fine 

나는 다음 48 개 스레드를 생성. 지금

...

프로세서 0 및 프로세서 (24)는 동일한 코어에 실제로. 프로세서 24에서 47까지는 0에서 23까지 하이퍼 스레딩되어 있습니다.

스레드가 사용하는 작업자 개체의 벡터가 있습니다. 그들은 자신의 ID를 기반으로 벡터에서 객체를 선택합니다.

하이퍼 스레드 된 코어가 특정 "작업자"개체와 쌍을 이루도록 시도한 다음 개체 내에서 작업 그룹을 사용하려고합니다.

class Worker { 
public: 
    int wId; 
    Worker(int i) { 
    wId = i; 
    } 
    void doWork() { 
    // Can I make a task group for the 2 threads reaching this code together? 
    // will barriers, taskgroups, critical pragmas wait for all 48 threads? 
    } 
}; 

int main() { 
    vector<Worker> workers; 
    for (int i = 0; i < 48; ++i) { 
    Worker w(i); 
    workers.push_back(w); 
    } 
    #pragma omp parallel num_threads(48) 
    { 
    int id = omp_get_thread_num(); 
    workers[id % 24].doWork(); 
    } 
} 

이와 같은 기능이 작동하는지 잘 모르겠습니다. 내 가정은 해당 doWork() 함수 내에서 taskgroup 또는 barrier 또는 critical pragma를 사용하면 객체를 공유해야하는 2 개의 스레드가 아닌 48 개의 모든 스레드에 영향을 미친다는 것입니다.

사실인가요? 내가 원하는 것을 수행하기 위해 알려진 프로세서 바인딩 (예 : 스레드 0과 스레드 23을 그룹에 넣음) 된 스레드 그룹을 만들려면 어떻게해야합니까?

+1

당신이 24 개 스레드의 첫 번째 수준으로, 중첩 된 병렬 처리를 고려 했

export OMP_NESTED=1 export OMP_MAX_ACTIVE_LEVELS=2 export KMP_HOT_TEAMS=1 export KMP_HOT_TEAMS_MAX_LEVEL=2 export OMP_PROC_BIND=spread,spread export OMP_PLACES=cores 

그리고이 다음은이 작업을 수행 할 수 있습니다 (코어에 연결됨) 및 2 단계 스레드의 두 번째 레벨 (동일한 코어의 2 개의 하이퍼 스레드를 사용합니다)? – Gilles

+0

@ Gilles - 예, 지금 테스트하려고하는 것이지만, 0/24, 1/25 등의 쌍을 동일한 코어에 고정하는 방법을 모르겠습니다. 나는 그것이'KMP_AFFINITY'와'num_threads' 인자에 대한 변경을 요구할 것임을 압니다.하지만 이것들을 정확히 설정하는 것이 확실하지 않습니다. – tmsimont

답변