다음을 통해 공유


OpenMP 함수

OpenMP API에 사용되는 함수에 대한 링크를 제공합니다.

OpenMP 표준의 Visual C++ 구현에는 다음 함수 및 데이터 형식이 포함됩니다.

환경 실행의 경우:

함수 설명
omp_set_num_threads num_threads 절로 재정의되지 않는 한 예정된 병렬 지역의 스레드 수를 설정합니다.
omp_get_num_threads 병렬 지역의 스레드 수를 반환합니다.
omp_get_max_threads num_threads 없는 병렬 영역이 코드의 해당 시점에 정의된 경우 사용할 수 있는 스레드 수보다 크거나 같은 정수를 반환합니다.
omp_get_thread_num 스레드 팀 내에서 실행되는 스레드의 스레드 번호를 반환합니다.
omp_get_num_procs 함수를 호출할 때 사용할 수 있는 프로세서 수를 반환합니다.
omp_in_parallel 병렬 지역 내에서 호출되는 경우 0이 아닌 값을 반환합니다.
omp_set_dynamic 런타임에 따라 예정된 병렬 지역에서 사용할 수 있는 스레드 수를 조정할 수 있음을 나타냅니다.
omp_get_dynamic 런타임에 따라 예정된 병렬 지역에서 사용할 수 있는 스레드 수를 조정할 수 있는지를 나타내는 값을 반환합니다.
omp_set_nested 중첩된 병렬 처리를 사용하도록 설정합니다.
omp_get_nested 중첩 병렬 처리를 사용할 수 있는지를 나타내는 값을 반환합니다.

잠금의 경우:

함수 설명
omp_init_lock 간단한 잠금을 초기화합니다.
omp_init_nest_lock 잠금을 초기화합니다.
omp_destroy_lock 잠금을 초기화하지 않습니다.
omp_destroy_nest_lock 중첩 가능한 잠금을 초기화하지 않습니다.
omp_set_lock 잠금을 사용할 수 있게 될 때까지 스레드 실행을 차단합니다.
omp_set_nest_lock 잠금을 사용할 수 있게 될 때까지 스레드 실행을 차단합니다.
omp_unset_lock 잠금을 해제합니다.
omp_unset_nest_lock 중첩 가능한 잠금을 해제합니다.
omp_test_lock 잠금을 설정하려고 시도하지만 스레드 실행을 차단하지는 않습니다.
omp_test_nest_lock 중첩 가능한 잠금을 설정하려고 시도하지만 스레드 실행을 차단하지는 않습니다.
데이터 형식 설명
omp_lock_t 잠금을 사용할 수 있는지 또는 스레드가 잠금을 소유하는지 여부에 관계없이 잠금 상태를 보유하는 형식입니다.
omp_nest_lock_t 잠금에 대한 다음 정보 중 하나를 보유하는 형식입니다. 잠금을 사용할 수 있는지 여부와 잠금을 소유하는 스레드의 ID 및 중첩 횟수입니다.

타이밍 루틴의 경우:

함수 설명
omp_get_wtime 특정 지점에서 경과된 시간(초)의 값을 반환합니다.
omp_get_wtick 프로세서 클록 틱 사이의 시간(초)을 반환합니다.

omp_destroy_lock

잠금을 초기화하지 않습니다.

void omp_destroy_lock(
   omp_lock_t *lock
);

매개 변수

lock
omp_init_lock 사용하여 초기화된 형식 omp_lock_t 의 변수입니다.

설명

자세한 내용은 3.2.2 omp_destroy_lock 및 omp_destroy_nest_lock 함수를 참조하세요.

예시

사용 omp_destroy_lock예제는 omp_init_lock 참조하세요.

omp_destroy_nest_lock

중첩 가능한 잠금을 초기화하지 않습니다.

void omp_destroy_nest_lock(
   omp_nest_lock_t *lock
);

매개 변수

lock
omp_init_nest_lock 사용하여 초기화된 형식 omp_nest_lock_t 의 변수입니다.

설명

자세한 내용은 3.2.2 omp_destroy_lock 및 omp_destroy_nest_lock 함수를 참조하세요.

예시

