'Programming/openMP'에 해당되는 글 26건

  1. 2015.11.10 openMP lock/unlock
  2. 2015.10.12 openMP g++ -E -S 2
  3. 2015.10.08 openmp 관련 정리글(win32)
  4. 2015.10.06 openmp 테스트 on rpi
  5. 2015.09.30 openCV + openMP
  6. 2015.07.23 openMP affinity 관련..
  7. 2013.12.12 openMP parallel for private 4
  8. 2013.11.28 openMP private copyin copyprivate firstprivate lastprivate
  9. 2013.11.28 openMP reduction 절
  10. 2013.11.26 openMP atomic과 critical
Programming/openMP2015. 11. 10. 09:43



[링크 : http://stackoverflow.com/questions/2396430/how-to-use-lock-in-openmp]

[링크 : https://computing.llnl.gov/tutorials/openMP/#OMP_SET_LOCK]


[링크 : http://www.mathcs.emory.edu/~cheung/Courses/355/Syllabus/91-pthreads/openMP.html]

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

openMP g++ -E -S  (2) 2015.10.12
openmp 관련 정리글(win32)  (0) 2015.10.08
openmp 테스트 on rpi  (0) 2015.10.06
openCV + openMP  (0) 2015.09.30
openMP affinity 관련..  (0) 2015.07.23
Posted by 구차니
Programming/openMP2015. 10. 12. 09:23

흐음..

다음단계에서 확장되나... 소스레벨에서는 차이가 별로 안나네


-E



-S

먼가 우르르 나오는데 어셈이랑 안친해서 ㅠㅠ

아무튼 GOMP 어쩌구가 보이긴 하네..



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

openMP lock/unlock  (0) 2015.11.10
openmp 관련 정리글(win32)  (0) 2015.10.08
openmp 테스트 on rpi  (0) 2015.10.06
openCV + openMP  (0) 2015.09.30
openMP affinity 관련..  (0) 2015.07.23
Posted by 구차니
Programming/openMP2015. 10. 8. 17:45

정리가 잘되서 이해가 잘되는데

손으로 해봐야지 머.. ㅠㅠ


Parallel Programming, OpenMP 그리고 Win32 - 1

Parallel Programming, OpenMP 그리고 Win32 - 2

Parallel Programming, OpenMP 그리고 Win32 - 3

Parallel Programming, OpenMP 그리고 Win32 - 4

Parallel Programming, OpenMP 그리고 Win32 - 5

Parallel Programming, OpenMP 그리고 Win32 - 6


[링크 : http://himskim.egloos.com/3261640]

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

openMP lock/unlock  (0) 2015.11.10
openMP g++ -E -S  (2) 2015.10.12
openmp 테스트 on rpi  (0) 2015.10.06
openCV + openMP  (0) 2015.09.30
openMP affinity 관련..  (0) 2015.07.23
Posted by 구차니
Programming/openMP2015. 10. 6. 13:05

라즈베리는 나름(!) 쿼드코어니까 openmp 테스트 하긴 적절ㅋ


$ cat mp.cpp

#include <iostream>


int main(int argc, char **argv)

{

        #pragma omp parallel

        for(;;)

        {

                int a = 0;

                a++;

        }

        return 0 ;

}


$ g++ -fopenmp mp.cpp

$ ./a.out


쓰레드도 lightweight process 랬으니... 3*로 뜨는게 당연한건가?

$ pstree

init─┬─avahi-daemon───avahi-daemon

     ├─console-kit-dae───64*[{console-kit-dae}]

     ├─cron

     ├─2*[dbus-daemon]

     ├─dbus-launch

     ├─dhcpcd

     ├─7*[getty]

     ├─gvfs-afc-volume───{gvfs-afc-volume}

     ├─gvfs-gdu-volume───{gvfs-gdu-volume}

     ├─gvfs-gphoto2-vo

     ├─gvfsd

     ├─gvfsd-trash───{gvfsd-trash}

     ├─2*[ifplugd]

     ├─lightdm─┬─Xorg

     │         ├─lightdm─┬─lxsession─┬─lxpanel───3*[{lxpanel}]

     │         │         │           ├─openbox

     │         │         │           ├─pcmanfm───{pcmanfm}

     │         │         │           ├─ssh-agent

     │         │         │           └─{lxsession}

     │         │         └─{lightdm}

     │         └─2*[{lightdm}]

     ├─lxpolkit───{lxpolkit}

     ├─menu-cached───{menu-cached}

     ├─ntpd

     ├─polkitd───2*[{polkitd}]

     ├─rsyslogd───3*[{rsyslogd}]

     ├─sshd─┬─sshd───sshd───bash───a.out───3*[{a.out}]

     │      └─sshd───sshd───bash───pstree

     ├─thd

     ├─udevd───2*[udevd]

     └─udisks-daemon─┬─udisks-daemon

                     └─{udisks-daemon}


4개 cpu 100%씩 총합 399.2%.. 흐음..

$ top

top - 13:00:53 up  4:21,  2 users,  load average: 0.54, 0.28, 0.16

Tasks: 109 total,   2 running, 107 sleeping,   0 stopped,   0 zombie

%Cpu0  :100.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

%Cpu1  :100.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

%Cpu2  :100.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

%Cpu3  : 99.7 us,  0.3 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

KiB Mem:    883168 total,   779332 used,   103836 free,    70232 buffers

KiB Swap:   102396 total,        0 used,   102396 free,   622940 cached


  PID USER      PR  NI  VIRT  RES  SHR S  %CPU %MEM    TIME+  COMMAND

16224 pi        20   0 27992  900  784 R 399.2  0.1   0:36.16 a.out 



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

openMP g++ -E -S  (2) 2015.10.12
openmp 관련 정리글(win32)  (0) 2015.10.08
openCV + openMP  (0) 2015.09.30
openMP affinity 관련..  (0) 2015.07.23
openMP parallel for private  (4) 2013.12.12
Posted by 구차니
Programming/openMP2015. 9. 30. 15:16

openCV 2.4.6 부터 Use openMP 옵션이 추가된 기분?

[링크 : https://iamsrijon.wordpress.com/./how-to-compile-opencv-to-utilize-multiple-core-processor-in-linux/]

[링크 : http://answers.opencv.org/question/20955/enabling-openmp-while-building-opencv-libraries/]


결국은. 또 다시 크로스 컴파일이거나...

빌드의 시간인가!?!??



물론.. opencv2가 아닌 opencv에서도 수작업으로 병렬화는 가능한듯

[링크 : https://huseyincakir.wordpress.com/2009/11/05/using-openmp-with-opencv/]


openCV2 2.4.0 에서도 무언가 테스트는 했는데 코드가 없어서 아쉽네..

[링크 : http://museguy.tistory.com/16]



2.4.6

switched all the remaining parallel loops from TBB-only tbb::parallel_for() to universal cv::parallel_for_() with many possible backends (MS Concurrency, Apple's GDC, OpenMP, Intel TBB etc.)


2.4.3

Added universal parallel_for implementation using various backends: TBB (cross-platform: http://threadingbuildingblocks.org), OpenMP (cross-platform: http://en.wikipedia.org/wiki/OpenMP), Grand Central Dispatch (iOS/MacOSX: http://en.wikipedia.org/wiki/Grand_Central_Dispatch), Concurrency (Visual Studio 2010 or later: http://msdn.microsoft.com/en-us/library/dd492418.aspx), C= (http://www.hoopoesnest.com/cstripes/cstripes-details.htm). Many exiting parallel OpenCV algorithms have been converted to the new primitive. Therefore, you can enjoy performance improvements even without having to install TBB and ship it with OpenCV-based applications.


[링크 : http://code.opencv.org/projects/opencv/wiki/ChangeLog]

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

openmp 관련 정리글(win32)  (0) 2015.10.08
openmp 테스트 on rpi  (0) 2015.10.06
openMP affinity 관련..  (0) 2015.07.23
openMP parallel for private  (4) 2013.12.12
openMP private copyin copyprivate firstprivate lastprivate  (0) 2013.11.28
Posted by 구차니
Programming/openMP2015. 7. 23. 16:43

openMP 4.0.1 부터 지원하는걸려나?


void work();

void main()

{

    #pragma omp parallel proc_bind(spread) num_threads(4)

    {

        work();

    }

}

[링크 : http://openmp.org/mp-documents/OpenMP_Examples_4.0.1.pdf] 


#pragma omp parallel affinity(spread) num_threads(N)

[링크 : http://terboven.com/2012/06/21/the-design-of-openmp-thread-affinity/]



openGL + openMP 는 회의적...

그냥 하나의 쓰레드에서 그리고, 다른 쓰레드에서 처리하고 그런걸 추천

[링크 : http://www.kandroid.org/board/board.php?board=AndroidTechQnA&command=body&no=5332]

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

openmp 테스트 on rpi  (0) 2015.10.06
openCV + openMP  (0) 2015.09.30
openMP parallel for private  (4) 2013.12.12
openMP private copyin copyprivate firstprivate lastprivate  (0) 2013.11.28
openMP reduction 절  (0) 2013.11.28
Posted by 구차니
Programming/openMP2013. 12. 12. 20:09
openMP를 차근차근 보다 보니 으헉?!스러운 문제 발견

int a;
#pragma omp parallel for
for(a = 0; a < 100; a++)
     printf("%d",a); 

일단 for loop의 변수인 a의 경우
개별 쓰레드 별로 변수를 가지고 있고 개별로 증가를 해야 하는데
지금까지 private(a) 이런식으로 private 변수로 지정하지 않아도 잘만 돌아가고 있었다?!?!

엄밀하게는
int a;
#pragma omp parallel for private(a)
for(a = 0; a < 100; a++)
     printf("%d",a);  

이런식으로 a를 private 변수로 해주어야 하나
for문 특성(?)상 for문 변수는 독립적으로 돌아가기 때문에
기본값으로 private화 시킨다는 것 같은데..

pdf 문서중에 단 하나의 문서에서만 언급하고 있고
나머지에서는 전부 private() 해주고 있었는데.. 어느게 맞는걸까? 

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

openCV + openMP  (0) 2015.09.30
openMP affinity 관련..  (0) 2015.07.23
openMP private copyin copyprivate firstprivate lastprivate  (0) 2013.11.28
openMP reduction 절  (0) 2013.11.28
openMP atomic과 critical  (0) 2013.11.26
Posted by 구차니
Programming/openMP2013. 11. 28. 12:29
private는 지역변수로 개별 쓰레드에서만 유효한 변수로 선언된다.
물론 shared memory 구조를 채택한 openMP에서는
이러한 독립 변수를 메인 쓰레드의 변수와 동기화 하여 사용하도록 하기에
동기화를 해야할 필요성이 생기게 된다.


private는 초기화 하지 않고 쓰레드별 독립 변수로 만들어주고
firstprivate는 메인 쓰레드의 값을 초기화 값으로  쓰레드별 독립 변수로 만들어주고 
lastprivate는 쓰레드 종료후 동기화시 가장 마지막 으로 종료된 쓰레드의 값을 메인 쓰레드로 복사한다.
copyin은 threadprivate 사용시 마스터 쓰레드의 값을 모든 쓰레드로 동기화 하는데 사용한다.


lastprivate는 크게 의미가 없어 보이기도 하는데..
디버깅 용도로 가장 부하가 많이 걸려 늦게 끝나는 쓰레드 번호를 리턴하는데 쓰면 될 거 같기도 하다.

그리고 copyin은 공유된 변수가 하위로 전파되는 거니
copyin이 사용되면 연산을 전부 무효화 하고 다시 계산 해야 할지도 모르겠다. 

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

openMP affinity 관련..  (0) 2015.07.23
openMP parallel for private  (4) 2013.12.12
openMP reduction 절  (0) 2013.11.28
openMP atomic과 critical  (0) 2013.11.26
openMP single 과 master의 차이점  (0) 2013.11.26
Posted by 구차니
Programming/openMP2013. 11. 28. 12:08
reduction은 수동으로 병합할 변수를 자동으로 합쳐주는 역활을 한다.

[링크 : http://gcc.gnu.org/.../Implementing-REDUCTION-clause.html#Implementing-REDUCTION-clause]


예전에 sum() 병렬 처리 함수의 경우
atomic이나 critical을 사용해 데이터 동기화를 맞추었지만 성능저하가 있었고
2013/09/25 - [Programming/openMP] - openMP로 구현한 야매 sum()

이를 개선하기 위해 계산후
마지막에 마스터 쓰레드에서 합치도록 했는데
2013/09/29 - [Programming/openMP] - openMP example 

이런 마스터 쓰레드 합침을 reduction(+:sum) 으로 간단하게 동일한 방식을 이용해 처리할 수 있다.


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

#define BUFFLEN 4096
#define NUMTHREAD 4

void thread()
{
        int idx;
        int arr[BUFFLEN];
        int res = 0;

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

        #pragma omp for reduction(+:res)
        for(idx = 0; idx < BUFFLEN; idx++)
        {
                int tid = omp_get_thread_num();
                res += arr[idx];
        }
}
        printf("res = %d\n",res);
}

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

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

openMP parallel for private  (4) 2013.12.12
openMP private copyin copyprivate firstprivate lastprivate  (0) 2013.11.28
openMP atomic과 critical  (0) 2013.11.26
openMP single 과 master의 차이점  (0) 2013.11.26
openMP parallel default  (0) 2013.11.18
Posted by 구차니
Programming/openMP2013. 11. 26. 19:38
atomic은 atomic 연산이 필요할 경우에 사용하고(읽기+증가+쓰기 3가지 operation을 한번에 하도록)
critical은 블럭에 대해서 다른 부분에서 치고 들어 오지 못하도록 막아준다.

atomic은 하나의 연산에 대한 거라면
critical은 하나의 행위에 대한 거라고 보면 될 듯.

또한 atomic은 rvalue가 없어야 하므로 x++;은 허용하지만 x = x + 1; 은 허용되지 않는다.
(일단 다른 변수와의 합정도는 지원하지만 함수를 부를순 없다. 함수사용시 컴파일 에러가 발생하진 않는다)
The expression statement must have one of the following forms:

xbinop=expr

x++

++x

x--

--x

In the preceding expressions: x is an lvalue expression with scalar type. expr is an expression with scalar type, and it does not reference the object designated by xbinop is not an overloaded operator and is one of +*-/&^|<<, or >>.

[링크 : http://stackoverflow.com/questions/7798010/openmp-atomic-vs-critical

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

openMP private copyin copyprivate firstprivate lastprivate  (0) 2013.11.28
openMP reduction 절  (0) 2013.11.28
openMP single 과 master의 차이점  (0) 2013.11.26
openMP parallel default  (0) 2013.11.18
openMP gnu implement  (0) 2013.11.11
Posted by 구차니