自作CPUにおいて、ある程度ベクトル移動命令が動作するようになってきた。
次はマスク命令の動作について考えてみる。マスク命令は、通常の算術演算命令と動作が違うのでちょっと厄介。 実装の方針をちょっとまとめる。
ベクトル演算におけるレーンとデータパス
ベクトル演算命令パイプラインでは、演算器はレーンと呼ばれるグループを複数並べることで構成する。 1レーンはXLENの大きさに相当するデータ幅を管理している。 例えばXLEN=64の場合、SEW=8の場合は8要素の演算を実行し、SEW=32の場合は2要素の演算を並列に実行する。 このレーンを複数並べることによりベクトルデータパスを構成することになる。
Single-width 演算命令
ベクトル演算パイプラインはレーンを複数並べて構成する。 1サイクルで実行することのできるデータパス幅はパラメータDLENで決定されるので、パイプライン上にはDLEN/XLEN個のレーンが物理的に配置されると考えてよい。 VLEN == DLENの場合は、1サイクルでベクトルレジスタの全ての領域を計算する。
VLEN > DLENの場合(VLENはDLENの整数倍である必要がある)は、1サイクルでDLEN幅の演算が実行され、それがVLEN/DLEN回繰り返される。
各レーンでは、複数の単位での算術演算命令を実行することができ、演算の種類、データ幅、入力オペランドが渡され、マスク情報に基づいて演算結果のマスクが行われる。
マスク生成命令
マスク生成演算の場合、SEW=8の場合はXLEN/SEW=8要素の比較結果に基づいて8ビットのマスクを生成し、SEW=32の場合はXLEN/SEW=2要素の比較結果に基づいて2ビットのマスクを返す。
VLEN != DLENの場合はちょっと面倒で、マスク値はすべて下位ビットにまとめられる。従ってベクトル・レジスタの全ての位置を更新する必要はなくて、レジスタの下位に1回だけ結果を書き込むことになる。
このために、ベクトル・パイプライン中にマスクの中間値を保持するためのレジスタを持っている。