OpenMP에서 배열 축소
OpenMP에서는 배열 축소를 직접 수행할 수 없습니다. 그러나 배열 축소 병렬 처리를 달성하기 위한 대체 접근 방식이 있습니다.
첫 번째 방법: 전용 배열 및 중요 섹션
이 방법은 각 스레드에 대한 배열의 전용 복사본을 생성합니다. 각 스레드는 자체 배열을 채우고 임계 섹션은 결과를 최종 배열로 병합하는 데 사용됩니다.
int A[] = {84, 30, 95, 94, 36, 73, 52, 23, 2, 13}; 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]; } } }
두 번째 방법: 배열 확장 및 스레드 독립적 누적
이 방법은 모든 스레드에 걸쳐 확장된 배열을 생성합니다. 각 스레드는 배열의 해당 부분을 채운 다음 임계 섹션을 사용하지 않고 결과를 병합합니다. 이 접근 방식은 다중 소켓 시스템에서 주의 깊게 사용하지 않으면 캐시 문제가 발생할 수 있습니다.
int A[] = {84, 30, 95, 94, 36, 73, 52, 23, 2, 13}; 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에서 배열 축소를 어떻게 병렬화할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!