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 구차니
visual studio 에서 디버깅하면 디스어셈블러에서 이상한게 나오는데
알고보니 일종의 포인터 연산 이런거 였다는게 함정..

int _tmain(int argc, _TCHAR* argv[])
{
004113A0  push        ebp  
004113A1  mov         ebp,esp 
004113A3  sub         esp,0CCh 
004113A9  push        ebx  
004113AA  push        esi  
004113AB  push        edi  
004113AC  lea         edi,[ebp-0CCh] 
004113B2  mov         ecx,33h 
004113B7  mov         eax,0CCCCCCCCh 
004113BC  rep stos    dword ptr es:[edi] 
	int a = 0;
004113BE  mov         dword ptr [a],0 
	a++;
004113C5  mov         eax,dword ptr [a] 
004113C8  add         eax,1 
004113CB  mov         dword ptr [a],eax 
	printf("hello world %d\n", a);
004113CE  mov         esi,esp 
004113D0  mov         eax,dword ptr [a] 
004113D3  push        eax  
004113D4  push        offset string "hello world %d\n" (41573Ch) 
004113D9  call        dword ptr [__imp__printf (4182BCh)] 
004113DF  add         esp,8 
004113E2  cmp         esi,esp 
004113E4  call        @ILT+320(__RTC_CheckEsp) (411145h) 
	return 0;
004113E9  xor         eax,eax 
}

rep stos    dword ptr es:[edi]
mov         dword ptr [a],0 
mov         eax,dword ptr [a] 

머.. 자세한건 다시 읽어 봐야겠다.



