회원가입   회원찾기
  ID PW
 
  공통
  Solaris x86
  Solaris
  이전 나만의 팁
 

   제 목 : OpenMP
   작성자 : 조호석 날짜 : 2008-10-20
   분류 : 공통 조회수 : 3544

OpenMP

썬 컨퍼런스 갔다가 가장 기억에 남는게 이거라 올려놓습니다.

http://www.solanara.net 에 HTML 버전이 올라올겁니다.

- CPU는 멀티코어/멀티쓰레드의 형태로 진화하게됨

- 따라서 어플리케이션에서 멀티코어/멀티쓰레드를 효과적으로 사용해야 함

- 어플에서 멀티코어/멀티쓰레드를 사용하려면 쓰레드를 사용해야 하는데, 이때 개발효율이 떨어짐

- 그래서 나온 것이 OpenMP. 솔라리스 8 이상부터 지원된다. 쓰레드 프로그램을 이렇게 쉽게 만들 수 있다는게 놀랍다.

- 현재 C, C++, Fortran 에서만 지원됨.

- export OMP_NUM_THREADS=4 의 숫자를 바꿔보면서 실행해보시면 성능 차이가 보일겁니다. 쿼드코어면 4로 세팅하시면 되고, 싱글 코어는 성능차이가 안 납니다. ^^ 해보니깐 HyperThread 이용해봐도 제대로 안되는거 같네요.

// 실행전에 [export OMP_NUM_THREADS=4] 명령을 미리 줄것.
// 컴파일 명령어: cc -mt -O3 -o matrix -xopenmp=parallel -lmtmalloc matrix.c
windy@wl ~/source_c/openmp $ cat matrix.c
#include <stdio.h>
#include <omp.h>
#include <mtmalloc.h>
const int nrows = 100;
const int ncols = 100000;

int main(int argc, char *argv[]) {
int* array[nrows];

printf("Initializing...\n");
#pragma omp parallel for
for (int i = 0; i < nrows; i++) {
array[i] = (int*) malloc(sizeof(int) * ncols);
}

printf("Start Calc...\n");
#pragma omp parallel for
for (int i = 0; i < nrows; i++) {
printf("Thread #%d, %d Column\n", omp_get_thread_num(), i);
for (int j = 0; j < ncols; j++) {
for (int k = 0; k < nrows; k++) {
array[i][j] = array[i][k] * array[k][j];
}
}
}
}
windy@wl ~/source_c/openmp $ cc -mt -O3 -o matrix -xopenmp=parallel -lmtmalloc matrix.c
windy@wl ~/source_c/openmp $ export OMP_NUM_THREADS=6
windy@wl ~/source_c/openmp $ time ./matrix
Initializing...
Start Calc...
Thread #1, 17 Column
Thread #3, 51 Column
Thread #0, 0 Column
Thread #4, 68 Column
Thread #5, 84 Column
Thread #2, 34 Column
... 중략 ...
Thread #1, 33 Column
Thread #0, 16 Column

real 0m4.404s
user 0m24.860s
sys 0m0.490s
windy@wl ~/source_c/openmp $ export OMP_NUM_THREADS=1
windy@wl ~/source_c/openmp $ time ./matrix
Initializing...
Start Calc...
Thread #0, 0 Column
Thread #0, 1 Column
Thread #0, 2 Column
Thread #0, 3 Column
... 중략 ...
Thread #0, 94 Column
Thread #0, 95 Column
Thread #0, 96 Column
Thread #0, 97 Column
Thread #0, 98 Column
Thread #0, 99 Column

real 0m23.373s
user 0m23.220s
sys 0m0.100s
windy@wl ~/source_c/openmp $

- SunStudio에는 이외에도 ThreadAnalyzer, PerformanceAnalyzer라는 툴을 제공합니다. 레이스 컨디션이나 컨플릭트를 잘 잡아주더군요. 해볼만한 가치는 있을듯 합니다.


[목록보기]  [출력]  
  사이트 소개  |  연락처  |  사이트 맵  |  이메일주소 무단 수집 거부 Copyright (c) 2018 Solaris School. All rights reserved.