OpenMP에서 배열 감소 해결
OpenMP에서는 배열을 직접 줄이는 것은 지원되지 않습니다. 그러나 유사한 결과를 얻기 위한 대체 방법이 존재합니다.
첫 번째 방법:
한 가지 접근 방식은 각 스레드에 대한 배열의 전용 복사본을 생성하고 이를 로컬로 줄이는 것입니다. 병렬 섹션 이후 데이터 경합을 방지하기 위해 중요한 섹션을 사용하여 개인 어레이를 원래 어레이에 병합합니다.
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 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]; } } }
두 번째 방법은 특히 다중 소켓과 관련된 시나리오에서 더 효율적이지만 이를 방지하려면 신중한 메모리 처리가 필요합니다. 캐시 문제.
위 내용은 OpenMP에서 배열 축소를 효율적으로 수행하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!