Programming/openMP2013. 9. 29. 11:10
심심해서 만들어 보는 중인 openMP 예제
처음에는 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
Posted by 구차니