사용 omp_destroy_nest_lock예제는 omp_init_nest_lock 참조하세요.

omp_get_dynamic

런타임에 따라 예정된 병렬 지역에서 사용할 수 있는 스레드 수를 조정할 수 있는지를 나타내는 값을 반환합니다.

int omp_get_dynamic();

반환 값

0이 아닌 값은 스레드가 동적으로 조정됨을 의미합니다.

설명

스레드의 동적 조정은 omp_set_dynamic 및 OMP_DYNAMIC 사용하여 지정됩니다.

자세한 내용은 3.1.7 omp_set_dynamic 함수를 참조하세요.

예시

사용 omp_get_dynamic예제는 omp_set_dynamic 참조하세요.

omp_get_max_threads

num_threads 없는 병렬 영역이 코드의 해당 시점에 정의된 경우 사용할 수 있는 스레드 수보다 크거나 같은 정수를 반환합니다.

int omp_get_max_threads( )

설명

자세한 내용은 3.1.3 omp_get_max_threads 함수를 참조 하세요.

예시

// omp_get_max_threads.cpp
// compile with: /openmp
#include <stdio.h>
#include <omp.h>

int main( )
{
    omp_set_num_threads(8);
    printf_s("%d\n", omp_get_max_threads( ));
    #pragma omp parallel
        #pragma omp master
        {
            printf_s("%d\n", omp_get_max_threads( ));
        }

    printf_s("%d\n", omp_get_max_threads( ));

    #pragma omp parallel num_threads(3)
        #pragma omp master
        {
            printf_s("%d\n", omp_get_max_threads( ));
        }

    printf_s("%d\n", omp_get_max_threads( ));
}
8
8
8
8
8

omp_get_nested

중첩 병렬 처리를 사용할 수 있는지를 나타내는 값을 반환합니다.

int omp_get_nested( );

반환 값

0이 아닌 값은 중첩된 병렬 처리가 사용됨을 의미합니다.

설명

중첩 병렬 처리는 omp_set_nested OMP_NESTED 사용하여 지정됩니다.

자세한 내용은 3.1.10 omp_get_nested 함수를 참조 하세요.

예시

사용 omp_get_nested예제는 omp_set_nested 참조하세요.

omp_get_num_procs

함수를 호출할 때 사용할 수 있는 프로세서 수를 반환합니다.

int omp_get_num_procs();

설명

자세한 내용은 3.1.5 omp_get_num_procs 함수를 참조 하세요.

예시

// omp_get_num_procs.cpp
// compile with: /openmp
#include <stdio.h>
#include <omp.h>

int main( )
{
    printf_s("%d\n", omp_get_num_procs( ));
    #pragma omp parallel
        #pragma omp master
        {
            printf_s("%d\n", omp_get_num_procs( ));
        }
}
// Expect the following output when the example is run on a two-processor machine:
2
2

omp_get_num_threads

병렬 지역의 스레드 수를 반환합니다.

int omp_get_num_threads( );

설명

자세한 내용은 3.1.2 omp_get_num_threads 함수를 참조 하세요.

예시

// omp_get_num_threads.cpp
// compile with: /openmp
#include <stdio.h>
#include <omp.h>

int main()
{
    omp_set_num_threads(4);
    printf_s("%d\n", omp_get_num_threads( ));
    #pragma omp parallel
        #pragma omp master
        {
            printf_s("%d\n", omp_get_num_threads( ));
        }

    printf_s("%d\n", omp_get_num_threads( ));

    #pragma omp parallel num_threads(3)
        #pragma omp master
        {
            printf_s("%d\n", omp_get_num_threads( ));
        }

    printf_s("%d\n", omp_get_num_threads( ));
}
1
4
1
3
1

omp_get_thread_num

스레드 팀 내에서 실행되는 스레드의 스레드 번호를 반환합니다.

int omp_get_thread_num( );

설명

자세한 내용은 3.1.4 omp_get_thread_num 함수를 참조 하세요.

예시

사용 예제는 병렬을 참조하세요omp_get_thread_num.

omp_get_wtick

프로세서 클록 틱 사이의 시간(초)을 반환합니다.

double omp_get_wtick( );

설명

