'Programming'에 해당되는 글 1747건

  1. 2013.11.26 openMP atomic과 critical
  2. 2013.11.26 openMP single 과 master의 차이점
  3. 2013.11.20 C++11 Lambda Fuction 2
  4. 2013.11.18 openMP parallel default
  5. 2013.11.11 openMP gnu implement
  6. 2013.11.10 opencv2 on ubuntu 2
  7. 2013.10.08 C++ AMP (Accelerated Massive Parallelism)
  8. 2013.09.29 openMP example
  9. 2013.09.25 openMP로 구현한 야매 sum()
  10. 2013.09.20 openmp 제한자(?)
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 구차니
Programming/C++ STL2013. 10. 8. 09:49
GCN 이 어떤건가 조사하고 있는데
GCN이 openCL / DirectCompute / C++ AMP를 지원한다고 해서 조사를 해보니

[링크 : http://msdn.microsoft.com/ko-kr/library/hh265137.aspx]
[링크 : http://en.wikipedia.org/wiki/C++_AMP]
[링크 : http://www.imaso.co.kr/?doc=bbs/...wr_id=41233] 병렬 프로그래밍 혁신, C++ AMP

DirectCompute는 DirectX의 서브 시스템이고
C++ AMP는 DirectX 11 대 부터 지원하게 된 서브 시스템 및 C++0x 문법으로 확장된 기능으로 생각된다.

[링크 : http://en.wikipedia.org/wiki/C++11] C++0x 에서 명명변경

물론 open standard로 MS에서 제정하였기에 리눅스 GCC에서도 지원할 거라는데
C++ 만 보면 웬지 거부반응이 생기지만..
Massiva Parallelism이 이제 대세고 필수라.. 하....

[링크 : http://stackoverflow.com/questions/9179883/will-gcc-support-c-amp]


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

c++ constructor  (0) 2014.02.26
C++11 Lambda Fuction  (2) 2013.11.20
c++ class - friend  (0) 2013.03.15
visual studio express 에서 class 생성예제  (0) 2013.03.13
visual studio express에서의 상속 클래스  (0) 2013.03.13
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 구차니