Programming/openMP2013. 11. 26. 19:31
single은 쓰레드 중 하나만 실행하고
master는 마스터 쓰레드 에서 실행은 한다.

어떻게 보면.. 하나의 쓰레드에서만 실행하되
그것이 마스터 쓰레드냐, 아니면 생성된 것들 중 하나만 이냐의 차이로 보일수도 있겠지만
fork 나 createthread의 오버헤드 없이 이미 실행중인 '마스터 쓰레드'에서 하는 것보다는 느릴수 밖에 없을테니.. 이려나?

 In addition to nesting limitations single construct can be implemented slower than master construct because it is more complicated and flexible. You may want to check your particular implementation, but in general master can be implemented faster, so multiple invocations of it may benefit comparing tosingle nowait construct.

[링크 : http://stackoverflow.com/.../what-is-the-benefit-of-pragma-omp-master-as-opposed-to-pragma-omp-single

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

openMP reduction 절  (0) 2013.11.28
openMP atomic과 critical  (0) 2013.11.26
openMP parallel default  (0) 2013.11.18
openMP gnu implement  (0) 2013.11.11
openMP example  (0) 2013.09.29
Posted by 구차니
Programming/openMP2013. 11. 18. 21:55
openMP가 shared memory 구조를 지원한다고 하는데
다르게 말하면 함수나 block 구현시
private 메모리가 생성되는걸 응용하여 사용하는것 같은 느낌

그리고 이러한 공유 변수의 제어는 default 키워드를 이용하는데
default(shared)가 기본 값이고 none으로 할 경우 별도의 변수를 선언을 해주어야 한다.

#pragma omp parallel
default(shared|none)
private
firstprivate
lastprivate 

$ cat test.c
#include "omp.h"

void thread()
{
        int res = 0;
#pragma omp parallel default(none)
{
//      int res = 0;
        // initialize
        printf("res = %d\n",res);
}
}

int main(int argc, const char *argv[])
{
        thread();
        return 0;
}

gcc -fopenmp test.c -lm
test.c: In function ‘thread’:
test.c:16:8: error: ‘res’ not specified in enclosing parallel
test.c:12:9: error: enclosing parallel
make: *** [all] 오류 1 

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

openMP atomic과 critical  (0) 2013.11.26
openMP single 과 master의 차이점  (0) 2013.11.26
openMP gnu implement  (0) 2013.11.11
openMP example  (0) 2013.09.29
openMP로 구현한 야매 sum()  (0) 2013.09.25
Posted by 구차니
Programming/openMP2013. 11. 11. 21:31
pdf로 보다가 이제야 깨달은 엄청난 내용 -ㅁ-!
어떻게 보면 매우 당연하고 간단한 내용이지만
libgomp에서의 private 구현의 scope를 이용하여
block의 시작부분에서 동일한 이름의 변수를 생성하여 "복제"를 함으로 firstprivate 변수를 생성하고
block의 끝부분에서 바깥 scope의 변수로 값을 복제함으로서 lastprivate를 구현 변수를 동기화 한다.

다르게 보면.. private를 통한 shared memory 구조는
메모리 copy를 통한 함수범위 변수로 private를 구현한거라고 보면 될 듯하다.

4.8 Implementing FIRSTPRIVATE LASTPRIVATE COPYIN and COPYPRIVATE clauses

This seems simple enough for PARALLEL blocks. Create a private struct for communicating between the parent and subfunction. In the parent, copy in values for scalar and "small" structs; copy in addresses for others TREE_ADDRESSABLE types. In the subfunction, copy the value into the local variable.

It is not clear what to do with bare FOR or SECTION blocks. The only thing I can figure is that we do something like:

     #pragma omp for firstprivate(x) lastprivate(y)
     for (int i = 0; i < n; ++i)
       body;
which becomes

     {
       int x = x, y;
     
       // for stuff
     
       if (i == n)
         y = y;
     }
where the "x=x" and "y=y" assignments actually have different uids for the two variables, i.e. not something you could write directly in C. Presumably this only makes sense if the "outer" x and y are global variables.

COPYPRIVATE would work the same way, except the structure broadcast would have to happen via SINGLE machinery instead.
 
[링크 : http://gcc.gnu.org/./Implementing-FIRSTPRIVATE-LASTPRIVATE-COPYIN-and-COPYPRIVATE-clauses.html]

[링크 : http://gcc.gnu.org/onlinedocs/libgomp/]
[링크 : http://gcc.gnu.org/onlinedocs/libgomp/The-libgomp-ABI.html#The-libgomp-ABI]

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

openMP single 과 master의 차이점  (0) 2013.11.26
openMP parallel default  (0) 2013.11.18
openMP example  (0) 2013.09.29
openMP로 구현한 야매 sum()  (0) 2013.09.25
openmp 제한자(?)  (0) 2013.09.20
Posted by 구차니
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 구차니
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 구차니
Programming/openMP2013. 9. 20. 16:06
키워드 별로 아래와 같이 한번 정리를 해봐야겠다..
문서에 따라서 clause 구분이 애매한것도 문제이니..
(parallel과 parallel for 라던가?)


[링크 : http://www.mimul.com/pebble/default/2012/05/30/1338342349153.html]

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

openMP example  (0) 2013.09.29
openMP로 구현한 야매 sum()  (0) 2013.09.25
openMP runtime 함수 및 환경변수  (0) 2013.03.16
openMP 지시어  (0) 2013.03.16
visual studio express 2008에서는 openMP 공식 지원안해!  (0) 2013.03.16
Posted by 구차니
Programming/openMP2013. 3. 16. 17:34
#pragma omp 확장 외에도
openMP 지원을 위한 런타임 함수들과 환경변수들을 지원하는데
런타임 함수에 은근히 lock 관련이 있다는 사실에 놀라는 중.

2 Runtime Library Routines
  2.1 omp_get_active_level() - Number of parallel regions
  2.2 omp_get_ancestor_thread_num() - Ancestor thread ID
  2.3 omp_get_dynamic() - Dynamic teams setting
  2.4 omp_get_level() - Obtain the current nesting level
  2.5 omp_get_max_active_levels() - Maximum number of active regions
  2.6 omp_get_max_threads() - Maximum number of threads of parallel region
  2.7 omp_get_nested() - Nested parallel regions
  2.8 omp_get_num_procs() - Number of processors online
  2.9 omp_get_num_threads() - Size of the active team
  2.10 omp_get_schedule() - Obtain the runtime scheduling method
  2.11 omp_get_team_size() - Number of threads in a team
  2.12 omp_get_thread_limit() - Maximum number of threads
  2.13 omp_get_thread_num() - Current thread ID
  2.14 omp_in_parallel() - Whether a parallel region is active
  2.15 omp_in_final() - Whether in final or included task region
  2.16 omp_set_dynamic() - Enable/disable dynamic teams
  2.17 omp_set_max_active_levels() - Limits the number of active parallel regions
  2.18 omp_set_nested() - Enable/disable nested parallel regions
  2.19 omp_set_num_threads() - Set upper team size limit
  2.20 omp_set_schedule() - Set the runtime scheduling method
  2.21 omp_init_lock() - Initialize simple lock
  2.22 omp_set_lock() - Wait for and set simple lock
  2.23 omp_test_lock() - Test and set simple lock if available
  2.24 omp_unset_lock() - Unset simple lock
  2.25 omp_destroy_lock() - Destroy simple lock
  2.26 omp_init_nest_lock() - Initialize nested lock
  2.27 omp_set_nest_lock() - Wait for and set nested lock
  2.28 omp_test_nest_lock() - Test and set nested lock if available
  2.29 omp_unset_nest_lock() - Unset nested lock
  2.30 omp_destroy_nest_lock() - Destroy nested lock
  2.31 omp_get_wtick() - Get timer precision
  2.32 omp_get_wtime() - Elapsed wall clock time
3 Environment Variables
  3.1 OMP_DYNAMIC - Dynamic adjustment of threads
  3.2 OMP_MAX_ACTIVE_LEVELS - Set the maximum number of nested parallel regions
  3.3 OMP_NESTED - Nested parallel regions
  3.4 OMP_NUM_THREADS - Specifies the number of threads to use
  3.5 OMP_SCHEDULE - How threads are scheduled
  3.6 OMP_STACKSIZE - Set default thread stack size
  3.7 OMP_THREAD_LIMIT - Set the maximum number of threads
  3.8 OMP_WAIT_POLICY - How waiting threads are handled
  3.9 OMP_PROC_BIND - Whether theads may be moved between CPUs
  3.10 GOMP_CPU_AFFINITY - Bind threads to specific CPUs
  3.11 GOMP_STACKSIZE - Set default thread stack size

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

openMP로 구현한 야매 sum()  (0) 2013.09.25
openmp 제한자(?)  (0) 2013.09.20
openMP 지시어  (0) 2013.03.16
visual studio express 2008에서는 openMP 공식 지원안해!  (0) 2013.03.16
TBB - Threading Building Blocks by intel  (0) 2013.01.08
Posted by 구차니
Programming/openMP2013. 3. 16. 17:26
단순하게 for문 나눠서 돌릴때
#pragma omp parallel
#pragma omp for

혹은 
#pragma omp parallel for 

쓰레드 순서대로 실행해야 할 경우의 보조 지시어(그런데 이렇게 하면 병렬처리를 안하고 single로 순서대로 하는거 아닌가?)
#pragma omp parallel for ordered
#pragma omp ordered 

보조지시어 schedule을 이용한 for문의 분배방식
#pragma omp parallel for schedule(static)
#pragma omp parallel for schedule(dynamic)
#pragma omp parallel for schedule(guided)
#pragma omp parallel for schedule(runtime) 

parallel 구문에서 마스터 쓰레드만 돌릴경우 single을 사용함(물론 실행도 1번만)
#pragma omp parallel 
#pragma omp single 

멀티 쓰레드로 여러개의 작업(함수단위) 돌릴경우 sections 안에 함수별로 section을 사용함
#pragma omp parallel 
#pragma omp sections
#pragma omp section 

쓰레드 외부의 변수들을 복제해서 사용하도록 하는 private 보조 지시어(쓰레드 별로 복제되어 사용됨)
#pragma omp parallel private(variable)

atomic은 단순하게 변수에 값 할당 하는 정도의 단순한 lock 방법을 위한 아토믹 연산을 지원하며
critical은 critical section(OS 용어)을 지원하기 위해 함수나 비교, 할당등을 할 수 있는 확장된 지시어.
#pragma omp atomic
#pragma omp critical 

runtime 함수로 현재 실행중인 쓰레드의 번호(만약 쓰레드가 4개라면 0~3번 사이의)를 알려준다.
omp_get_thread_num() 

---
2013.09.20
#pragma omp parallel

#pragma omp for
#pragma omp sections
#pragma omp single
#pragma omp task


#pragma omp atomic
#pragma omp critical
#pragma omp master
#pragma omp barrier
#pragma omp taskwait
#pragma omp flush
#pragma omp ordered

#pragma omp threadprivate




#pragma omp parallel
if
num_threads
default(shared|none)
private
firstprivate
lastprivate
shared
copyin
reduction

#pragma omp for
private
firstprivate
lastprivate
reduction
schedule
collapse
ordered
nowait


#pragma omp sections
private
firstprivate
lastprivate
reduction
schedule
collapse
ordered
nowait


#pragma omp single
private
firstprivate
copyprivate
nowait



#pragma omp task // omp 3.0 above
if
united
default(shared|none)
private
firstprivate
shared
 

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

openmp 제한자(?)  (0) 2013.09.20
openMP runtime 함수 및 환경변수  (0) 2013.03.16
visual studio express 2008에서는 openMP 공식 지원안해!  (0) 2013.03.16
TBB - Threading Building Blocks by intel  (0) 2013.01.08
openMP 문서들  (0) 2012.06.18
Posted by 구차니
Programming/openMP2013. 3. 16. 08:05
결론만 말하자면
메뉴는 존재하지만 omp.h 헤더가 존재하지 않는다.

"구성 속성" - "C/C++" - "언어" - "OpenMP 지원"

 
하지만 정작 컴파일 하면
 fatal error C1083: 포함 파일을 열 수 없습니다. 'omp.h': No such file or directory

... openMP 윈도우용 라이브러리만 설치하면 되려나?


---
그냥 TBB나 PPL을 쓰라는 조언 -_-
[링크 : http://www.gamecodi.com/board/zboard-id-GAMECODI_Talkdev-no-1144-z-10.htm ]

2008 플랫폼 SDK를 설치하라는데 iso로 받으려니 1.5기가 덜덜덜
+깔아도 omp.h는 없는데!?!?
[링크 : http://stackoverflow.com/questions/1338016/visual-c-2008-omp-h-not-found-openmp-is-set]
[링크 : http://www.microsoft.com/en-us/download/details.aspx?id=24826 ]

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

openMP runtime 함수 및 환경변수  (0) 2013.03.16
openMP 지시어  (0) 2013.03.16
TBB - Threading Building Blocks by intel  (0) 2013.01.08
openMP 문서들  (0) 2012.06.18
openmp for문 나누기  (0) 2012.06.18
Posted by 구차니
Programming/openMP2013. 1. 8. 09:08
OpenMP 처럼 패러럴 프로세싱관련 라이브러리로
Intel에서 제작하고 배포하는데 라이센스는 확인이 필요할듯

[링크 : http://goparallel.sourceforge.net/compiling-tbb-programs-and-examples-on-linux-ubuntu/
[링크 : http://software.intel.com/en-us/intel-tbb...] 30일 버전이나 구입인거 봐서는 free는 아닌듯
[링크 : http://threadingbuildingblocks.org/]

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

openMP 지시어  (0) 2013.03.16
visual studio express 2008에서는 openMP 공식 지원안해!  (0) 2013.03.16
openMP 문서들  (0) 2012.06.18
openmp for문 나누기  (0) 2012.06.18
libgomp 공식 사이트 / 문서  (0) 2012.06.10
Posted by 구차니