자세한 내용은 3.3.2 omp_get_wtick 함수를 참조 하세요.

예시

사용 omp_get_wtick예제는 omp_get_wtime 참조하세요.

omp_get_wtime

특정 지점에서 경과된 시간(초)의 값을 반환합니다.

double omp_get_wtime( );

반환 값

임의이지만 일관된 지점에서 경과된 시간(초)의 값을 반환합니다.

설명

이 지점은 프로그램 실행 중에 일관성을 유지하므로 향후 비교가 가능합니다.

자세한 내용은 3.3.1 omp_get_wtime 함수를 참조하세요.

예시

// omp_get_wtime.cpp
// compile with: /openmp
#include "omp.h"
#include <stdio.h>
#include <windows.h>

int main() {
    double start = omp_get_wtime( );
    Sleep(1000);
    double end = omp_get_wtime( );
    double wtick = omp_get_wtick( );

    printf_s("start = %.16g\nend = %.16g\ndiff = %.16g\n",
             start, end, end - start);

    printf_s("wtick = %.16g\n1/wtick = %.16g\n",
             wtick, 1.0 / wtick);
}
start = 594255.3671159324
end = 594256.3664474116
diff = 0.9993314791936427
wtick = 2.793651148400146e-007
1/wtick = 3579545

omp_in_parallel

병렬 지역 내에서 호출되는 경우 0이 아닌 값을 반환합니다.

int omp_in_parallel( );

설명

자세한 내용은 3.1.6 omp_in_parallel 함수를 참조 하세요.

예시

// omp_in_parallel.cpp
// compile with: /openmp
#include <stdio.h>
#include <omp.h>

int main( )
{
    omp_set_num_threads(4);
    printf_s("%d\n", omp_in_parallel( ));

    #pragma omp parallel
        #pragma omp master
        {
            printf_s("%d\n", omp_in_parallel( ));
        }
}
0
1

omp_init_lock

간단한 잠금을 초기화합니다.

void omp_init_lock(
   omp_lock_t *lock
);

매개 변수

lock
omp_lock_t 형식의 변수입니다.

설명

자세한 내용은 3.2.1 omp_init_lock 및 omp_init_nest_lock 함수를 참조하세요.

예시

// omp_init_lock.cpp
// compile with: /openmp
#include <stdio.h>
#include <omp.h>

omp_lock_t my_lock;

int main() {
   omp_init_lock(&my_lock);

   #pragma omp parallel num_threads(4)
   {
      int tid = omp_get_thread_num( );
      int i, j;

      for (i = 0; i < 5; ++i) {
         omp_set_lock(&my_lock);
         printf_s("Thread %d - starting locked region\n", tid);
         printf_s("Thread %d - ending locked region\n", tid);
         omp_unset_lock(&my_lock);
      }
   }

   omp_destroy_lock(&my_lock);
}
Thread 0 - starting locked region
Thread 0 - ending locked region
Thread 0 - starting locked region
Thread 0 - ending locked region
Thread 0 - starting locked region
Thread 0 - ending locked region
Thread 0 - starting locked region
Thread 0 - ending locked region
Thread 0 - starting locked region
Thread 0 - ending locked region
Thread 1 - starting locked region
Thread 1 - ending locked region
Thread 1 - starting locked region
Thread 1 - ending locked region
Thread 1 - starting locked region
Thread 1 - ending locked region
Thread 1 - starting locked region
Thread 1 - ending locked region
Thread 1 - starting locked region
Thread 1 - ending locked region
Thread 2 - starting locked region
Thread 2 - ending locked region
Thread 2 - starting locked region
Thread 2 - ending locked region
Thread 2 - starting locked region
Thread 2 - ending locked region
Thread 2 - starting locked region
Thread 2 - ending locked region
Thread 2 - starting locked region
Thread 2 - ending locked region
Thread 3 - starting locked region
Thread 3 - ending locked region
Thread 3 - starting locked region
Thread 3 - ending locked region
Thread 3 - starting locked region
Thread 3 - ending locked region
Thread 3 - starting locked region
Thread 3 - ending locked region
Thread 3 - starting locked region
Thread 3 - ending locked region

omp_init_nest_lock

잠금을 초기화합니다.

