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>
}
...
}
}
감사합니다!
+1 잘 제시된 질문의 경우 – pmg
올바른 대답을 얻는 것은 올바른 질문을하는 것입니다. '물론 그것은 스펙을 참조하는 데 상처를주지 않습니다. :) – Ricky