[링크 : https://www.cs.umd.edu/users/meesh/webpages/cmsc311/links/handouts/ia32.pdf]

'Programming > Assembly(어셈블리)' 카테고리의 다른 글

fasm / nasm / masm  (0) 2015.06.13
어셈블리 관련  (0) 2015.06.11
.DATA? 지시어  (0) 2011.07.31
x86 register  (2) 2011.07.17
PowerPC(PPC) 어셈관련 내용  (0) 2011.04.04
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 구차니
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/C++ STL2013. 11. 20. 09:02
람다라는게 미묘하게 감이 안오는데
어떻게 보면 함수포인터를 넘어서
함수 객체 라고 표현을 해야하나?

간단한 실례로 
auto first = container(50);
auto second = container(60);
first();
second(); 

50
60
50
60 

왜 두번 출력하는진 모르겠지만(아마도 람다 생성하면서 1번?)
람다를 생성후 동일한 함수이지만 다르게 계속 작동 하는걸 보면
감이 올 듯... 말 듯 하다 

compile time 결정은 아닌거 같고
runtime 결정값 같긴한데... 

[링크 : http://goparallel.sourceforge.net/c11-lambda-functions-returns-calls/]

'Programming > C++ STL' 카테고리의 다른 글

crt0.o / crtexe.obj  (0) 2014.02.27
c++ constructor  (0) 2014.02.26
C++ AMP (Accelerated Massive Parallelism)  (0) 2013.10.08
c++ class - friend  (0) 2013.03.15
visual studio express 에서 class 생성예제  (0) 2013.03.13
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/openCV2013. 11. 10. 20:39
openCV 버전이 2.x대로 오르면서 경로가 변했는지
이전에 내가 정리했던 내용이 전부 무효가 되었다 ㅠㅠ

include 경로 <opencv/cv.h> 에서 <opencv2/opencv.hpp> 로 변경
/usr/include/opencv2

그리고 링커 옵션도 변경되었다. (라이브러리 이름도 바뀐듯)
-lopencv_core << 기존의 -lcv
-lopencv_imgproc
-lopencv_highgui  << 기존의 -lhighgui
-lopencv_ml
-lopencv_video
-lopencv_features2d
-lopencv_calib3d
-lopencv_objdetect
-lopencv_contrib
-lopencv_legacy
-lopencv_flann
-lopencv_nonfree 

[링크 : http://chadaphone.wordpress.com/.../how-to-install-opencv-and-qt-in-ubuntu-12-04-step-by-step-tutorial/]

솔찍히 가장 큰 차이점은..
c가 아니라 c++로 바뀌면서
gcc 대신 g++로 써야 한다는 점이려나? ㅋㅋ

아무튼 설치 시에는 libopencv-dev 패키지로 설치한다.
$ sudo apt-get install libopencv-dev
패키지 목록을 읽는 중입니다... 완료
의존성 트리를 만드는 중입니다
상태 정보를 읽는 중입니다... 완료
다음 패키지를 더 설치할 것입니다:
  debhelper dh-apparmor gettext html2text intltool-debian libatk1.0-dev libavcodec-dev
  libavformat-dev libavutil-dev libcairo-script-interpreter2 libcairo2-dev libdc1394-22-dev
  libexpat1-dev libfontconfig1-dev libfreetype6-dev libgdk-pixbuf2.0-dev libgettextpo0
  libglib2.0-dev libgtk2.0-dev libilmbase-dev libjasper-dev libjpeg-dev libjpeg-turbo8-dev
  libjpeg8-dev libmail-sendmail-perl libopencv-calib3d-dev libopencv-contrib-dev
  libopencv-contrib2.3 libopencv-core-dev libopencv-features2d-dev libopencv-flann-dev
  libopencv-gpu-dev libopencv-highgui-dev libopencv-imgproc-dev libopencv-legacy-dev
  libopencv-ml-dev libopencv-objdetect-dev libopencv-video-dev libopenexr-dev libpango1.0-dev
  libpcre3-dev libpcrecpp0 libpixman-1-dev libpng12-dev libraw1394-dev libswscale-dev
  libsys-hostname-long-perl libtiff4-dev libtiffxx0c2 libunistring0 libxcb-render0-dev
  libxcb-shm0-dev libxcomposite-dev libxcursor-dev libxdamage-dev libxfixes-dev libxft-dev
  libxinerama-dev libxrandr-dev libxrender-dev po-debconf x11proto-composite-dev
  x11proto-damage-dev x11proto-fixes-dev x11proto-randr-dev x11proto-render-dev
  x11proto-xinerama-dev
제안하는 패키지:
  dh-make gettext-doc libfaad-dev libgsm1-dev libogg-dev libschroedinger-dev libspeex-dev
  libtheora-dev libvorbis-dev libcairo2-doc libglib2.0-doc libgtk2.0-doc libpango1.0-doc
  libraw1394-doc libmail-box-perl
추천하는 패키지:
  libraw1394-tools
다음 새 패키지를 설치할 것입니다:
  debhelper dh-apparmor gettext html2text intltool-debian libatk1.0-dev libavcodec-dev
  libavformat-dev libavutil-dev libcairo-script-interpreter2 libcairo2-dev libdc1394-22-dev
  libexpat1-dev libfontconfig1-dev libfreetype6-dev libgdk-pixbuf2.0-dev libgettextpo0
  libglib2.0-dev libgtk2.0-dev libilmbase-dev libjasper-dev libjpeg-dev libjpeg-turbo8-dev
  libjpeg8-dev libmail-sendmail-perl libopencv-calib3d-dev libopencv-contrib-dev
  libopencv-contrib2.3 libopencv-core-dev libopencv-dev libopencv-features2d-dev
  libopencv-flann-dev libopencv-gpu-dev libopencv-highgui-dev libopencv-imgproc-dev
  libopencv-legacy-dev libopencv-ml-dev libopencv-objdetect-dev libopencv-video-dev libopenexr-dev
  libpango1.0-dev libpcre3-dev libpcrecpp0 libpixman-1-dev libpng12-dev libraw1394-dev
  libswscale-dev libsys-hostname-long-perl libtiff4-dev libtiffxx0c2 libunistring0
  libxcb-render0-dev libxcb-shm0-dev libxcomposite-dev libxcursor-dev libxdamage-dev libxfixes-dev
  libxft-dev libxinerama-dev libxrandr-dev libxrender-dev po-debconf x11proto-composite-dev
  x11proto-damage-dev x11proto-fixes-dev x11proto-randr-dev x11proto-render-dev
  x11proto-xinerama-dev
0개 업그레이드, 68개 새로 설치, 0개 제거 및 16개 업그레이드 안 함.
24.9 M바이트 아카이브를 받아야 합니다.
이 작업 후 100 M바이트의 디스크 공간을 더 사용하게 됩니다.
계속 하시겠습니까 [Y/n]?

[링크 : http://karytech.blogspot.kr/2012/05/opencv-24-on-ubuntu-1204.html]

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

opencv docs  (0) 2014.02.17
Interoperability with OpenCV 1  (0) 2014.02.08
openCV Mat / iplImage  (0) 2012.02.21
openCV 글씨 쓰기 예제  (2) 2012.02.12
Cmake로 openCV 컴파일 설정 및 설치하기  (0) 2012.02.12
Posted by 구차니