void omp_init_nest_lock(
   omp_nest_lock_t *lock
);

매개 변수

lock
omp_nest_lock_t 형식의 변수입니다.

설명

초기 중첩 횟수는 0입니다.

자세한 내용은 3.2.1 omp_init_lock 및 omp_init_nest_lock 함수를 참조하세요.

예시

// omp_init_nest_lock.cpp
// compile with: /openmp
#include <stdio.h>
#include <omp.h>

omp_nest_lock_t my_lock;

void Test() {
   int tid = omp_get_thread_num( );
   omp_set_nest_lock(&my_lock);
   printf_s("Thread %d - starting nested locked region\n", tid);
   printf_s("Thread %d - ending nested locked region\n", tid);
   omp_unset_nest_lock(&my_lock);
}

int main() {
   omp_init_nest_lock(&my_lock);

   #pragma omp parallel num_threads(4)
   {
      int i, j;

      for (i = 0; i < 5; ++i) {
         omp_set_nest_lock(&my_lock);
            if (i % 3)
               Test();
            omp_unset_nest_lock(&my_lock);
        }
    }

    omp_destroy_nest_lock(&my_lock);
}
Thread 0 - starting nested locked region
Thread 0 - ending nested locked region
Thread 0 - starting nested locked region
Thread 0 - ending nested locked region
Thread 3 - starting nested locked region
Thread 3 - ending nested locked region
Thread 3 - starting nested locked region
Thread 3 - ending nested locked region
Thread 3 - starting nested locked region
Thread 3 - ending nested locked region
Thread 2 - starting nested locked region
Thread 2 - ending nested locked region
Thread 2 - starting nested locked region
Thread 2 - ending nested locked region
Thread 2 - starting nested locked region
Thread 2 - ending nested locked region
Thread 1 - starting nested locked region
Thread 1 - ending nested locked region
Thread 1 - starting nested locked region
Thread 1 - ending nested locked region
Thread 1 - starting nested locked region
Thread 1 - ending nested locked region
Thread 0 - starting nested locked region
Thread 0 - ending nested locked region

omp_set_dynamic

런타임에 따라 예정된 병렬 지역에서 사용할 수 있는 스레드 수를 조정할 수 있음을 나타냅니다.

void omp_set_dynamic(
   int val
);

매개 변수

val
런타임에 따라 예정된 병렬 지역에서 사용할 수 있는 스레드 수를 조정할 수 있는지를 나타내는 값입니다. 0이 아닌 경우 런타임은 스레드 수를 조정할 수 있으며, 0이면 런타임은 스레드 수를 동적으로 조정하지 않습니다.

설명

스레드 수는 omp_set_num_threads 또는 OMP_NUM_THREADS 설정된 값을 초과하지 않습니다.

omp_get_dynamic 사용하여 현재 설정을 표시합니다omp_set_dynamic.

설정 omp_set_dynamic 은 OMP_DYNAMIC 환경 변수의 설정을 재정의합니다.

자세한 내용은 3.1.7 omp_set_dynamic 함수를 참조하세요.

예시

// omp_set_dynamic.cpp
// compile with: /openmp
#include <stdio.h>
#include <omp.h>

int main()
{
    omp_set_dynamic(9);
    omp_set_num_threads(4);
    printf_s("%d\n", omp_get_dynamic( ));
    #pragma omp parallel
        #pragma omp master
        {
            printf_s("%d\n", omp_get_dynamic( ));
        }
}
1
1

omp_set_lock

잠금을 사용할 수 있게 될 때까지 스레드 실행을 차단합니다.

void omp_set_lock(
   omp_lock_t *lock
);

매개 변수

lock
omp_init_lock 사용하여 초기화된 형식 omp_lock_t 의 변수입니다.

설명

자세한 내용은 3.2.3 omp_set_lock 및 omp_set_nest_lock 함수를 참조하세요.

예제

사용 omp_set_lock예제는 omp_init_lock 참조하세요.

omp_set_nest_lock

잠금을 사용할 수 있게 될 때까지 스레드 실행을 차단합니다.

void omp_set_nest_lock(
   omp_nest_lock_t *lock
);

매개 변수

