Slide 28
Slide 28 text
RISC-Vベクタ命令のプログラミング例
28
# 32ビット整数型どうしのベクトル配列の加算コード
# ベクトルレジスタは32ビット整数型をサポートするように構成されて
いるものとする。
# a0 : ベクトル長Nを保持している。
# a1 : 加算結果を格納するベクトルのポインタを保持している。
# a2 : 加算するベクトル1つ目のポインタを保持している。
# a3 : 加算するベクトル2つ目のポインタを保持している。
loop:
setvl t0, a0 # Nをvlに設定する。t0に現在のvlの値を設定する。
vld v0, a2 # v0に1つ目のベクトルをロードする。
sll t1, t0, 2 # t1はベクトル長Nに相当するバイト数を返す
# (32ビット整数なので×4)
add a2, t1 # a2をロードしたバイト数だけ進める
vld v1, a3 # v1に2つ目のベクトルをロードする。
add a3, t1 # a3をロードしたバイト数だけ進める。
vadd v0, v1 # v0とv1を加算し、その結果をv0に格納する。
sub a0, t0 # ベクトル命令で処理した分だけa0の値を減らす。
vst v0, a1 # 加算した結果をメモリにストアする。
add a1, t1 # 結果ベクトルのポインタを進める。
bnez a0, loop # ベクトル要素が残っていればループを繰り返す。
# そうでなければ終了する。
setvl命令に対象データの長さを設定すると、
同時に処理できる最大長の長さがMVLに
設定される。
例 : 最大で処理できるベクタ長が128で、
N=1000のとき → MVL =128
あとは、N=1000からMVL=128を毎回
減算し、N=0になるまで処理を繰り返す。