2011-03-13 12 views
8

OpenMP에서 다차원의 난처하게 병렬 루프를 병렬화하는 적절한 방법은 무엇입니까? 크기의 수는 컴파일 타임에 알려지지 만 크기가 클 수는 없습니다. 그들 중 누구라도 하나, 둘, 또는 백만 일 수 있습니다. 확실히 나는 N omp parallel의는 N 차원 루프 ...다차원 중첩 OpenMP 루프

생각을하지 않으려 :

  • 문제는 개념적으로 간단합니다. 가장 바깥 쪽의 '큰'루프 만 병렬화해야하지만 루프 크기는 컴파일 타임에 알 수 없으므로 변경 될 수 있습니다.

  • 동적으로 omp_set_num_threads(1)#pragma omp for schedule(static, huge_number)을 설정하면 특정 루프 병렬화가 작동하지 않게됩니까? 이것은 원하지 않는 부작용/오버 헤드가 있습니까? 괴롭다는 느낌.

  • OpenMP Specification (2.10, A.38, A.39)은 준수 및 비 규격 중첩 병렬 처리의 차이점을 알려주지 만이 문제에 대한 최선의 방법을 제시하지 않습니다.

  • 루프를 재정렬 할 수는 있지만 캐시 미스가 많이 발생할 수 있습니다. 언롤은 가능하지만 사소하지는 않습니다. 다른 방법이 있습니까?

는 여기에 내가 병렬화하고 싶은 내용은 다음과 같습니다

for(i0=0; i0<n[0]; i0++) { 
    for(i1=0; i1<n[1]; i1++) { 
    ... 
     for(iN=0; iN<n[N]; iN++) { 
     <embarrasingly parallel operations> 
     } 
    ... 
    } 
} 

감사합니다!

+0

+1 잘 제시된 질문의 경우 – pmg

+1

올바른 대답을 얻는 것은 올바른 질문을하는 것입니다. '물론 그것은 스펙을 참조하는 데 상처를주지 않습니다. :) – Ricky

답변

8

here과 같이 collapse 지시어가 사용자가 찾고있는 것일 수 있습니다. 이것은 근본적으로 하나의 루프를 형성 할 것이고, 이것은 하나의 루프를 parallized하고, 이러한 종류의 상황을 위해 설계되었습니다. 그래서 당신은 할 것입니다 :

#pragma omp parallel for collapse(N) 
for(int i0=0; i0<n[0]; i0++) { 
    for(int i1=0; i1<n[1]; i1++) { 
    ... 
     for(int iN=0; iN<n[N]; iN++) { 
     <embarrasingly parallel operations> 
     } 
    ... 
    } 
} 

그리고 모두 설정하십시오.

+0

고마워요! 당, 그거 쉽지. 나는 그것이 어떤 이유로 작동하지 않을 것이라고 생각하고 잊어 버렸습니다. 예. 그냥 옳은 것처럼 보입니다. 그리고'#omp parallel {#omp for collapse {#omp parallel {#omp for collapse {...}}}} '와 같이 중첩 된 것처럼 보입니다. 그것이 좋은 생각은 아니지만 큰 데이터 세트에 대한 함수 평가를 위해 f (g (x))가 완벽하게 유효해야합니다. 어쨌든 감사합니다! – Ricky

+2

두 가지 유의 사항. 첫째, 축소 절은 OpenMP V3.0 이상에서만 발생합니다. 둘째, collapse 절을 ​​사용할 때 루프 반복 변수를 특별히 private로 만들지 않아도되지만, collapse 절을 ​​제거하면 위와 같이 (C99 구문을 사용하여) 선언하거나 private 절에 넣는 것이 좋습니다 . 그렇지 않으면 공유되며 문제가 발생합니다. – ejd

+1

gcc 4.4.4를 사용하여 3.0을 구현합니다. 확인하라고 상기시켜 줘서 고마워. 그리고 저는'#pragma omp parallel default (none)'을 좋아합니다. 그래서 당신은 부주의하지 않습니다. 또한 참고로 인덱스는 배열 요소, 즉 int i [N]'일 수 없습니다. 컴파일러 오류. – Ricky