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_dynamicOMP_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_nestedOMP_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」を参照してください。