MISD(Multiple Instruction Single Data)なバーテックスシェーダーを考えてみる
引き続き Zybo (Zynq) 向けGPU設計においてバーテックスシェーダーを考え中である。
テクスチャ座標のパースペクティブコレクションに逆数が必要だったりと、いろいろ演算器設計面倒そうだが、Xilinx のIPコアに各種浮動小数点コアがあるので、ひとまずはそれを使おうかと考えている。が、当然ながらある程度各演算フェーズで演算器の共有をやらないと厳しくなってくる。
(そもそも頂点演算はピクセル数より少ないと思われるので、スループット1のエンジンを作る意味が無い。ピクセルシェーダー側といろいろバランス調整が必要だが、最後にシェーダー並列度数の調整で合わせるのが今風なのだろうか? というかユニファイドシェーダーにすべきなのか?)
そしてWebPackでは高位合成言語など使えない。となると、ある程度プログラマブルなシーケンサが組みたくなる(人はそれをプログラマブルシェーダーと呼ぶ)。
当然ながら浮動小数点演算となるとレイテンシが長いし、でもレイテンシ固定で設計すると後でいろいろ組み替えが面倒だし拡張性が無くなる。
で、思いついたのが
従来の [opcode][src0][src1][dst] のような命令体系ではなく。
[opcode][src0][src1] と [opcode][dst] の2つの命令列に分離してそれぞれで、PC(プログラムカウンタ)もって、同期しながら進めばいいんじゃね? という大胆不敵な案です(まだ構想のみ)。
こうすると入力側プロセッサは演算機がデータを食ってくれなければストール、出力側プロセッサはデータが出てこないとストール。お互いの同期はレジスタ数に応じて適当な単位で同期命令で待ち合わせ。となるのでうまくやれば演算器のスループット/レイテンシを自由度を保ったまま隠蔽できないかなと妄想中。
極端な話PCが2個ってのがポイントで、インストラクションは従来っぽい形式で1個だけ持つことも出来るかも。シェーダーの場合究極的にはデバドラのコンパイラが間に入るので(そんなもん作る気は無いが)、ある程度無茶やってもいい気がしている。
ちなみにさっき思いついただけでどっかの特許に抵触して無いかとかの調査は一切していない(苦笑)。
前々から思っていた SIMD(Single Instruction Multiple Data) はあるのに MISD はなんで無いんだという素朴な疑問に一石を投じられれば面白いのだが、はたして実現性はあるのだろうか?
メリットとして思いつくのは、レイテンシの異なる演算器によって発生するライトバックの追越などの面倒な挙動の責任をソフトウェア(つまりはコンパイラやプログラマ)に押し付けられる、最低限先行投入できる演算指示数を定義しておけばさしあたってソフトウェアをそのままに演算器のレイテンシ/スループットを変更しやすいあたり。デメリットとしては2つの命令流で矛盾があるとデッドロックすることでしょうか(汗
« ZyboへのGPU実装に向けて | トップページ | ZyboでHDMI入力 »
「FPGA」カテゴリの記事
- LUT-Networkの蒸留とMobileNet風構成とセマンティックセグメンテーション(2020.03.09)
- LUT-Networkの蒸留(Distillation)について(2019.12.29)
- FPGAでのDNN(Deep Neural Network)の整理(LUT-Netまとめ)(2019.12.15)
- LUT-NetのFPGAリソースについて(2019.12.08)
- MNIST認識のリアルタイム動作環境更新(2019.09.02)
この記事へのコメントは終了しました。
コメント