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 참조하세요.