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

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

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

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

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

実行環境

関数

説明

void kmp_set_defaults(char const *)

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

void kmp_set_library_throughput(void)

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

void kmp_set_library_turnaround(void)

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

void kmp_set_library_serial(void)

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

void kmp_set_library(int)

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

  • 1 - シリアルモード

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

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

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

int kmp_get_library(void)

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

  • 1 - シリアル

  • 2 - ターンアラウンド

  • 3 - スループット

スタックサイズ

関数

説明

size_t kmp_get_stacksize_s(void)

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

int kmp_get_stacksize(void)

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

void kmp_set_stacksize_s(size_tsize)

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

void kmp_set_stacksize(int size)

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

メモリー割り当て

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

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

関数

説明

void* kmp_malloc(size_t size)

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

void* kmp_calloc(size_t nelem, size_t elsize)

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

void* kmp_realloc(void* ptr, size_t size)

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

void* kmp_free(void* ptr)

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

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

スレッドのスリープ時間

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

関数

説明

int kmp_get_blocktime(void)

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

void kmp_set_blocktime(int msec)

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

ターゲットメモリー割り当て

関数 説明

void *omp_target_alloc_host(size_t size, int device_num)

ホストメモリー上に割り当てられたサイズが size バイトのストレージのアドレスを返します。同じポインターを使用して、ホストとすべてのサポートされているデバイスのメモリーにアクセスできます。割り当て要求に失敗した場合、null ポインターを返します。

void *omp_target_alloc_device(size_t size, int device_num)

サイズが size バイトのストレージのアドレスを返します。デバイス割り当ては、デバイスメモリーに device_num が存在する場合、device_num で指定されたデバイスによって所有されます。一般に、そのデバイスのみが割り当てにアクセスできますが、割り当てを他のデバイスやホストの割り当てメモリーにコピーすることもできます。戻り値が null ポインターの場合、割り当てに失敗したことを示します。

void *omp_target_alloc_shared(size_t size, int device_num)

サイズが size バイトのストレージのアドレスを返します。同じポインターを使用して、ホストと指定したデバイスのメモリーにアクセスできます。共有割り当ては、ホストと指定したデバイスによって共有され、ホストとデバイス間で移行されます。割り当てに失敗すると null ポインターが返されます。

void *ompx_target_realloc(void *ptr, size_t size, int device_num)

ptr で指定されたデバイスメモリーの割り当てを解放し、指定されたデバイス device_num に指定されたサイズ (バイト) の新しいデバイスメモリーを割り当てます。割り当てたメモリーは、指定されたデバイスからのみアクセスできます。新しいメモリー・オブジェクトの内容は、古いオブジェクトの割り当てサイズか size のいずれか小さいほうまで、解放前の古いオブジェクトの内容と同じです。

void *ompx_target_realloc_host(void *ptr, size_t size, int device_num)

ptr で指定されたデバイスメモリーの割り当てを解放し、指定されたデバイス device_num に指定されたサイズ (バイト) の新しいデバイスメモリーを割り当てます。割り当てたメモリーは、ホストとサポートされるすべてのデバイスからアクセスできます。新しいメモリー・オブジェクトの内容は、古いオブジェクトの割り当てサイズか size のいずれか小さいほうまで、解放前の古いオブジェクトの内容と同じです。

void *ompx_target_realloc_device(void *ptr, size_t size, int device_num)

ptr で指定されたデバイスメモリーの割り当てを解放し、指定されたデバイス device_num に指定されたサイズ (バイト) の新しいデバイスメモリーを割り当てます。割り当てたメモリーは、指定されたデバイスからのみアクセスできます。新しいメモリー・オブジェクトの内容は、古いオブジェクトの割り当てサイズか size のいずれか小さいほうまで、解放前の古いオブジェクトの内容と同じです。

void *ompx_target_realloc_shared(void *ptr, size_t size, int device_num)

ptr で指定されたデバイスメモリーの割り当てを解放し、指定されたデバイス device_num に指定されたサイズ (バイト) の新しいデバイスメモリーを割り当てます。割り当てたメモリーは、ホストと指定されたデバイスからアクセスできます。新しいメモリー・オブジェクトの内容は、古いオブジェクトの割り当てサイズか size のいずれか小さいほうまで、解放前の古いオブジェクトの内容と同じです。

void *ompx_target_aligned_alloc(size_t alignment, size_t size, int device_num)

指定されたデバイス device_num に指定されたアライメント引数 align でアライメントされたデバイスメモリーを割り当てます。割り当てたメモリーは、指定されたデバイスからのみアクセスできます。

void *ompx_target_aligned_alloc_host(size_t alignment, size_t size, int device_num)

指定されたデバイス device_num に指定されたアライメント引数 align でアライメントされたデバイスメモリーを割り当てます。割り当てたメモリーは、ホストとサポートされるすべてのデバイスからアクセスできます。

void *ompx_target_aligned_alloc_device(size_t alignment, size_t size, int device_num)

指定されたデバイス device_num に指定されたアライメント引数 align でアライメントされたデバイスメモリーを割り当てます。割り当てたメモリーは、指定されたデバイスからのみアクセスできます。

void *ompx_target_aligned_alloc_shared(size_t alignment, size_t size, int device_num)

指定されたデバイス device_num に指定されたアライメント引数 align でアライメントされたデバイスメモリーを割り当てます。割り当てたメモリーは、ホストと指定されたデバイスからアクセスできます。

関連情報