Programming/openMP
openMP reduction 절
구차니
2013. 11. 28. 12:08
reduction은 수동으로 병합할 변수를 자동으로 합쳐주는 역활을 한다.
[링크 : http://gcc.gnu.org/.../Implementing-REDUCTION-clause.html#Implementing-REDUCTION-clause]
예전에 sum() 병렬 처리 함수의 경우
atomic이나 critical을 사용해 데이터 동기화를 맞추었지만 성능저하가 있었고
2013/09/25 - [Programming/openMP] - openMP로 구현한 야매 sum()
이를 개선하기 위해 계산후
마지막에 마스터 쓰레드에서 합치도록 했는데
2013/09/29 - [Programming/openMP] - openMP example
이런 마스터 쓰레드 합침을 reduction(+:sum) 으로 간단하게 동일한 방식을 이용해 처리할 수 있다.
[링크 : http://gcc.gnu.org/.../Implementing-REDUCTION-clause.html#Implementing-REDUCTION-clause]
예전에 sum() 병렬 처리 함수의 경우
atomic이나 critical을 사용해 데이터 동기화를 맞추었지만 성능저하가 있었고
2013/09/25 - [Programming/openMP] - openMP로 구현한 야매 sum()
이를 개선하기 위해 계산후
마지막에 마스터 쓰레드에서 합치도록 했는데
2013/09/29 - [Programming/openMP] - openMP example
이런 마스터 쓰레드 합침을 reduction(+:sum) 으로 간단하게 동일한 방식을 이용해 처리할 수 있다.
$ cat test.c #include "omp.h" #define BUFFLEN 4096 #define NUMTHREAD 4 void thread() { int idx; int arr[BUFFLEN]; int res = 0; #pragma omp parallel { // initialize #pragma omp for for(idx = 0; idx < BUFFLEN; idx++) arr[idx] = idx; #pragma omp for reduction(+:res) for(idx = 0; idx < BUFFLEN; idx++) { int tid = omp_get_thread_num(); res += arr[idx]; } } printf("res = %d\n",res); } int main(int argc, const char *argv[]) { thread(); return 0; }