심심해서 만들어 보는 중인 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 |