lock
omp_init_nest_lock 사용하여 초기화된 형식 omp_nest_lock_t 의 변수입니다.

설명

자세한 내용은 3.2.3 omp_set_lock 및 omp_set_nest_lock 함수를 참조하세요.

예제

사용 omp_set_nest_lock예제는 omp_init_nest_lock 참조하세요.

omp_set_nested

중첩된 병렬 처리를 사용하도록 설정합니다.

void omp_set_nested(
   int val
);

매개 변수

val
0이 아닌 값은 중첩된 병렬 처리를 사용하도록 설정하고 0은 중첩된 병렬 처리를 사용하지 않도록 설정합니다.

설명

OMP 중첩 병렬 처리를 설정하거나 OMP_NESTED 환경 변수를 설정하여 설정할 omp_set_nested수 있습니다.

설정 omp_set_nested 은 환경 변수의 설정을 재정의합니다 OMP_NESTED .

병렬 영역을 중첩할 때 스레드 수가 기하급수적으로 증가하므로 환경 변수를 사용하도록 설정하면 작동 프로그램이 중단됩니다. 예를 들어 OMP 스레드 수를 4로 설정하여 6번 재귀하는 함수에는 4,096개(6개까지 4개) 스레드가 필요합니다. I/O 바인딩된 애플리케이션을 제외하고 프로세서보다 더 많은 스레드가 있는 경우 애플리케이션의 성능은 일반적으로 저하됩니다.

omp_get_nested 사용하여 현재 설정을 표시합니다omp_set_nested.

자세한 내용은 3.1.9 omp_set_nested 함수를 참조 하세요.

예시

// omp_set_nested.cpp
// compile with: /openmp
#include <stdio.h>
#include <omp.h>

int main( )
{
    omp_set_nested(1);
    omp_set_num_threads(4);
    printf_s("%d\n", omp_get_nested( ));
    #pragma omp parallel
        #pragma omp master
        {
            printf_s("%d\n", omp_get_nested( ));
        }
}
1
1

omp_set_num_threads

num_threads 절로 재정의되지 않는 한 예정된 병렬 지역의 스레드 수를 설정합니다.

void omp_set_num_threads(
   int num_threads
);

매개 변수

num_threads
병렬 지역의 스레드 수입니다.

설명

자세한 내용은 3.1.1 omp_set_num_threads 함수를 참조 하세요.

예시

사용 omp_set_num_threads예제는 omp_get_num_threads 참조하세요.

omp_test_lock

잠금을 설정하려고 시도하지만 스레드 실행을 차단하지는 않습니다.

int omp_test_lock(
   omp_lock_t *lock
);

매개 변수

lock
omp_init_lock 사용하여 초기화된 형식 omp_lock_t 의 변수입니다.

설명

자세한 내용은 3.2.5 omp_test_lock 및 omp_test_nest_lock 함수를 참조하세요.

예시

// omp_test_lock.cpp
// compile with: /openmp
#include <stdio.h>
#include <omp.h>

omp_lock_t simple_lock;

int main() {
    omp_init_lock(&simple_lock);

    #pragma omp parallel num_threads(4)
    {
        int tid = omp_get_thread_num();

        while (!omp_test_lock(&simple_lock))
            printf_s("Thread %d - failed to acquire simple_lock\n",
                     tid);

        printf_s("Thread %d - acquired simple_lock\n", tid);

        printf_s("Thread %d - released simple_lock\n", tid);
        omp_unset_lock(&simple_lock);
    }

    omp_destroy_lock(&simple_lock);
}
Thread 1 - acquired simple_lock
Thread 1 - released simple_lock
Thread 0 - failed to acquire simple_lock
Thread 3 - failed to acquire simple_lock
Thread 0 - failed to acquire simple_lock
Thread 3 - failed to acquire simple_lock
Thread 2 - acquired simple_lock
Thread 0 - failed to acquire simple_lock
Thread 3 - failed to acquire simple_lock
Thread 0 - failed to acquire simple_lock
Thread 3 - failed to acquire simple_lock
Thread 2 - released simple_lock
Thread 0 - failed to acquire simple_lock
Thread 3 - failed to acquire simple_lock
Thread 0 - acquired simple_lock
Thread 3 - failed to acquire simple_lock
Thread 0 - released simple_lock
Thread 3 - failed to acquire simple_lock
Thread 3 - acquired simple_lock
Thread 3 - released simple_lock

