ぼくのかんがえたさいきょうCPU レジスタに型(属性)をつける
SIMD系の命令を考えていたらレーンのサイズごとに命令のバリエーションが増えていくことに気付く。例えば加算のバリエーションはスカラデータ、1バイト単位×レーン数、2バイト単位×レーン数、4バイト単位×レーン数……など。さらに浮動小数点のSIMD形式もあって命令が複雑になる。で、レジスタに属性を付けて、属性によって演算の動作を変えることを考えてみた。
SIMD形式でレジスタを分割したものをレーンと呼ぶことにする。ソースレジスタの属性がスカラー型の場合、単純にレジスタ同士の加算が行われ、結果もスカラー属性となる。ソースレジスタが8bit幅のレーンの場合、それぞれのレーンに対して加算が行われ、結果も8bit幅のレーンとなる。これで命令フォーマット側のバリエーションはなくせそうだ。
スカラーとベクターの演算はどうか。これも可能になる。スカラー値と各ベクターのレーンについて演算が行われ、結果が保存される。
ベクター同士の演算で属性が変わることもある。例えば全レーンの総和や平均値を求めたら結果はスカラーとなる。
演算命令については、属性を考慮するものと属性を無視するものに分けられる。
レジスタに属性を付加したので、一時的にレジスタを保存する場合には属性も一緒に保存しなければならない。具体的にはスタックによるレジスタの退避や割り込みによるレジスタの退避が必要。
実行時のペナルティ。演算の方法は命令デコードが終わってもわからず、レジスタの属性をリードした後に確定する。つまりパイプラインが一段深くなる。
レジスタに属性を付けるのはどのタイミングがよいか?レジスタに値がセットされるのはロード命令と演算の結果が保存されるとき。ロード時に属性を明示的に指定、または既存の値が入っているレジスタに対して属性を付加する。指定したレジスタの属性を読みだす手段も欲しい。
属性については、例えば整数レーンと浮動小数点レーンを混在させてレジスタ内に構造体を作ることも可能だが指定方法が複雑になる。演算も複雑になるだろう。そこで整数のみのレーン、浮動小数点のみのレーン、両者混在について考えてみた。タグは演算の対象とはならず、一致するかどうか、ゼロかどうかでトラップを発生する。ただしタグは64bitレジスタ幅以上の場合について、属性の中に含めてしまってもよいかもしれない。
レジスタに付加する属性のフォーマット例:
属性指定はレジスタ幅と同じ
MSB … InValid(Null)
MSB-1 … タグ指定
例:8bitレジスタの属性(タグはなし)
I _ S S _ V V V
例:32bit以上の幅のレジスタの属性
I T _ _ … _ B F F n n n n _ _ S S _ V V V
VVV … ベクター指定 扱えないbit幅はトラップ
000 スカラー
001 8bit
010 16bit
011 32bit
100 64bit
101 128bit
110 256bit
111 512bit
SS … 飽和演算
00..なし
01..符号なし飽和
10..符号付き飽和
11..Reserved
nnn … 浮動小数点 LSBからのSIMD個数 BFF=0のとき無視される
nnn = 0 浮動小数点スカラー
n<=15 ベクター 浮動小数点幅×15がレジスタ幅未満、かつVVV=0(スカラー)の場合は全レーン
浮動小数点幅×nがレジスタ幅を越えるとトラップ
B … BCD浮動小数点指定
F … 浮動小数点サイズ指定
BFF
000 浮動小数点指定なし
001 Single
010 Double
011 Quad
100 (Reserved)
101 (Reserved)
110 BCD Double
111 BCD Quad
指定の優先順 Invalid > Tag > Floating > VectorとSatulation
SIMD形式でレジスタを分割したものをレーンと呼ぶことにする。ソースレジスタの属性がスカラー型の場合、単純にレジスタ同士の加算が行われ、結果もスカラー属性となる。ソースレジスタが8bit幅のレーンの場合、それぞれのレーンに対して加算が行われ、結果も8bit幅のレーンとなる。これで命令フォーマット側のバリエーションはなくせそうだ。
スカラーとベクターの演算はどうか。これも可能になる。スカラー値と各ベクターのレーンについて演算が行われ、結果が保存される。
ベクター同士の演算で属性が変わることもある。例えば全レーンの総和や平均値を求めたら結果はスカラーとなる。
演算命令については、属性を考慮するものと属性を無視するものに分けられる。
レジスタに属性を付加したので、一時的にレジスタを保存する場合には属性も一緒に保存しなければならない。具体的にはスタックによるレジスタの退避や割り込みによるレジスタの退避が必要。
実行時のペナルティ。演算の方法は命令デコードが終わってもわからず、レジスタの属性をリードした後に確定する。つまりパイプラインが一段深くなる。
レジスタに属性を付けるのはどのタイミングがよいか?レジスタに値がセットされるのはロード命令と演算の結果が保存されるとき。ロード時に属性を明示的に指定、または既存の値が入っているレジスタに対して属性を付加する。指定したレジスタの属性を読みだす手段も欲しい。
属性については、例えば整数レーンと浮動小数点レーンを混在させてレジスタ内に構造体を作ることも可能だが指定方法が複雑になる。演算も複雑になるだろう。そこで整数のみのレーン、浮動小数点のみのレーン、両者混在について考えてみた。タグは演算の対象とはならず、一致するかどうか、ゼロかどうかでトラップを発生する。ただしタグは64bitレジスタ幅以上の場合について、属性の中に含めてしまってもよいかもしれない。
レジスタに付加する属性のフォーマット例:
属性指定はレジスタ幅と同じ
MSB … InValid(Null)
MSB-1 … タグ指定
例:8bitレジスタの属性(タグはなし)
I _ S S _ V V V
例:32bit以上の幅のレジスタの属性
I T _ _ … _ B F F n n n n _ _ S S _ V V V
VVV … ベクター指定 扱えないbit幅はトラップ
000 スカラー
001 8bit
010 16bit
011 32bit
100 64bit
101 128bit
110 256bit
111 512bit
SS … 飽和演算
00..なし
01..符号なし飽和
10..符号付き飽和
11..Reserved
nnn … 浮動小数点 LSBからのSIMD個数 BFF=0のとき無視される
nnn = 0 浮動小数点スカラー
n<=15 ベクター 浮動小数点幅×15がレジスタ幅未満、かつVVV=0(スカラー)の場合は全レーン
浮動小数点幅×nがレジスタ幅を越えるとトラップ
B … BCD浮動小数点指定
F … 浮動小数点サイズ指定
BFF
000 浮動小数点指定なし
001 Single
010 Double
011 Quad
100 (Reserved)
101 (Reserved)
110 BCD Double
111 BCD Quad
指定の優先順 Invalid > Tag > Floating > VectorとSatulation
![]() | Pretend & Play(R) Calculator Cash Register 電卓式レジ 米ドル付き Learning Resources 売り上げランキング : 4387 Amazonで詳しく見る by G-Tools |
この記事へのコメント
メモリ上のオブジェクトにハードウェアで型情報(タグ)をサポートするのは、バロースなど幾つかのアーキテクチャに観ることが出来ますが、レジスタに型があると純粋にアルゴリズムだけで記述することが出来そうですね。
また、レジスタ間接アドレスモードも型を参照してくれるとありがたいです。
メモリー上の配列の合計や最大を求めるようなケースで有用です。
あと、複素数と有理数(分数)を型としてサポート出来たら色々と捗りそうです。