OpenMP에서 배열 줄이기
OpenMP는 광범위한 애플리케이션에 대한 병렬 실행 기능을 제공합니다. 그러나 OpenMP에서 직접 지원하지 않는 배열 축소와 관련하여 일반적인 질문이 발생합니다.
대체 솔루션
기본 배열 축소를 사용할 수 없지만 대체 방법이 있습니다. C/C에서 유사한 기능을 달성하려면 :
방법 1: Critical을 사용한 Private Array Reduction 섹션
이 접근 방식에서 각 스레드는 배열의 개인 복사본에서 작동하여 기여도를 누적합니다. 모든 스레드가 완료되면 개별 배열 요소를 원래 배열로 병합하기 위해 중요한 섹션이 사용됩니다.
int S [10] = {0}; #pragma omp parallel { int S_private[10] = {0}; #pragma omp for for (int n=0 ; n<10 ; ++n ) { for (int m=0; m<=n; ++m){ S_private[n] += A[m]; } } #pragma omp critical { for(int n=0; n<10; ++n) { S[n] += S_private[n]; } } }
방법 2: 스레드-로컬 배열 감소
이 방법은 10*n스레드 차원의 중간 배열을 생성하여 임계 영역을 제거합니다. 스레드는 이 배열을 병렬로 채운 다음 이를 원래 배열로 병합합니다.
int S [10] = {0}; int *S_private; #pragma omp parallel { const int nthreads = omp_get_num_threads(); const int ithread = omp_get_thread_num(); #pragma omp single { S_private = new int[10*nthreads]; for(int i=0; i<(10*nthreads); i++) S_private[i] = 0; } #pragma omp for for (int n=0 ; n<10 ; ++n ) { for (int m=0; m<=n; ++m){ S_private[ithread*10+n] += A[m]; } } #pragma omp for for(int i=0; i<10; i++) { for(int t=0; t<nthreads; t++) { S[i] += S_private[10*t + i]; } } } delete[] S_private;
이러한 접근 방식은 OpenMP의 기본 배열 축소 부족을 극복하여 배열 요소를 병렬로 효율적으로 축적할 수 있습니다.
위 내용은 OpenMP가 직접 지원되지 않는 경우 배열 축소를 어떻게 달성할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!