omp_test_nest_lock

중첩 가능한 잠금을 설정하려고 시도하지만 스레드 실행을 차단하지는 않습니다.

int omp_test_nest_lock(
   omp_nest_lock_t *lock
);

매개 변수

lock
omp_init_nest_lock 사용하여 초기화된 형식 omp_nest_lock_t 의 변수입니다.

설명

자세한 내용은 3.2.5 omp_test_lock 및 omp_test_nest_lock 함수를 참조하세요.

예시

// omp_test_nest_lock.cpp
// compile with: /openmp
#include <stdio.h>
#include <omp.h>

omp_nest_lock_t nestable_lock;

int main() {
   omp_init_nest_lock(&nestable_lock);

   #pragma omp parallel num_threads(4)
   {
      int tid = omp_get_thread_num();
      while (!omp_test_nest_lock(&nestable_lock))
         printf_s("Thread %d - failed to acquire nestable_lock\n",
                tid);

      printf_s("Thread %d - acquired nestable_lock\n", tid);

      if (omp_test_nest_lock(&nestable_lock)) {
         printf_s("Thread %d - acquired nestable_lock again\n",
                tid);
         printf_s("Thread %d - released nestable_lock\n",
                tid);
         omp_unset_nest_lock(&nestable_lock);
      }

      printf_s("Thread %d - released nestable_lock\n", tid);
      omp_unset_nest_lock(&nestable_lock);
   }

   omp_destroy_nest_lock(&nestable_lock);
}
Thread 1 - acquired nestable_lock
Thread 0 - failed to acquire nestable_lock
Thread 1 - acquired nestable_lock again
Thread 0 - failed to acquire nestable_lock
Thread 1 - released nestable_lock
Thread 0 - failed to acquire nestable_lock
Thread 1 - released nestable_lock
Thread 0 - failed to acquire nestable_lock
Thread 3 - acquired nestable_lock
Thread 0 - failed to acquire nestable_lock
Thread 3 - acquired nestable_lock again
Thread 0 - failed to acquire nestable_lock
Thread 2 - failed to acquire nestable_lock
Thread 3 - released nestable_lock
Thread 2 - failed to acquire nestable_lock
Thread 3 - released nestable_lock
Thread 2 - failed to acquire nestable_lock
Thread 0 - acquired nestable_lock
Thread 2 - failed to acquire nestable_lock
Thread 2 - failed to acquire nestable_lock
Thread 2 - failed to acquire nestable_lock
Thread 0 - acquired nestable_lock again
Thread 2 - failed to acquire nestable_lock
Thread 0 - released nestable_lock
Thread 2 - failed to acquire nestable_lock
Thread 0 - released nestable_lock
Thread 2 - failed to acquire nestable_lock
Thread 2 - acquired nestable_lock
Thread 2 - acquired nestable_lock again
Thread 2 - released nestable_lock
Thread 2 - released nestable_lock

omp_unset_lock

잠금을 해제합니다.

void omp_unset_lock(
   omp_lock_t *lock
);

매개 변수

lock
스레드가 소유하고 함수에서 실행되는 omp_init_lock 사용하여 초기화된 형식 omp_lock_t 의 변수입니다.

설명

자세한 내용은 3.2.4 omp_unset_lock 및 omp_unset_nest_lock 함수를 참조 하세요.

예시

사용 omp_unset_lock예제는 omp_init_lock 참조하세요.

omp_unset_nest_lock

중첩 가능한 잠금을 해제합니다.

void omp_unset_nest_lock(
   omp_nest_lock_t *lock
);

매개 변수

lock
스레드가 소유하고 함수에서 실행되는 omp_init_nest_lock 사용하여 초기화된 형식 omp_nest_lock_t 의 변수입니다.

설명

자세한 내용은 3.2.4 omp_unset_lock 및 omp_unset_nest_lock 함수를 참조 하세요.

예시

사용 omp_unset_nest_lock예제는 omp_init_nest_lock 참조하세요.