3.6.4 並列実行条件
複数のPE命令式は、ある条件を満たしていればセミコロン(;)で区切って一行に並べることで 1 ステップ内で同時に発行できる。
条件はすべてアセンブラによってチェックされ、違反していればエラーとなる。
本節ではこの条件を詳しく述べる。
まず、PE命令式を表3.6に示すグループに分ける。
table:表3.6 並列実行条件を記述するための、PE命令式のグループ分け
Group Name PE Instruction Opcodes
nop nop
noforward noforward
l2bm l2bmdarw以外の任意のL2BM命令式
l2bmdarw l2bmdarw
l1bm 折り返しでない任意のL1BM命令式
l1bm-turnaround 任意の折り返しL1BM命令式
mau-calc mfma,mmul,vfma,vmul,vadd,vpassa
mau-mwrite mwrite
mau-mread mread
alu 任意のALU命令式
wait wait
条件はステップ内のPE命令式について、以下がすべて満たされていることである。
ここでPEオペランドとは、GRF0、GRF1、LM0、LM1、Tレジスタ、マスクレジスタ、各種フォワーディングのいずれかである。
グループにつき最大 1 つの命令式しか発行されていない*^4
nopが発行されている場合、waitを除く任意の他の命令式が発行されていない
mau-calc、mau-mwrite、mau-mreadの 3 グループうち発行されているのは最大 2 つであり、 2 つならばそれらの命令式はさらに次を満たす
精度指定が同一である
vfmaかvmulのいずれかとmwriteが発行されている場合、vfmaやvmulの第 2 入力とmwriteの入力で、読み出し元PEオペランド、入力の符号反転(3.6.9.22 入力符号反転)、精度拡張(3.6.9.23 入力の精度拡張)、 丸め(3.6.9.24 入力の精度縮減)の指定が同一である
同じ行列レジスタオペランド($xまたは$y)が最大 1 回しか出現しない
複数の命令式が同一のPEオペランドに書き込んでいない
複数の命令式が同一のPEオペランドから読み出している場合、それら全てでアクセスする領域が全サイクルで同一である
言い換えるならば、アドレス可能なPEメモリについて、 1 サイクルで複数種類のアドレスからの読み出しはできない
これにはマスク適用(3.6.2.1 書き込みマスク適用、3.6.2.2 ゼロフラッシュマスク適用)におけるマスクフラグの読み出しも含む
LM0からの読み出しとLM0への書き込みが同時に発行されている場合、両方でアクセスする領域が全サイクルで同一である。
LM1についても同様
即値命令が発行されているならばLM0がアクセスされていない
ゼロフラッシュマスク適用(3.6.2.2 ゼロフラッシュマスク適用)は最大 1 回しか行われていない
*^4 実際にはl2bmdarsは特殊な条件で他のl2bmグループの命令と同時発行できるが、条件が複雑で実用性も低いと考えられるので同グループとして扱うこととした。
本節で述べた条件以外にも、ハザード(3.6.3 ハザードの回避)などにより命令式を追加できない可能性がある。
セミコロン区切りで命令を並べる順序はアセンブル後の機械語命令には影響しない。
ただし、エラー発生時のメッセージは順序によって変わる可能性がある。
例
極端な例としては、次は有効なアセンブリ列になる。
(2行目は改行して表示されているが実際はnoforward;以降はすべて 1 行に書かれている)
code:txt
l2bmdars $lc0@.0 $dar0; l2bmdarw; l1bmrdfadd $lr0v $lbi
noforward;l2bmb $lc256 $lb0; l2bmdarw;l1bmm $lbi $lr0v/$imr1; l1bmrdfadd $lr8v $lb256; gmmul $lx $lm0v $ln0v/$imr1;gmwrite $ls0v $ly0; hrelu/$imr1 $t $t $t;wait i01
カオスだ...wogikaze.icon
l2bmdars, l2bmdarw, l1bmrdfadd
noforward, l2bmb, l2bmdarw, l1bmrdfadd, gmmul, gmwrite, hrelu, wait