Programming/openMP2013. 9. 25. 22:19

#include "omp.h"

#define BUFFLEN 32

int main(int argc, const char *argv[])
{
        int idx;
        unsigned char arr[BUFFLEN];
        int res = 0;

        #pragma omp parallel for
        for(idx = 0; idx < BUFFLEN; idx++)
        {
                arr[idx] = idx;
        }

        #pragma omp parallel for
        for(idx = 0; idx < BUFFLEN; idx++)
        {
//                #pragma omp atomic
                res += arr[idx];
                printf("%d %d\n",idx, res);
        }

        printf("res = %d\n",res);

        return 0;
}

위의 소스를 이용해서 실행시 결과가 달라지는 모습
 $ ./a.out
0 40
1 41
2 43
3 46
4 50
5 55
6 61
7 68
16 40
17 85
18 103
19 122
20 142
21 163
22 185
23 208
24 24
25 233
26 259
27 286
28 314
29 343
30 373
31 404
8 40
9 413
10 423
11 434
12 446
13 459
14 473
15 488
res = 488
 $ ./a.out
0 24
1 25
2 27
3 30
4 34
5 39
6 45
7 52
16 16
17 69
18 87
19 106
20 126
21 147
22 169
23 192
24 40
25 217
26 243
27 270
28 298
29 327
30 357
31 388
8 24
9 397
10 407
11 418
12 430
13 443
14 457
15 472
res = 472
 $ ./a.out
0 48
1 49
2 51
3 54
4 58
5 63
6 69
7 76
16 16
17 93
18 111
19 130
20 150
21 171
22 193
23 216
8 48
9 225
10 235
11 246
12 258
13 271
14 285
15 300
24 40
25 325
26 351
27 378
28 406
29 435
30 465
31 496
res = 496

res는 공유 변수로
각각의 쓰레드에서 동시에 계산을 하려다 보니 문제가 발생을 한다.

그런 이유로 res에 더하는 부분을 atomic 하게 처리한다면 다른 쓰레드에서
치고 들어올수 없기 때문에 깨지는 문제가 발생하지 않는다.
대신 lock을 걸거나 인터럽트를 막는 식으로 구현이 되기 때문에 성능 저하가 발생할수 있다.

이를 해결하려면...
어떻게 해야 하려나? 

'Programming > openMP' 카테고리의 다른 글

openMP gnu implement  (0) 2013.11.11
openMP example  (0) 2013.09.29
openmp 제한자(?)  (0) 2013.09.20
openMP runtime 함수 및 환경변수  (0) 2013.03.16
openMP 지시어  (0) 2013.03.16
Posted by 구차니