2013-10-04 2 views
1

OpenMP에 대한 도움이 필요합니다. 스레드가 for 루프에서 끝난다면 다른 스레드로 나눠 주는데 도움이 될까요? 나는 휴식 시간에 루프를 반복한다. 스레드는 동시에 종료하지 않으므로 많은 작업이있는 스레드와 다른 스레드가 완료됩니다. (따라서 사용되지 않는 코어가 있음). 내 프로그램을 corei7에서 실행하면 OpenMP가 루프를 8 개의 스레드로 나눕니다. 그러나 한 스레드가 작업을 수행 한 후 사용률이 떨어지기 시작합니다.OpenMP for 루프 최적화 스케줄

#pragma omp parallel for 
for(i = 0; i < Vector.size(); i++) { 
    for(j = 0; j < othervector.size(); j++) { 
     {some code} 
     if(sth is true) break; 
    } 
} 

감사합니다.

답변

2

for 루프의 루프 반복의 기본 나누기/SCHEDULE은 구현에 따라 다릅니다. 귀하의 경우에 omp parallel for을 사용할 때 기본 배열은 정적 일 수 있습니다. 즉, 벡터의 크기에 따라 각 스레드에 고정 된 청크가 할당됩니다. 분명히 작업로드를 정적으로 나누어 균형을 조정할 수 없으므로 DYNAMIC, GUIDED and RUNTIME 절을 확인하고 이것이 (가상) 코어의 활용도를 높이는 데 도움이되는지 확인해야합니다. 청크 크기에 따라 추가 오버 헤드가 발생하지만 정적으로 일정을 계획 할 때 코어가 유휴 상태로 머무르는 시간과 비교하면 무시할 수 있습니다.

원래 질문에 대답하려면 : 스레드가 다른 스레드의 작업을 계속할 수 있다고 생각하지 않습니다. 작업이 할당되면 각 스레드는 자체적으로 처리해야합니다. 여기 내가 시험해 보는 것이 있습니다.

#define CHUNKSIZE 100 

#pragma omp parallel for schedule(dynamic,chunk) nowait 
for(i = 0; i < Vector.size(); i++) { 
    for(j = 0; j < othervector.size(); j++) { 
     {some code} 
     if(sth is true) break; 
    } 
} 

사실 흐리 스토 일리 예프는 얼마 전에 비슷한 question에 아주 좋은 대답을 썼다.