この機能は ifx でのみ利用できます。
変数の保存と取得のために OpenMP* はメモリー空間と呼ばれるメモリーを提供します。異なるメモリー空間は異なる特性を持っています。変数の使用方法とアクセス方法に応じて、適切なメモリー空間が決定されます。
各メモリー空間には固有のアロケーターがあり、その空間内のメモリーを割り当てたり、解放するために使用されます。アロケーターは、メモリー空間内の他の割り当てと重複しない連続した空間に変数を割り当ています。異なる特性を持つ複数のメモリー空間を単一のメモリーリソースに割り当てることも可能です。
アロケーターの動作は、指定したアロケーターの特性によって影響を受けます。アロケーターの特性、指定可能な値、およびデフォルト値を次の表に示します。
アロケーターの特性 |
指定可能な値 |
デフォルト値 |
---|---|---|
access |
|
all |
alignment |
バイト数を指定する 2 の累乗の正の整数値 |
1 バイト |
fallback |
|
default_mem_fb |
fb_data |
アロケーター・ハンドル |
なし |
partition |
|
environment |
pinned |
|
false |
pool_size |
正の整数値 |
実装定義 |
sync_hint |
|
contended |
access 特性は、割り当てられるメモリーのアクセシビリティーを指定します。access には、次の値を指定できます。
all
割り当てられるメモリーが、メモリー割り当てが行われるデバイス内のすべてのスレッドからアクセス可能でなければならないことを示します。
これは、デフォルトの設定です。
cgroup
割り当てられるメモリーが、割り当てを要求したスレッドと同じ競合グループのすべてのスレッドからアクセス可能でなければならないことを示します。同じ競合グループに属さないスレッドが割り当てメモリーにアクセスすると、未定義の動作になります。
pteam
割り当てられるメモリーが、割り当てを要求したスレッドと同じ並列領域にバインドされたすべてのスレッドからアクセス可能でなければならないことを示します。メモリーを割り当てたスレッドと同じ並列領域にバインドされていないスレッドがメモリーにアクセスすると、未定義の動作になります。
thread
メモリーを割り当てたスレッドのみが割り当てられたメモリーにアクセスできることを示します。別のスレッドでメモリーを割り当てようとすると、未定義の動作になります。
alignment 特性は、割り当てられる変数のアライメントを指定します。変数は、少なくとも指定された値 (バイト) でアライメントされます。デフォルト設定は 1 バイトです。アライメントは、アライメント要件を指定するディレクティブや OpenMP* ランタイム・アロケーター・ルーチンによっても影響をうけます。
fallback 特性は、アロケーターが割り当て要求を満たすことができない場合の動作を示します。fallback には、次の値を指定できます。
abort_fb
割り当て要求に失敗した場合にプログラムが終了することを示します。
allocator_fb
割り当て要求に失敗すると、fb_data 特性で指定されたアロケーターによって割り当てが試行されます。
default_mem_fb
失敗した割り当て要求が omp_default_mem_space メモリー空間で試行されることを示します。omp_default_mem_space アロケーターのすべての特性は、デフォルトの特性値に設定する必要がありますが、fallback 特性は null_fb に設定する必要があります。これは、デフォルトの設定です。
null_fb
アロケーターが割り当て要求に失敗した場合にゼロの値を返すことを示します。
fb_data 特性は、要求されたアロケーターが割り当て要求を満たせなかった場合に使用するフォールバック・アロケーターを指定することを可能にします。fb_data 特性で指定されたアロケーターを使用するには、失敗したアロケーターの fallback 特性が allocator_fb に設定されていなければなりません。
partition 特性は、アロケーターのメモリー空間によって表されるストレージリソース上で、割り当てられるメモリーがどのように分割されるかを示します。partition には、次の値を指定できます。
blocked
割り当てられるメモリーが、ストレージリソースごとに 1 つの、ほぼ同じサイズのメモリーブロックに分割されることを示します。
environment
ランタイム実行環境によって割り当てられるメモリーの配置が決定されることを示します。これは、デフォルトの設定です。
interleaved
割り当てられるメモリーが、ストレージリソース間でラウンドロビン方式で分散されることを示します。
nearest
割り当てられるメモリーが、割り当てを要求したスレッドに最も近いストレージリソースに配置されることを示します。
pinned 特性の値が true の場合、アロケーターによって行われた各割り当ては、解放されるまでストレージの同じ位置に残ります。デフォルト設定は false です。
pool_size の値は、割り当てが行われていない場合にアロケーターが利用可能なストレージの総バイト数です。以下は、pool_size に影響します。
access 特性の値が all の場合、pool_size の値は、アロケーターにアクセスするすべてのスレッドのすべての割り当ての上限値です。
アロケーターの access 特性の値が cgroup の場合、pool_size の値は、同じ競合グループ内のスレッドから行われる割り当ての上限値です。
access 特性値 pteam の割り当てでは、pool_size の値は、同じ並列チーム内で行われる割り当ての上限値です。
access 特性の値が thread の場合、pool_size の値は、アロケーターを使用して各スレッドから行われる割り当ての上限値です。
pool_size の値を超える割り当てを要求すると、アロケーターは割り当て要求を満たすことができません。
sync_hint 特性は、複数のスレッドがアロケーターにアクセスする方法を示します。sync_hint には、次の値を指定できます。
contended または uncontended
値 contended は、多くのスレッドが同時に割り当てを要求することが想定されることを示し、uncontended は、少数のスレッドが同時に割り当てを要求することが想定されることを示します。デフォルト設定は contended です。
private
すべての割り当て要求が同じスレッドから行われることを示します。private が指定されている場合、2 つ以上のスレッドが同じアロケーターによる割り当て要求を行うと未定義の動作になります。
serialized
複数のスレッドが同時に割り当てを要求しないことを示します。sync_hint 値が serialized のアロケーターによって 2 つ以上のスレッドが同時に割り当てを要求した場合の動作は未定義です。
OpenMP* には、事前定義された 5 つのメモリー空間があります。
omp_default_mem_space は、システムのデフォルトのメモリーです。
omp_large_cap_mem_space は、大容量メモリーです。
omp_high_bw_mem_space は、高帯域幅メモリーです。
omp_low_lat_mem_space は、低レイテンシーのメモリーです。
omp_const_mem_space は、定数値の格納に最適なメモリーです。
コンパイル時の定数式で初期化するか、firstprivate 節を使用して初期化できます。
omp_const_mem_space 内の変数への書き込みは未定義の動作になります。
OpenMP* 標準規格の拡張として、追加で以下の 3 つの事前定義済みメモリー空間があります。
omp_target_host_mem_space は、デバイスからアクセス可能なホストメモリーです。
omp_target_shared_mem_space は、ホストとデバイス間で移行可能なメモリーです。
omp_target_device_mem_space は、デバイスがアクセス可能なメモリーです。
以下の表は、事前定義済みメモリー・アロケーター、関連するメモリー空間、およびデフォルト以外のメモリー特性値を示しています。
アロケーター名 |
関連するメモリー空間 |
デフォルト以外の特性値 |
---|---|---|
omp_default_mem_alloc |
omp_default_mem_space |
fallback=null_fb |
omp_large_cap_mem_alloc |
omp_large_cap_mem_space |
なし |
omp_low_lat_mem_alloc |
omp_low_lat_mem_space |
なし |
omp_high_bw_mem_alloc |
omp_high_bw_mem_space |
なし |
omp_const_mem_alloc |
omp_const_mem_space |
なし |
omp_cgroup_mem_alloc |
実装/システム定義 |
access=cgroup |
omp_pteam_mem_alloc |
実装/システム定義 |
access=pteam |
omp_thread_mem_alloc |
実装/システム定義 |
access=thread |
omp_target_host_mem_alloc |
omp_target_host_mem_space |
なし |
omp_target_shared_mem_alloc |
omp_target_shared_mem_space |
なし |
omp_target_device_mem_alloc |
omp_target_device_mem_space |
なし |