はじめに
- この記事はひとりNEONアドベントカレンダー2020 15日目の記事です
- 昨日はbit wise演算子命令を紹介した
- 今日は
dup
命令を紹介する(多分duplicateの意味)
$ grep ^vdup /usr/lib/gcc/aarch64-linux-gnu/7.5.0/include/arm_neon.h | cut -f -2 -d _ | sort | uniq -c
14 vdup_lane
14 vdup_laneq
14 vdup_n
3 vdupb_lane
3 vdupb_laneq
3 vdupd_lane
3 vdupd_laneq
4 vduph_lane
4 vduph_laneq
14 vdupq_lane
14 vdupq_laneq
14 vdupq_n
3 vdups_lane
3 vdups_laneq
dup
命令
- 何度も書いているが、末尾に
q
が付く命令は128bit命令幅、ついてないやつは64bit幅 - 単純に同じデータを全レーンに設定する命令なので、基本的には難しくない
dup_n
命令
- 引数に取るのは単体のデータ(
int8_t
とかfloat
とか) - それをベクトルレジスタ全体に同じ値をセットする
-
dupq_n
命令だと128bit幅レジスタ全レーンに同じデータを設定する
dup_lane
- 第1引数にベクトルレジスタ、第2引数にコンパイル時定数のインデックスを取る
- なかなかに誤解を招きそうなのだが、
q
が付く場所次第で、以下の4通りの命令が存在する-
vdup_lane
: 64bit幅レジスタを返し、64bit幅レジスタを引数に取る -
vdup_laneq
: 64bit幅レジスタを返し、128bit幅レジスタを引数に取る -
vudpq_lane
: 128bit幅レジスタを返し、64bit幅レジスタを引数に取る -
vdupq_laneq
: 128bit幅レジスタを返し、128bit幅レジスタを引数に取る
-
命令 | 戻り値のbit幅 | 第1引数のbit幅 |
---|---|---|
vdup_lane |
64 | 64 |
vdup_laneq |
64 | 128 |
vdupq_lane |
128 | 64 |
vdupq_laneq |
128 | 128 |
- 引数が64bit幅で、戻り値が128bitってどういうことだよ、って感じだけれど、全レーン(全要素)に同じ値を設定するので、そういう命令もあり得る
使い方
- 色変換フィルタみたいに同じ値を全画素に適用したい、という状況で、わざわざメモリ上に配置しなくても所望のベクトルを用意できるので便利
- ちなみに単体の値を返す命令もあるが、要は
vget
命令のエイリアスなので、ここでは割愛
終わりに
- 単一のデータを全レーンに設定する
dup
命令を紹介しました - 明日も手島の執筆予定で、何を書こう。。。。