インテル® コンパイラーでは、OpenMP* ランタイム・ライブラリーへの拡張機能として、次のルーチングループをサポートしています。
実行環境の取得と設定
並列スレッドのスタックサイズの取得と設定
メモリー割り当て
スループット実行モードにおけるスレッドのスリープ時間の取得と設定
ターゲットメモリー割り当て
ここで説明するインテル拡張ルーチンは、ライブラリー・コードとアプリケーションが目的どおりに機能することを確認する低レベルのチューニングに使用できます。これらのルーチンは、一般にその他の OpenMP* 互換コンパイラーで認識されず、別のコンパイラーではリンクの段階で失敗することがあります。これらの OpenMP* ルーチンを実行するには、/Qopenmp-stubs (Windows*) または -qopenmp-stubs (Linux* および macOS*) オプションを使用します。
多くの場合、環境変数は拡張ライブラリー・ルーチンの代わりに使用されます。例えば、並列スレッドのスタックサイズは、KMP_SET_STACKSIZE_S() ライブラリー・ルーチンではなく、OMP_STACKSIZE 環境変数を使用して設定できます。
インテル拡張ルーチンへのランタイムの呼び出しは、対応する環境変数の設定よりも優先します。
関数 |
説明 |
---|---|
SUBROUTINE |
引数が「|」で区切られた変数のリストとして定義される OpenMP* 環境変数を設定します。 |
SUBROUTINE KMP_SET_LIBRARY_THROUGHPUT() |
実行モードをスループットに設定します (デフォルト)。アプリケーションによりランタイム環境を特定できます。マルチユーザー環境で使用します。 |
SUBROUTINE KMP_SET_LIBRARY_TURNAROUND() |
実行モードをターンアラウンドに設定します。専用並列 (シングルユーザー) 環境で使用します。 |
SUBROUTINE KMP_SET_LIBRARY_SERIAL() |
実行モードをシリアルに設定します。 |
SUBROUTINE KMP_SET_LIBRARY(LIBNUM) |
関数に渡された値による実行モードに設定します。有効な値は以下のとおりです。
最初の並列領域が実行される前にこのルーチンを呼び出します。 |
FUNCTION KMP_GET_LIBRARY() |
現在の実行モードに対応する値を返します。
|
関数 |
説明 |
---|---|
FUNCTION KMP_GET_STACKSIZE_S() |
各並列スレッドがプライベート・スタックとして使用するバイト数を返します。この値は、最初の並列領域の前に KMP_SET_STACKSIZE_S() ルーチンで変更するか、または KMP_STACKSIZE 環境変数で変更できます。 |
FUNCTION KMP_GET_STACKSIZE() |
下位互換性のみ提供します。異なるインテル® プロセッサーとの互換性には KMP_GET_STACKSIZE_S() ルーチンを使用します。 |
SUBROUTINE KMP_SET_STACKSIZE_S(size) |
各並列スレッドがプライベート・スタックとして使用するバイト数を size に設定します。この値は、KMP_STACKSIZE 環境変数で設定することもできます。KMP_SET_STACKSIZE_S() 有効にするには、プログラムの最初の (動的に実行された) 並列領域の先頭の前に呼び出す必要があります。 |
SUBROUTINE KMP_SET_STACKSIZE_S(size) |
下位互換性のみ提供します。異なるインテル® プロセッサーとの互換性には KMP_SET_STACKSIZE_S(size) を使用します。 |
インテル® コンパイラーでは、OpenMP* ランタイム・ライブラリーに対する拡張機能として、メモリー割り当てルーチンを実装しています。そのため、スレッドは各スレッドにローカルなヒープからメモリーを割り当てることが可能です。これらのルーチンは、KMP_MALLOC()、KMP_CALLOC()、および KMP_REALLOC() です。
これらのルーチンによって割り当てられたメモリーは、KMP_FREE() ルーチンによって解放しなければなりません。あるスレッドでメモリーを割り当て、別のスレッドでメモリーを解放することは可能ですが、このような処理はパフォーマンスを多少低下させます。
同期化の必要ないため、ローカルなヒープで作業するとアプリケーション・パフォーマンスが向上する場合があります。
関数 |
説明 |
---|---|
FUNCTION KMP_MALLOC(size) |
スレッド・ローカル・ヒープから size バイトのメモリーブロックを割り当てます。 |
FUNCTION KMP_CALLOC(nelem,elsize) |
スレッド・ローカル・ヒープからサイズ elsize の nelem 要素の配列を割り当てます。 |
FUNCTION KMP_REALLOC(ptr, size) |
スレッド・ローカル・ヒープからアドレス ptr および size バイトにメモリーブロックを再割り当てします。 |
SUBROUTINE KMP_FREE(ptr) |
スレッド・ローカル・ヒープからアドレス ptr のメモリーブロックを解放します。 メモリーは、以前に KMP_MALLOC()、KMP_CALLOC()、または KMP_REALLOC() で割り当てられている必要があります。 |
スループット実行モードでは、スレッドは、新しい並列作業を並列領域の終わりで待機し、一定期間が経過するとスリープ状態に移行します。この待機期間を設定するには、KMP_BLOCKTIME 環境変数または KMP_SET_BLOCKTIME() 関数を使用します。
関数 |
説明 |
---|---|
FUNCTION KMP_GET_BLOCKTIME( |
並列領域の実行が終了した後、スレッドがスリープ状態になるまで待機する時間 (ミリ秒単位) を返します。この時間は、KMP_BLOCKTIME 環境変数または KMP_SET_BLOCKTIME() 関数によって設定された値です。 |
FUNCTION KMP_SET_BLOCKTIME(msec) |
並列領域の実行が終了した後、スレッドがスリープ状態になるまで待機する時間 (ミリ秒単位) を設定します。このルーチンは、呼び出し側のスレッドおよび呼び出し側のスレッドにより形成される OpenMP* チームのスレッドのブロック時間の設定に影響します。その他のスレッドのブロック時間には影響しません。 |
この機能は ifx でのみ利用できます。
関数 | 説明 |
---|---|
TYPE(c_ptr) FUNCTION omp_target_alloc_host (size, device_num) USE, INTRINSIC :: ISO_C_BINDING INTEGER(c_size_t) :: size INTEGER(c_int) :: device_num |
ホストメモリー上に割り当てられたサイズが size バイトのストレージのアドレスを返します。同じポインターを使用して、ホストとすべてのサポートされているデバイスのメモリーにアクセスできます。割り当て要求に失敗した場合、null ポインターを返します。 |
TYPE(c_ptr) FUNCTION omp_target_alloc_device (size, device_num) USE, INTRINSIC :: ISO_C_BINDING INTEGER(c_size_t) :: size INTEGER(c_int) :: device_num |
サイズが size バイトのストレージのアドレスを返します。デバイス割り当ては、デバイスメモリーに device_numin が存在する場合、device_numin で指定されたデバイスによって所有されます。一般に、そのデバイスのみが割り当てにアクセスできますが、割り当てを他のデバイスやホストの割り当てメモリーにコピーすることもできます。戻り値が null ポインターの場合、割り当てに失敗したことを示します。 |
TYPE(c_ptr) FUNCTION omp_target_alloc_shared (size, device_num) USE, INTRINSIC :: ISO_C_BINDING INTEGER(c_size_t) :: size INTEGER(c_int) :: device_num |
サイズが size バイトのストレージのアドレスを返します。同じポインターを使用して、ホストと指定したデバイスのメモリーにアクセスできます。共有割り当ては、ホストと指定したデバイスによって共有され、ホストとデバイス間で移行されます。割り当てに失敗すると null ポインターが返されます。 |