2016년 6월 30일 목요일

openmp 사용하기

<참조: http://himskim.egloos.com/3261640>

Visual studio에서 openmp를 사용하려면
1. 구성 -> C/C++ -> 언어 -> OpenMP지원 -> 예/openmp 변경
2. 병렬처리를 원하는 구문의 위에 #pragma omp parallel 추가
3. 컴파일 후, 실행하면 CPU core수만큼 thread생성하여 실행됨.
4. 할 때, thread내에서 사용되는 변수는 모두 #pragma omp parallel안에서 정의해주기.

추가적으로 복잡한 사용법은 다음과 같음.
#pragma omp parallel [clause[ [, ]clause] ...] new-line      structured-block
if(scalar-expression)
private(variable-list)
firstprivate(variable-list)
default(shared | none)
shared(variable-list)
copyin(variable-list)
reduction(operator: variable-list)
num_threads(integer-expression)

structured-block은 { ... }으로 묶어주면 됨.

#pragma omp
    parallel num_threads(8)
<< thread 8개 만듬.

    parallel num_threads(8) if (i == 10)
<< i가 10이면 8개 만듬.

    for private(변수명)
<< 해당 변수는 thread별로 독립공간 차지 (for iterator는 기본으로 독립공간)
<< 호출시점에 변수명은 random값으로 초기화.(이전에 값을 가지고 있어도 안넣음).
    for firstprivate(변수명)
<< private와 같지만 호출시점에 변수명에 이전 값을 복사.
    for reduction(연산자:변수명)
<< thread가 종료된 시점에 변수명의 내용을 연산자가 시키는대로 처리(초기화는 연산자의 계산에 영향을 미치지않도록 설정됨).

ex)
#pragma omp parallel  // 병렬처리를 위한 영역 설정 - thread를 생성(mem공간 별도생성)
{
  #pragma omp for  // 이하 for 구문을 thread에서 병렬처리
  for ()
  {
  }
}