竹下世界塔の計算機よもやま話

アクセスカウンタ

zoom RSS SIMDのマルチレイヤー表現

<<   作成日時 : 2017/06/04 23:44   >>

ブログ気持玉 0 / トラックバック 0 / コメント 0

 ぼくのかんがえたさいきょうCPUは今のところレジスタの幅が32KBで四倍精度浮動小数点をSIMDで扱うと同時に2048個も扱える。が、ここまでのサイズがあると同種のデータだけ扱うのではなく構造体やタグも付加したい。ではどうやって表現しようか?

関連:
ぼくのかんがえたさいきょうCPU エンディアンとタグ付きデータの扱い
ぼくのかんがえたさいきょうCPU レジスタの属性、タグアーキ

 汎用レジスタのデータサイズは2^(n-1)バイトで1〜32768バイト、SIMD形式で扱うレーン1つあたりのサイズは同じく2^(m-1)であらわす。レーンの本数は2^(m-n)で求められる。m=nのときはレーンが1本でスカラとなる。
レーンのサイズは内部の演算器が扱える演算の種類で決まり、四倍精度浮動小数点だと16バイトである。将来はこれ以上のサイズも扱えるかもしれない。
 さて、m,nで汎用レジスタ全体のサイズと各レーンのサイズおよびレーン数が決まった。ではさらに他の形式を扱うにはどうするか。LSB側のレーンをさらにSIMD形式に分割し、より細かいデータを表現する。

画像


 図は全体のサイズが16バイトで4分割され、単精度浮動小数点(4バイト)の型である。最下位のレーンは次のlayer1で定義する。
layer1は全体のサイズを4バイトとみなし、2バイトで2分割する。最上位のレーンは2バイトの整数で、最下位のレーンはlayer2で定義する。
layer2は全体のサイズを2バイトとみなし、1バイトで2分割する。
これ以上別のSIMD型は定義しないので、全体では単精度浮動小数点×3、2バイト整数×1、1バイト整数×2の構造体が出来上がる。

 この16バイトの汎用レジスタの内部は以下の様に表現できる。
Layer0: n=5、m=3、type=float、LSB=next
Layer1: n=3、m=2、type=int、LSB=next
Layer2: n=2、m=1、type=int、LSB=end

n、mは最初のLayer0用のみ定義すれば下位のLayerは自然に決まる。LSBの表現は1bitでいいので、typeに7bit割り当てればLayerごとに1バイトでよい。Layer1〜の数はレーンで扱う最大のデータ幅で決まる。四倍精度浮動小数点16バイトではLayer0〜layer4まであればよい。

 これで制限はあるが構造体が表現できそうだ。最下位のレーンをタグとして扱う場合には、最下位レイヤーの最下位レーンのみを比較する命令が必要。条件判断でこのタグが不一致の場合は1命令スキップし、続く演算命令をバイパスする。
 構造体の演算については、例えば浮動小数点の型と整数の型が同時に加算というのはなさそうなので、レイヤーごとに演算をする/しないの指定と最下位のレーンを演算から除外する指定を追加したい。

 で、このデータ表現ですが最下位をnextポインタとしたLispのセル表現類似ですね。風呂で思いつきました。

テーマ

注目テーマ 一覧


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ

トラックバック(0件)

タイトル (本文) ブログ名/日時

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文




SIMDのマルチレイヤー表現 竹下世界塔の計算機よもやま話/BIGLOBEウェブリブログ
文字サイズ:       閉じる