インテル(R) コンパイラーでは、OpenMP* ランタイム・ライブラリーへの拡張機能として、次のルーチングループをサポートしています。
並列スレッドのスタックサイズの取得と設定
メモリーの割り当て
ここで説明するインテル拡張ルーチンは、ライブラリー・コードとアプリケーションが目的どおりに機能することを確認する低レベルのチューニングに使用できます。これらのルーチンを使用するには、プログラムをシーケンシャルに実行する -openmp-stubs コマンドライン・オプション (Linux* および Mac OS*) または /Qopenmp-stubs コマンドライン・オプション (Windows*) を使用しなければならないため、十分注意して使用してください。これらのルーチンはまた、その他の OpenMP 互換コンパイラーには認識されません。これらのコンパイラーでは、リンクの段階で失敗します。
以下の関数は、プリプロセッサー宣言子 #include <omp.h> を必要とします。
多くの場合、環境変数は拡張ライブラリー・ルーチンの代わりに使用されます。例えば、並列スレッドのスタックサイズは、kmp_set_stacksize または kmp_set_stacksize_s ライブラリー・ルーチンではなく、kmp_stacksize 環境変数を使用して設定できます。
インテル拡張ルーチンへのランタイムの呼び出しは、対応する環境変数の設定よりも優先します。
kmp_set_stacksize と kmp_get_stacksize は 32 ビットの引数のみを受け付けます。kmp_set_stacksize_s と kmp_get_stacksize_s は、64 ビット整数を保持できる SIZE_T 引数を受け付けます。
IA-64 アーキテクチャー・ベース・システムでは、常に kmp_set_stacksize_s と kmp_get_stacksize_s を使用することを推奨します。スタックサイズを ≥ 2**32 バイト (4GB) に設定するには、_S() の付くバージョンのルーチンを使用する必要があります。
関数 |
説明 |
---|---|
kmp_get_stacksize_s() |
各並列スレッドがプライベート・スタックとして使用するバイト数を返します。この値は、最初の並列領域の前に kmp_set_stacksize_s() で変更するか、または KMP_STACKSIZE 環境変数で変更できます。 |
kmp_get_stacksize() |
この関数は、下位互換性のみ提供します。異なるインテル・プロセッサーとの互換性には kmp_get_stacksize_s() を使用します。 |
kmp_set_stacksize_s(size) |
各並列スレッドがプライベート・スタックとして使用するバイト数を size に設定します。この値は、KMP_STACKSIZE 環境変数で設定することもできます。kmp_set_stacksize_s() を有効にするには、プログラムの最初の (動的に実行された) 並列領域の先頭の前に呼び出す必要があります。 |
kmp_set_stacksize(size) |
この関数は、下位互換性のみ提供します。異なるインテル・プロセッサーとの互換性には kmp_set_stacksize_s() を使用します。 |
インテル・コンパイラーでは、OpenMP ランタイム・ライブラリーに対する拡張機能として、メモリー割り当てルーチンを実装しています。そのため、スレッドは各スレッドにローカルなヒープからメモリーを割り当てることが可能です。これらのルーチンは、 kmp_malloc、kmp_calloc、kmp_realloc です。
これらのルーチンによって割り当てられたメモリーは、kmp_free ルーチンによって解放しなければなりません。あるスレッドによってメモリーを割り当て、別のスレッドでメモリーを解放しても不正な処理ではありませんが、このような処理によってパフォーマンスが多少低下します。
関数 |
説明 |
---|---|
kmp_malloc(size) |
スレッド・ローカル・ヒープから size バイトのメモリーブロックを割り当てます。 |
kmp_calloc(nelem, elsize) |
スレッド・ローカル・ヒープからサイズ elsize の nelem 要素の配列を割り当てます。 |
kmp_realloc(ptr, size) |
スレッド・ローカル・ヒープからアドレス ptr および size バイトにメモリーブロックを再割り当てします。 |
kmp_free(ptr) |
スレッド・ローカル・ヒープからアドレス ptr のメモリーブロックを解放します。メモリーは、以前に kmp_malloc()、kmp_calloc()、または kmp_realloc() で割り当てられている必要があります。 |