インテル® Fortran コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス

インテル® コンパイラーの OpenMP* 拡張ルーチン

インテル® コンパイラーでは、OpenMP* ランタイム・ライブラリーへの拡張機能として、次のルーチングループをサポートしています。

ここで説明するインテル拡張ルーチンは、ライブラリー・コードとアプリケーションが目的どおりに機能することを確認する低レベルのチューニングに使用できます。これらのルーチンは、一般にその他の OpenMP* 互換コンパイラーで認識されず、別のコンパイラーではリンクの段階で失敗することがあります。これらの OpenMP* ルーチンを使用するには、[Q]openmp-stubs オプションを指定します。

多くの場合、環境変数は拡張ライブラリー・ルーチンの代わりに使用されます。例えば、並列スレッドのスタックサイズは、KMP_SET_STACKSIZE_S() ライブラリー・ルーチンではなく、OMP_STACKSIZE 環境変数を使用して設定できます。

インテル拡張ルーチンへのランタイムの呼び出しは、対応する環境変数の設定よりも優先します。

実行環境

関数

説明

SUBROUTINE
KMP_SET_DEFAULTS(STRING)
CHARACTER*(*) STRING

引数が "|" で区切られた変数のリストとして定義される OpenMP* 環境変数を設定します。

SUBROUTINE KMP_SET_LIBRARY_THROUGHPUT()

実行モードをスループットに設定します (デフォルト)。アプリケーションによりランタイム環境を特定できます。マルチユーザー環境で使用します。

SUBROUTINE KMP_SET_LIBRARY_TURNAROUND()

実行モードをターンアラウンドに設定します。専用並列 (シングルユーザー) 環境で使用します。

SUBROUTINE KMP_SET_LIBRARY_SERIAL()

実行モードをシリアルに設定します。

SUBROUTINE KMP_SET_LIBRARY(LIBNUM)
INTEGER (KIND=OMP_INTEGER_KIND) LIBNUM

関数に渡された値による実行モードに設定します。有効な値は以下のとおりです。

  • 1 - シリアルモード

  • 2 - ターンアラウンド・モード

  • 3 - スループット・モード

最初の並列領域が実行される前にこのルーチンを呼び出します。

FUNCTION KMP_GET_LIBRARY()
INTEGER (KIND=OMP_INTEGER_KIND) KMP_GET_LIBRARY

現在の実行モードに対応する値を返します。

  • 1 - シリアル

  • 2 - ターンアラウンド

  • 3 - スループット

スタックサイズ

関数

説明

FUNCTION KMP_GET_STACKSIZE_S()
INTEGER(KIND=KMP_SIZE_T_KIND) &
KMP_GET_STACKSIZE_S

各並列スレッドがプライベート・スタックとして使用するバイト数を返します。この値は、最初の並列領域の前に KMP_SET_STACKSIZE_S() ルーチンで変更するか、または KMP_STACKSIZE 環境変数で変更できます。

FUNCTION KMP_GET_STACKSIZE()
INTEGER KMP_GET_STACKSIZE

下位互換性のみ提供します。異なるインテル® プロセッサーとの互換性には KMP_GET_STACKSIZE_S() ルーチンを使用します。

SUBROUTINE KMP_SET_STACKSIZE_S(size)
INTEGER (KIND=KMP_SIZE_T_KIND)size

各並列スレッドがプライベート・スタックとして使用するバイト数を size に設定します。この値は、KMP_STACKSIZE 環境変数で設定することもできます。KMP_SET_STACKSIZE_S() 有効にするには、プログラムの最初の (動的に実行された) 並列領域の先頭の前に呼び出す必要があります。

SUBROUTINE KMP_SET_STACKSIZE_S(size)
INTEGER size

下位互換性のみ提供します。異なるインテル® プロセッサーとの互換性には KMP_SET_STACKSIZE_S(size) を使用します。

メモリー割り当て

インテル® コンパイラーでは、OpenMP* ランタイム・ライブラリーに対する拡張機能として、メモリー割り当てルーチンを実装しています。そのため、スレッドは各スレッドにローカルなヒープからメモリーを割り当てることが可能です。これらのルーチンは、KMP_MALLOC()KMP_CALLOC()、および KMP_REALLOC() です。

これらのルーチンによって割り当てられたメモリーは、KMP_FREE() ルーチンによって解放しなければなりません。あるスレッドでメモリーを割り当て、別のスレッドでメモリーを解放することは可能ですが、このような処理はパフォーマンスを多少低下させます。

同期化の必要ないため、ローカルなヒープで作業するとアプリケーション・パフォーマンスが向上する場合があります。

関数

説明

FUNCTION KMP_MALLOC(size)
INTEGER(KIND=KMP_POINTER_KIND)KMP_MALLOC
INTEGER(KIND=KMP_SIZE_T_KIND)size

スレッド・ローカル・ヒープから size バイトのメモリーブロックを割り当てます。

FUNCTION KMP_CALLOC(nelem,elsize)
INTEGER(KIND=KMP_POINTER_KIND)KMP_CALLOC
INTEGER(KIND=KMP_SIZE_T_KIND)nelem
INTEGER(KIND=KMP_SIZE_T_KIND)elsize

スレッド・ローカル・ヒープからサイズ elsizenelem 要素の配列を割り当てます。

FUNCTION KMP_REALLOC(ptr, size)
INTEGER(KIND=KMP_POINTER_KIND)KMP_REALLOC
INTEGER(KIND=KMP_POINTER_KIND) ptr
INTEGER(KIND=KMP_SIZE_T_KIND)size

スレッド・ローカル・ヒープからアドレス ptr および size バイトにメモリーブロックを再割り当てします。

SUBROUTINE KMP_FREE(ptr)
INTEGER (KIND=KMP_POINTER_KIND)ptr

スレッド・ローカル・ヒープからアドレス ptr のメモリーブロックを解放します。

メモリーは、以前に KMP_MALLOC()KMP_CALLOC()、または KMP_REALLOC() で割り当てられている必要があります。

スレッドのスリープ時間

スループット実行モードでは、スレッドは、新しい並列作業を並列領域の終わりで待機し、一定期間が経過するとスリープ状態に移行します。この待機期間を設定するには、KMP_BLOCKTIME 環境変数または KMP_SET_BLOCKTIME() 関数を使用します。

関数

説明

FUNCTION KMP_GET_BLOCKTIME(
INTEGER KMP_GET_BLOCKTIME

並列領域の実行が終了した後、スレッドがスリープ状態になるまで待機する時間 (ミリ秒単位) を返します。この時間は、KMP_BLOCKTIME 環境変数または KMP_SET_BLOCKTIME() 関数によって設定された値です。

FUNCTION KMP_SET_BLOCKTIME(msec)
INTEGER msec

並列領域の実行が終了した後、スレッドがスリープ状態になるまで待機する時間 (ミリ秒単位) を設定します。このルーチンは、呼び出し側のスレッドおよび呼び出し側のスレッドにより形成される OpenMP* チームのスレッドのブロック時間の設定に影響します。その他のスレッドのブロック時間には影響しません。

関連情報