2016-08-11 4 views
3

Visual Studio 2015를 사용하여 omp 작업을 사용할 수 없기 때문에 중첩 루프 작업에 대한 해결 방법을 찾으려고합니다. 다음과 같이 코드는 다음과 같습니다OMP 2.0 중첩 루프 For

#pragma omp parallel 
    { 
     for (i = 0; i < largeNum; i++) 
     { 
#pragma omp single 
     { 
      //Some code to be run by a single thread 
      memset(results, 0, num * sizeof(results[0])); 
     } 
#pragma omp for 
      for (n = 0; n < num; n++) { 
       //Call to my function 
       largeFunc(params[n], &resulsts[n]) 
      } 
     } 
#pragma omp barrier 
    } 

내 모든 스레드가 largeNum 시간을 실행하지만, memset 함수가 0으로 설정 될 때까지 기다려야 할 다음 내가 largeFunc 각 스레드에 의해 수행되어야합니다. 내가 찾은 데이터 의존성이 없습니다.

나는이 시점에서 omp 지시문이 모두 뒤죽박죽 인 것을 알게되었습니다. 이 솔루션이 작동합니까? 작업없이 할 수있는 더 좋은 방법이 있습니까?

감사합니다, 아리

+0

'for' 루프를'largeFunc'로'#pragma omp parallel for'을 사용하고 나머지 omp stuff를 제거하지 않는 이유는 무엇입니까? 그 루프는 당신이 평행하게 달리기를 원하는 유일한 것처럼 보입니다. – amaurea

+0

나는 threads를 통해 largeNum 루프를 나누고 싶지 않습니다. –

답변

1

무엇 그냥이 코드에 대한?

#pragma omp parallel private(i, n) 
for (i = 0; i < largeNum; i++) { 
    #pragma omp for 
    for (n = 0; n < num; n++) { 
     results[n] = 0; 
     largeFunc(param[n], &results[n]); 
    } 
} 

는 지금까지 내가 당신의 문제를 이해 한, intialisation 부분의 single 지침의 필요없이 알아서 results의 실제 유형은 또한 0으로 할당을 지원 제공되어야한다, 초기 코드가 부족한 private(i) 선언의 마지막으로 barrier은 필요하지 않습니다.

+0

@ Giles largeenum이 스레드 사이에서 분할되는 것을 원하지 않습니다. 단지 내부 루프 일뿐입니다. 이 구현은 내재 된 후에 내포 된 장벽을 가지고 있습니까? –

+1

이 구현은 모든 스레드가'i' 반복의 전체 범위를 실행하고 각각의 반복 내부에서'n' 루프에서 작업을 공유하는 스레드 팀을 생성합니다. 'omp for' 지시문의 끝에 암시적인 장벽이있어 모든 스레드가 현재의 것을 완료하기 전에 팀의 모든 스레드가 새로운'i' 반복을 시작하지 못하게합니다. 따라서 결국, 필자가 원했던 일을 수행한다. (내가 처음에 원했던 이유를 보지 못했지만 아마도 벤치마킹). – Gilles

+0

이 작업 :) 그리고 예 벤치마킹을위한 것 –

1

왜 모든 스레드가 largeNUM을 실행하게 하시겠습니까? 당신은 당신이 첫 번째를 원하는 느낌 그러나 당신이 그런 다음에

for (i = 0; i < largeNum; i++) 
    { 
     //Some code to be run by a single thread 
     memset(results, 0, num * sizeof(results[0])); 

#pragma omp parallel for 
     for (int n = 0; n < num; n++) { 
      //Call to my function 
      largeFunc(params[n], &resulsts[n]) 
     } 
    } 

의존하지 않으면 어떻게든지

#pragma omp parallel for 
    for (int i = 0; i < largeNum; i++) 
    { 
#pragma omp single 
    { 
     //Some code to be run by a single thread 
     memset(results, 0, num * sizeof(results[0])); 
    } 
#pragma omp barrier 

// #pragma omp for -- this is not needed since it has to be coarse on the outermost level. However if the below function does not have anything to do with the outer loop then see the next example 
     for (n = 0; n < num; n++) { 
      //Call to my function 
      largeFunc(params[n], &resulsts[n]) 
     } 
    } 

} 

예 경우에 largeFunc 내부 인덱스 난에 의존 않습니다. 일반적으로 가장 바깥 쪽 루프를 병렬 처리합니다. 내부 루프에 pragma를 배치하면 수행 할 작업이 충분하지 않으면 오버 헤드로 인해 코드가 느려질 수 있습니다.

+0

아무런 종속성이 없습니다. 내부에 pragma를 두지 않으면 스레드가 결합되지 않습니까? 오버 헤드를 최소화하기 위해 쓰래드를 유지하려고 노력 중입니다 –

+0

그래서 어떤 종류의 의존성도 가지지 않으십니까? 운이 좋다면'#pragma omp for nowait'을 사용할 수 있습니다. nowait은 암벽 장벽을 제거합니다. – itsnevertoobadtoaskforhelp

+0

내부 스레드 뒤에 모든 스레드가 있어야한다는 점을 제외하고는 종속성이 없습니다. –