심심해서 만들어 보는 중인 openMP 예제
처음에는 for 루프로 결과값을 thread safe하게 했는데 퍼포먼스 저하가 생길것 같아서
private 변수를 쓰레드별로 만들어서 계산후 마지막에 합치는 식으로 개선해 봄
음.. 다음번은 어떻게 개선해볼까나? ㅋ
처음에는 for 루프로 결과값을 thread safe하게 했는데 퍼포먼스 저하가 생길것 같아서
private 변수를 쓰레드별로 만들어서 계산후 마지막에 합치는 식으로 개선해 봄
음.. 다음번은 어떻게 개선해볼까나? ㅋ
#include "omp.h" #define BUFFLEN 4096 void thread() { int idx; int arr[BUFFLEN]; int res = 0; #pragma omp parallel { #pragma omp for for(idx = 0; idx < BUFFLEN; idx++) { arr[idx] = idx; } #pragma omp for for(idx = 0; idx < BUFFLEN; idx++) { #pragma omp critical { res += arr[idx]; } // printf("%d %d\n",idx, res); } } printf("res = %d\n",res); } int main(int argc, const char *argv[]) { thread(); return 0; }
#include "omp.h" #define BUFFLEN 4096 #define NUMTHREAD 4 void thread() { int idx; int arr[BUFFLEN]; int res = 0; int mid[NUMTHREAD]; // thread num - next version need to malloc #pragma omp parallel { // initialize #pragma omp for for(idx = 0; idx < BUFFLEN; idx++) arr[idx] = idx; #pragma omp for for(idx = 0; idx < NUMTHREAD; idx++) mid[idx] = 0; #pragma omp for for(idx = 0; idx < BUFFLEN; idx++) { int tid = omp_get_thread_num(); mid[tid] += arr[idx]; // printf("%d %d\n",idx, res); } #pragma omp single for(idx = 0; idx < NUMTHREAD; idx++) res += mid[idx]; } printf("res = %d\n",res); } int main(int argc, const char *argv[]) { thread(); return 0; }
'Programming > openMP' 카테고리의 다른 글
openMP parallel default (0) | 2013.11.18 |
---|---|
openMP gnu implement (0) | 2013.11.11 |
openMP로 구현한 야매 sum() (0) | 2013.09.25 |
openmp 제한자(?) (0) | 2013.09.20 |
openMP runtime 함수 및 환경변수 (0) | 2013.03.16 |