表B.118 表:ロードと保存
関数 | 解説 |
---|---|
gentypen vloadn( size_t offset, const global gentype *p) gentypen vloadn( size_t offset, const local gentype *p) gentypen vloadn( size_t offset, const constant gentype *p) gentypen vloadn( size_t offset, const private gentype *p) | `sizeof(gentypen)` バイトのデータ `(p + (offset * n)` のアドレスで読み込み) を返します。 gentypeがcharまたは ucharのときは、 `(p + (offset * n))` として計算されるアドレス は8-bitとして揃う(アラ インメントをとる)必要が あります。 gentypeがshortまたは ushortのときは、 16-bit長で揃えます。 int、uint、floatのと きは、32-bit長で揃えま す。long、ulong、 doubleのときは、64-bit 長で揃えます。 vloadnはアラインメント のとれてないベクトルの ロードに使います。 |
void vstoren( gentypen data, size_t offset, global gentype *p) void vstoren( gentypen data, size_t offset, local gentype *p) void vstoren( gentypen data, size_t offset, private gentype *p) | sizeof(gentypen) のデータを `(p + (offset * n))` のアドレスに書き込みます。 gentypeがcharまたは ucharのときは、 `(p + (offset * n))` として計算されるアドレス は8-bitとして揃う(アラ インメントをとる)必要が あります。 gentypeがshortまたは ushortのときは、 16-bit長で揃えます。 int、uint、floatのとき は、32-bit長で揃えます。 long、ulong、double のときは、64-bit長で 揃えます。 vstorenはアラインメント のとれてないベクトルの 書き込みに使います。 |
floatn vload_halfn( size_t offset, const global half *p) floatn vload_halfn( size_t offset, const local half *p) floatn vload_halfn(size_t offset, const constant half *p) floatn vload_halfn(size_t offset, const private half *p) | sizeof(halfn)バイトの データ`(p + (offset * n)` のアドレスで読み込み) を返します。 読み込んだデータはhalfn として解釈されます。そし てhalfnの値はfloatnに 変換され、floatnの値が 返されます。 `(p + (offset * n)` のアドレスは、16-bit長 で揃える必要があります。 vload_halfnはアラインメ ントのとれてないベクトルの ロードをし、floatのベク トルを返します。 |
void vstore_half( float data, size_t offset, global half *p) void vstore_half_rte( float data, size_t offset, global half *p) void vstore_half_rtz( float data, size_t offset, global half *p) void vstore_half_rtp( float data, size_t offset, global half *p) void vstore_half_rtn( float data, size_t offset, global half *p) void vstore_half( float data, size_t offset, local half *p) void vstore_half_rte( float data, size_t offset, local half *p) void vstore_half_rtz( float data, size_t offset, local half *p) void vstore_half_rtp( float data, size_t offset, local half *p) void vstore_half_rtn( float data, size_t offset, local half *p) void vstore_half( float data, size_t offset, private half *p) void vstore_half_rte( float data, size_t offset, private half *p) void vstore_half_rtz( float data, size_t offset, private half *p) void vstore_half_rtp( float data, size_t offset, private half *p) void vstore_half_rtn( float data, size_t offset, private half *p) | 適当な丸めモードを使い dataはhalfに変換されます。 half値は`(p + offset)` のメモリーアドレスに書き込 まれます。 `(p + offset)`は16-bit 長にそろえる必要があります。 vstore_halfの既定の丸め モードは、最近接偶数への 丸め (round to the nearest even、接尾が_rte) です。 |
void vstore_halfn( floatn data, size_t offset, global half *p) void vstore_halfn_rte( floatn data, size_t offset, global half *p) void vstore_halfn_rtz( floatn data, size_t offset, global half *p) void vstore_halfn_rtp( floatn data, size_t offset, global half *p) void vstore_halfn_rtn( floatn data, size_t offset, global half *p) void vstore_halfn( floatn data, size_t offset, local half *p) void vstore_halfn_rte( floatn data, size_t offset, local half *p) void vstore_halfn_rtz( floatn data, size_t offset, local half *p) void vstore_halfn_rtp( floatn data, size_t offset, local half *p) void vstore_halfn_rtn( floatn data, size_t offset, local half *p) void vstore_halfn( floatn data, size_t offset, private half *p) void vstore_halfn_rte( floatn data, size_t offset, private half *p) void vstore_halfn_rtz( floatn data, size_t offset, private half *p) void vstore_halfn_rtp( floatn data, size_t offset, private half *p) void vstore_halfn_rtn( floatn data, size_t offset, private half *p) | 適当な丸めモードを使い floatn型のdataはhalfn に変換されます。halfnの 値は`(p + (offset * n))` のメモリーアドレスに書き 込まれます。 `(p + (offset * n)`の アドレスは、16-bit長で揃 える必要があります。 vstore_halfnの既定の丸 めモードは、最近接偶数へ の丸め (round to the nearest even、接尾が_rte) です。 |
floatn vloada_halfn( size_t offset, const global half *p) floatn vloada_halfn( size_t offset, const local half *p) floatn vloada_halfn( size_t offset, const constant half *p) floatn vloada_halfn( size_t offset, const private half *p) | `n = 1,2,4,8,16`のとき、 `(p + (offset * n))` のアドレスのデータを `sizeof(halfn)`バイト読 み込みます。アドレスは `sizeof(halfn)`をアライ ンメントをとる必要があります。 `n = 3`のときは、 `(p + (offset * 4))`の アドレスからhalf3のデータを 読み込みます。アドレスは `sizeof(half) * 4`とアラ インメントをとる必要があります。 読み込まれたデータはhalfn の値として解釈され、halfn の値はfloatnに変換され、 返されます。 vloada_halfnはアライメン トがとれたベクトルのロード をし、floatのベクトルを 返します。 |
void vstorea_halfn( floatn data, size_t offset, global half *p) void vstorea_halfn_rte( floatn data, size_t offset, global half *p) void vstorea_halfn_rtz( floatn data, size_t offset, global half *p) void vstorea_halfn_rtp( floatn data, size_t offset, global half *p) void vstorea_halfn_rtn( floatn data, size_t offset, global half *p) void vstorea_halfn( floatn data, size_t offset, local half *p) void vstorea_halfn_rte( floatn data, size_t offset, local half *p) void vstorea_halfn_rtz( floatn data, size_t offset, local half *p) void vstorea_halfn_rtp( floatn data, size_t offset, local half *p) void vstorea_halfn_rtn( floatn data, size_t offset, local half *p) void vstorea_halfn( floatn data, size_t offset, private half *p) void vstorea_halfn_rte( floatn data, size_t offset, private half *p) void vstorea_halfn_rtz( floatn data, size_t offset, private half *p) void vstorea_halfn_rtp( floatn data, size_t offset, private half *p) void vstorea_halfn_rtn( floatn data, size_t offset, private half *p) | 適当な丸めモードでfloatn のデータがhalfnに変換 されます。 `n = 1,2,4,8,16`のとき、 halfnの値が `(p + (offset * n))` のアドレスに書き込まれます。 アドレスは`sizeof(halfn)` をアラインメントをとる必 要があります。 `n = 3`のときは、halfn の値を`(p + (offset * 4))` のアドレスに書き込みます。 アドレスは `sizeof(half) * 4`バイト とアラインメントをとる必要 があります。 vstorea_halfnの既定 の丸めモードは、最近接 偶数への丸め (round to the nearest even、 接尾が_rte) です。 |
void vstore_half( double data, size_t offset, global half *p) void vstore_half_rte( double data, size_t offset, global half *p) void vstore_half_rtz( double data, size_t offset, global half *p) void vstore_half_rtp( double data, size_t offset, global half *p) void vstore_half_rtn( double data, size_t offset, global half *p) void vstore_half( double data, size_t offset, local half *p) void vstore_half_rte( double data, size_t offset, local half *p) void vstore_half_rtz( double data, size_t offset, local half *p) void vstore_half_rtp( double data, size_t offset, local half *p) void vstore_half_rtn( double data, size_t offset, local half *p) void vstore_half( double data, size_t offset, private half *p) void vstore_half_rte( double data, size_t offset, private half *p) void vstore_half_rtz( double data, size_t offset, private half *p) void vstore_half_rtp( double data, size_t offset, private half *p) void vstore_half_rtn( double data, size_t offset, private half *p) | 適当な丸めモードを使い double型のdataはhalfに 変換されます。halfの値は `(p + offset)`のメモリー アドレスに書き込まれます。 `(p + offset)`のアドレス は、16-bit長で揃える必要 があります。 vstore_halfの既定の丸め モードは、最近接偶数への 丸め (round to the nearest even、接尾が _rte) です。 |
void vstore_halfn( doublen data, size_t offset, global half *p) void vstore_halfn_rte( doublen data, size_t offset, global half *p) void vstore_halfn_rtz( doublen data, size_t offset, global half *p) void vstore_halfn_rtp( doublen data, size_t offset, global half *p) void vstore_halfn_rtn( doublen data, size_t offset, global half *p) void vstore_halfn( doublen data, size_t offset, local half *p) void vstore_halfn_rte( doublen data, size_t offset, local half *p) void vstore_halfn_rtz( doublen data, size_t offset, local half *p) void vstore_halfn_rtp( doublen data, size_t offset, local half *p) void vstore_halfn_rtn( doublen data, size_t offset, local half *p) void vstore_halfn( doublen data, size_t offset, private half *p) void vstore_halfn_rte( doublen data, size_t offset, private half *p) void vstore_halfn_rtz( doublen data, size_t offset, private half *p) void vstore_halfn_rtp( doublen data, size_t offset, private half *p) void vstore_halfn_rtn( doublen data, size_t offset, private half *p) | 適当な丸めモードを使い doublen型のdataはhalfn に変換されます。halfn の値は `(p + (offset * n))` のメモリーアドレスに書 き込まれます。 `(p + (offset * n)` のアドレスは、16-bit長 で揃える必要があります。 vstore_halfnの既定の 丸めモードは、最近接 偶数への丸め (round to the nearest even、 接尾が_rte) です。 |
void vstorea_halfn( doublen data, size_t offset, global half *p) void vstorea_halfn_rte( doublen data, size_t offset, global half *p) void vstorea_halfn_rtz( doublen data, size_t offset, global half *p) void vstorea_halfn_rtp( doublen data, size_t offset, global half *p) void vstorea_halfn_rtn( doublen data, size_t offset, global half *p) void vstorea_halfn( doublen data, size_t offset, local half *p) void vstorea_halfn_rte( doublen data, size_t offset, local half *p) void vstorea_halfn_rtz( doublen data, size_t offset, local half *p) void vstorea_halfn_rtp( doublen data, size_t offset, local half *p) void vstorea_halfn_rtn( doublen data, size_t offset, local half *p) void vstorea_halfn( doublen data, size_t offset, private half *p) void vstorea_halfn_rte( doublen data, size_t offset, private half *p) void vstorea_halfn_rtz( doublen data, size_t offset, private half *p) void vstorea_halfn_rtp( doublen data, size_t offset, private half *p) void vstorea_halfn_rtn( doublen data, size_t offset, private half *p) | 適当な丸めモードで doublenのdataは halfnに変換されます。 `n = 1,2,4,8,16`の とき、halfnの値が `(p + (offset * n))` のアドレスに書き込まれま す。アドレスは sizeof(halfn)をアラ インメントをとる必要があります。 `n = 3`のときは、halfn の値を `(p + (offset * 4))` のアドレスに書き込み ます。アドレスは `sizeof(half) * 4` バイトとアラインメン トをとる必要があります。 vstorea_halfnの 既定の丸めモードは、 最近接偶数への丸め (round to the nearest even、 接尾が_rte) です。 |
表B.119 表:同期関数
関数   | 詳細  |
---|---|
void barrier ( cl_mem_fence_flags flags) | カーネルを実行する ワークグループ内のワーク アイテムは、その他の 全てのワークアイテムが バリアーを超えた処理 (バリアー関数の後に 記述された処理)に進む ために、この関数を実行 する必要があります。この 関数はカーネルを実行する 全てのワークアイテムに よって呼び出されます。 バリアーが条件文の中に あるときは、全てのワーク アイテムは条件文を通過 する必要があります。 バリアーがループ内にある ときは、バリアーを超え て次の反復処理に遷移する まえに全てのワークアイ テムは前の反復処理を終了 する必要があります。 バリアー関数はメモリフェ ンス(Memory Fence)を キューにいれて、ローカル メモリーまたはグローバ ルメモリー領域においてメ モリ操作の順序性を確保 します。 flags引数はメモリーアド レス領域を指定します。 flagsには以下2つのリ テラルを設定できます。 CLK_LOCAL_MEM_FENCE: 関数はローカルメモリー の変数をフラッシュする か、メモリーフェンスを キューにいれて、ローカ ルメモリー領域において メモリ操作の順序性を 確保します。 CLK_GLOBAL_MEM_FENCE: メモリーフェンスをキュー にいれて、グローバルメ モリー領域においてメモ リ操作の順序性を確保し ます。例えばワークアイ テムがバッファーやイメ ージに書き込みして、 更新したデータを読み込 む際に使うことができま す。 |
表B.120 表:メモリフェンス関数
関数 | 詳細   |
---|---|
void mem_fence ( cl_mem_fence_flags flags) | カーネルを実行する ワークアイテムのロー ドや保存の前後の順序を 整列させます。これは メモリーフェンスの後 に記述されたロードや保 存が行われる前に、ロード や保存はメモリーに コミットされることを意 味します。 flags引数はメモリー アドレス領域を指定し、 以下の2つのリテラル 値を適用することが できます。 CLK_LOCAL_MEM_FENCE CLK_GLOBAL_MEM_FENCE |
void read_mem_fence ( cl_mem_fence_flags flags) | ロード(読み込み) のみを整列します。 flags引数はメモリー アドレス領域を指定し、 以下の2つのリテラル 値を適用することが できます。 CLK_LOCAL_ MEM_FENCE CLK_GLOBAL_ MEM_FENCE |
void write_mem_fence ( cl_mem_fence_flags flags)  | 保存(書き込み) のみを整列します。 CLK_LOCAL_ MEM_FENCE CLK_GLOBAL_ MEM_FENCE |
表B.121 表:非同期ワークグループ関数
関数 | 詳細 |
---|---|
event_t async_work_group_copy ( __local gentype *dst, const __global gentype *src, size_t num_gentypes, event_t event) event_t async_work_group_copy ( __global gentype *dst, const __local gentype *src, size_t num_gentypes, event_t event) | num_gentypes数の gentype要素を、srcから dstに非同期コピーします。 非同期コピーはワークグ ループ内の全てのワーク アイテムによって行われます。 非同期コピーの終了を待機 するwait_group_events で使うイベントオブジェクト (event_t)を返します。 event引数を指定すると、 それ以前に使ったasync_ work_group_copyと関連づ けることができますが、関連 させない場合はeventは0と します。 event引数が0でない場合 は、event引数にいれたイ ベントオブジェクトが返さ れます。 この関数はコピーをする前 にbarrierを使うときと は異なり、非明示的なソー スデータの同期はおこない ません。 |
event_t async_work_group_strided_copy ( __local gentype *dst, const __global gentype *src, size_t num_gentypes, size_t src_stride, event_t event) event_t async_work_group_strided_copy ( __global gentype *dst, const __local gentype *src, size_t num_gentypes, size_t dst_stride, event_t event)   | num_gentypes数の gentype要素を、srcか らdstに非同期採集(gather) します。src_strideは、 srcから読み込んだ gentype型の要素内の ストライドを指します。 dst_strideはdstに 書き込まれるgentype型 の要素内のストライドを指します。 非同期コピーの終了を待機する wait_group_eventsで 使うイベントオブジェクト (event_t)を返します。 event引数を指定すると、 それ以前に使ったasync_ work_group_copyと関連 づけることができますが、 関連させない場合はevent は0とします。 event引数が0でない場合は、 event引数にいれたイベ ントオブジェクトが返さ れます。 この関数はコピーをする 前にbarrierを使うとき とは異なり、非明示的な ソースデータの同期はお こないません。 src_strideまたは dst_strideが0に指定 されたときの戻り値は 未定義です。 src_strideまたは dst_strideが、src またはdstポインタの コピー時のアドレス 領域の上限を超えると きも未定義となります。 |
void wait_group_events ( int num_events, event_t *event_list) | async_work_group_ copyが処理を完了する ことを照合するイベン トの待機をします。 event_list引数で指 定したイベントオブジ ェクトは待機後に解放 されます。 |
void prefetch ( const __global gentype *p, size_t num_gentypes) | num_gentypes * sizeof(gentype) バイトをグローバルキ ャッシュにプリフェッ チ(先取り)します。 |
表B.122 表:アトミック関数
関数 | 詳細 |
---|---|
int atomic_add ( volatile __global int *p, int val) unsigned int atomic_add ( volatile __global unsigned int *p, unsigned int val) int atomic_add ( volatile __local int *p, int val) unsigned int atomic_add ( volatile __local unsigned int *p, unsigned int val) | ポインタpが指すアド レスで32-bitの値 (oldと呼称)を読みこみ、 次に`(old + val)`を 計算し、結果をpが指すア ドレスに書き込みます。 関数はoldを返します。 |
int atomic_sub ( volatile __global int *p, int val) unsigned int atomic_sub ( volatile __global unsigned int *p, unsigned int val) int atomic_sub (volatile __local int *p, int val) unsigned int atomic_sub ( volatile __local unsigned int *p, unsigned int val) | ポインタpが指す
アドレスで32-bitの値
(oldと呼称)を読み
こみ、次に |
int atomic_xchg ( volatile __global int *p, int val) unsigned int atomic_xchg ( volatile __global unsigned int *p, unsigned int val) float atomic_xchg ( volatile __global float *p, float val) int atomic_xchg ( volatile __local int *p, int val) unsigned int atomic_xchg ( volatile __local unsigned int *p, unsigned int val) float atomic_xchg ( volatile __local float *p, float val) | アドレスpに保存され た古い値を、引数で指 定した値valとスワッ プします。古い値を 返します。 |
int atomic_inc ( volatile __global int *p) unsigned int atomic_inc ( volatile __global unsigned int *p) int atomic_inc ( volatile __local int *p) unsigned int atomic_inc ( volatile __local unsigned int *p) | ポインタpが指すア ドレスで32-bitの値 (oldと呼称)を読みこ み、次に`(old + 1)`を 計算し、結果をpが指すア ドレスに書き込みます。 関数はoldを返します。 |
int atomic_dec ( volatile __global int *p) unsigned int atomic_dec ( volatile __global unsigned int *p) int atomic_dec (volatile __local int *p) unsigned int atomic_dec ( volatile __local unsigned int *p) | ポインタpが指すアド レスで32-bitの値(old と呼称)を読みこみ、次に (old - 1)を計算し、結果 をpが指すアドレスに書き 込みます。関数はoldを 返します。  |
int atomic_cmpxchg ( volatile __global int *p, int cmp, int val) unsigned int atomic_cmpxchg ( volatile __global unsigned int *p, unsigned int cmp, unsigned int val) int atomic_cmpxchg ( volatile __local int *p, int cmp, int val) unsigned int atomic_cmpxchg ( volatile __local unsigned int *p, unsigned int cmp, unsigned int val) | ポインタpが指すアドレス
で32-bitの値(oldと
呼称)を読みこみ、次に
|
int atomic_min ( volatile __global int *p, int val) unsigned int atomic_min ( volatile __global unsigned int *p, unsigned int val) int atomic_min ( volatile __local int *p, int val) unsigned int atomic_min ( volatile __local unsigned int *p, unsigned int val) | ポインタpが指すアドレ スで32-bitの値(oldと 呼称)を読みこみ、次に `min(old, val)`を計算 し、結果をpが指すアドレ スに書き込みます。関数は oldを返します。 |
int atomic_max ( volatile __global int *p, int val) unsigned int atomic_max ( volatile __global unsigned int *p, unsigned int val) int atomic_max ( volatile __local int *p, int val) unsigned int atomic_max ( volatile __local unsigned int *p, unsigned int val)  | ポインタpが指すアドレス で32-bitの値(oldと呼称) を読みこみ、次に `max(old, val)`を計 算し、結果をpが指すアド レスに書き込みます。関 数はoldを返します。 |
int atomic_and ( volatile __global int *p, int val) unsigned int atomic_and ( volatile __global unsigned int *p, unsigned int val) int atomic_and ( volatile __local int *p, int val) unsigned int atomic_and ( volatile __local unsigned int *p, unsigned int val) | ポインタpが指すアドレス で32-bitの値(oldと呼称) を読みこみ、次に (old & val)を計算し、 結果をpが指すアドレスに書 き込みます。関数はoldを 返します。 |
int atomic_or ( volatile __global int *p, int val) unsigned int atomic_or ( volatile __global unsigned int *p, unsigned int val) int atomic_or ( volatile __local int *p, int val) unsigned int atomic_or ( volatile __local unsigned int *p, unsigned int val)   | ポインタpが指すアドレスで 32-bitの値(oldと呼称) を読みこみ、次に`(old |
val)` を計算し、結果をpが指 すアドレスに書き込みます。 関数はoldを返します。 | int atomic_xor ( volatile global int *p, int val) unsigned int atomic_xor ( volatile global unsigned int *p, unsigned int val) int atomic_xor ( volatile local int *p, int val) unsigned int atomic_xor ( volatile local unsigned int *p, unsigned int val)   |
表B.123 表:シャッフル関数
関数 | 詳細  |
---|---|
int vec_step (gentypen a) int vec_step (char3 a) int vec_step (uchar3 a) int vec_step (short3 a) int vec_step (ushort3 a) int vec_step (half3 a) int vec_step (int3 a) int vec_step (uint3 a) int vec_step (long3 a) int vec_step (ulong3 a) int vec_step (float3 a) int vec_step(double3 a) int vec_step(type) | 引数で指定したスカラと ベクトルの要素数を整数値 として返します。 全てのスカラ型に対して は1を返します。 要素数3のベクトルについ て4を返します。 引数を型名にもできます。 例: vec_step(float2) |
gentypen shuffle ( gentypem x, ugentypen mask) gentypen shuffle2 ( gentypem x, gentypem y, ugentypen mask) | 一つまたは2つの入力ベ クトルに対してマスクを 適用し、要素間の順序変 更をします。 shuffleではマスク要素 はilogb(2m-1)数の最下 位ビットのみを使います。 shuffle2ではマスク要素 はilogb(2m-1)+1のみを 使います。 その他のマスクビットは使 われることはありません。 入力ベクトルは左から右に 数えます。このためにベク トルの要素数の数はvec_ step(gentypem)を使います。 マスクの各要素は結果ベクト ルがどの要素を代入されるか 指定します。これは入力ベク トルが2つの場合は、線に要 素を並べて左から要素番号を 与えるように作用します。 |
Copyright 2018-2019, by Masaki Komatsu