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
の使用例については、「parallel」を参照してください。
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_set_nested
で有効にすることも、OMP_NESTED 環境変数を設定することによって有効にすることもできます。
omp_set_nested
の設定は、OMP_NESTED
環境変数の設定より優先されます。
環境変数を有効にすると、そうでない場合に操作可能なプログラムが中断される可能性があります。これは、並列リージョンを入れ子にすると、スレッド数が指数関数的に増加するためです。 たとえば、OMP スレッド数が 4 に設定された 6 回繰り返す関数には、4,096 (4 の 6 乗) 個のスレッドが必要です。 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」を参照してください。