B.43. ベクトルデータ読み出し・変換関数

B.43.1. ベクトルload関数

表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.43.2. 同期関数

表B.119 表:同期関数

関数  詳細 
void barrier (
    cl_mem_fence_flags flags)
カーネルを実行する
ワークグループ内のワーク
アイテムは、その他の
全てのワークアイテムが
バリアーを超えた処理
(バリアー関数の後に
記述された処理)に進む
ために、この関数を実行
する必要があります。この
関数はカーネルを実行する
全てのワークアイテムに
よって呼び出されます。

バリアーが条件文の中に
あるときは、全てのワーク
アイテムは条件文を通過
する必要があります。

バリアーがループ内にある
ときは、バリアーを超え
て次の反復処理に遷移する
まえに全てのワークアイ
テムは前の反復処理を終了
する必要があります。

バリアー関数はメモリフェ
ンス(Memory Fence)を
キューにいれて、ローカル
メモリーまたはグローバ
ルメモリー領域においてメ
モリ操作の順序性を確保
します。

flags引数はメモリーアド
レス領域を指定します。
flagsには以下2つのリ
テラルを設定できます。

CLK_LOCAL_MEM_FENCE:
関数はローカルメモリー
の変数をフラッシュする
か、メモリーフェンスを
キューにいれて、ローカ
ルメモリー領域において
メモリ操作の順序性を
確保します。

CLK_GLOBAL_MEM_FENCE:
メモリーフェンスをキュー
にいれて、グローバルメ
モリー領域においてメモ
リ操作の順序性を確保し
ます。例えばワークアイ
テムがバッファーやイメ
ージに書き込みして、
更新したデータを読み込
む際に使うことができま
す。

B.43.3. 明示的メモリフェンス関数

表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.43.4. 非同期複製・先読み関数

表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.43.5. アトミック関数

表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と呼称)を読み こみ、次に(old - val) を計算し、結果をpが指 すアドレスに書き込み ます。関数は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と 呼称)を読みこみ、次に (old == cmp) ? val : old を計算し、結果をpが指すア ドレスに書き込みます。 関数は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.43.6. shuffle

表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