RISC-V
ユーザレベル
ISA
2017.NOV.18
たけおか@AXE
@takeoka
2
たけおかって誰?
1977年(高校2年生): MITのJames Slagleの書いたAIの教科書(日本語版)を読んで
「○×」を打つプログラムを8bitマイコンTK-80(8080,RAM 512Bytes)の機械語で書く
1980年代:UNIXのサーバクライアント方式の仮名漢字変換システムWnn、国産シンクライアント(X Window端末”XMiNT”)
などの設計開発に携わる。TCP/IPスタックの独自実装。
時相論理推論型言語Temporal Prologの合理的な実装などを行う
1990年代初頭: 1024PE規模の超並列計算機”SM-1”(豊橋技科大 湯淺研,住友金属)のLSIハードウェア、ソフトウェアの設
計開発に携わる。Common Lispで開発ツール書いた。
当時、超並列計算機は、ニューラルネットのシミュレーションによく使用された
1992年:(株)アックスを興し、マイクロカーネルXTALを設計。XTALはオリンパス社製デジタルカメラ、シャープ ザウルスなどに使
用された。現在、アックスは、人工知能を開発&販売中
名古屋大/東大の自動運転プロジェクト”Autoware”のお手伝い
JASA技術本部長/理事,OSSコンソーシアム副会長,PCクラスタコンソーシアム理事,DEOS協会事務局長/理事
超並列計算機SM-1
(1992年)
シンクライアントXMiNT
(1988年)
オリンパス デジカメ
(2000年)
カラーザウルス(1996年)
論理推論AIを高速化する特許
●
論理推論のルールの集合をルールセット
と呼ぶ
●
機械学習(SVM)を使用して、
ルール・セットを選択
●
論理推論する探索空間が小さくなる
→ 論理推論が高速になる
「ルールセットを選択可能な推論エンジンを有するプログ
ラム、装置及び方法」
RISC-V の感想
極めて
フツー
今回は riscv-spec-v2.2.pdfを読んだ結果です
命令セットの種類
● RV32Iが基本
● RV32Eは組込み
● RV64: 64bit
● 16bit 縮小命令がある
– “C”拡張
● 今回は、RV32I について話す
レジスタ
● 32bitレジスタ 32個
– 0レジスタ
– pcは別
● PCが汎用レジスタは、特許
● Flag は無し
– MIPS 踏襲だなぁ
– Carryフラグは要るんじゃないの…
Endian
● Little endianが基本
● 命令は必ず little endianで格納
● Little endian 全盛だな…
– その方が、いいのだけど
●
データは、下からフェッチしたほうが速いことが通常
– 日立の HPC系 Power も Little endianの時代だしな
命令フォーマット
● opcodeが最下位にあるのは珍しい
– 即値が最上位にある
● rs1,rs2(ソース),rd(デスティネーション) は固定位置
– ただし、5bit 即値 CSR命令は例外; rs1に即値
即値の生成
● 常に符号拡張される。 inst[31]が上位にコピー
– 命令デコードと、符号拡張が並列にできる!
● 命令を見ずに、即値の最上位bitを、コピーできる!
● ブランチ先の計算も、並列にできるよ(頑張れば)
整数演算 即値
● ADDI / SLTI / ANDI / ORI / XORI
– subが無いのは、定数を補数にしてadd しろと
● -1とXORで NOTだよ
● SLLI (左シフト)/ SRLI(右シフト) / SRAI (右算術シフト)
– 0〜31bitシフト可能
● LUI (上位にロード) / AUIPC
– auipc: add upper imm. PC; imm を PCの上位20bitに加算
整数演算 レジスタ
● ADD / SLT / SLTU / AND / OR / XOR
● SLL / SRL / SRA
● SUB
– 減算ある
● NOP
無条件 分岐命令● 無条件jump & link
– ディレイスロットは無い
– rdに、pc+4 が入る
●
JAL
– ±1MBの範囲 ; オフセットは20bit , 1 / 2 されている
– pc ← (sex(imm) << 1 ) + pc +4
● JALR
– 相対アドレスjump; pc ← rs1 + sex(imm) + pc+4
– 演算結果の最下位bit は、0にされる
– オフセットは、12bit
●
x1 : return address, x5: alternate Link レジスタ が標準ソフトウェア・コーリング・コンベ
ンション
– alternate Linkレジスタは、圧縮(compressed)コードで、milli code ルーチンの呼び出しなどをサ
ポートする
条件 分岐命令
●
条件分岐
– 2オペランド比較
– BEQ/BNE
– BLT(less than)/BLTU (unsigned)
● rs1 < rs2
– BGE/BGEU
●
Rs1 >= rs2
●
MIPSよりは、豊富だね
●
分岐のヒントは無し
●
オーバフロー(符号なしキャリー)のチェックは簡単というが…
– 多倍長演算になると、難しいんだよ
– 下のワードからの、繰り上がりを加算しつつ、チェックするのは、何命令も必要
●
キャリー・フラグは要るよ
– 32bit MIPSで、128bit 演算をする時とか
Load/store 命令
● LW / LH / LHU / LB / LBU
– LW:32bit load
– LH: 16bit load 符号拡張
– LHU: 16bit load 符号拡張無し(上位に0フィル)
– LB / LBU : 8bit load
● SW / SH / SB
– rs2 の下位を Store
● データのミス・アラインも許す(基本命令セットでは)
スレッド
● 「hart」
– ハードウェア・スレッド
– ソフトウェア制御のスレッド・コンテキストと、明確に区別
●
ハードウェア・スレッド
– user register, state, PCを持つ
● IOや、他のhartとやりとりする時には、FENCE
– FENCE前の命令の実行終了を待つ
– Out of order 実行なので
FENCE命令
● sync命令の類
●
コプロセッサも、この機構を使用
● I:デバイス入力, O:デバイス出力, R:メモリ・リード, W: メ
モリ・ライト
– 非公式だが、Predecessor をセットしたhartだけが
successorを見ることができる
● CPUを作る人は、メモリ・マップドIOは、I/Oにするべき
FENCE.I命令
● 命令&データ ストリームの終わりがわからない
● 命令メモリに書く時、FENCE.Iで同期してから
– 同一hartの時
Control and Status Register命令
● RDCYCLE[H]
– hartが実行したマシン・サイクル
● RDTIME[H]
– タイマ読み出し
– RDTIME[H]は wall clockの読み出し
● RDINSTRET[H]
– このhartでの、実行完了した(retired)命令数の読み出し
● out of order実行も考慮ずみ
整数 乗除算(基本拡張 “M”)
● MUL / MULH[S][U] / MULW
– MULH は、符号 付き/なし
– MULWは RV64 の時だけ
● DIV[U]/ REM[U]
● DIV[U]W / REM[U]W
– 0除算、符号付き除算オーバーフローの結果が定義され
ている
アトミック命令(基本拡張 “A”)
● LR/SC (Load-Reserved/Store-Conditional)
– MIPSの LL/SCと同様
● AMO (atomic memory operation)
– rs1で指定されたメモリの内容とrs2で、
AND/OR/XOR/SWAP/MAX/MINができる
– しかも、read modified write で行う
浮動小数点(基本拡張 “F”,”D”,”Q”,”L”)
● 浮動小数点レジスタ 32個、fcsr 1個
●
丸め指定可能
– 切り上げ/切り捨て/四捨五入
● F命令: single float
– 四則,SQRT,MIN,MAX
– Mul add は無い
● D命令: double float
● Q命令: quad float (四倍精度)
● L命令: 10進 浮動小数点演算
SIMD "P”拡張
● これは、”V”ベクトルのために、落ちるかも
● P命令
● パックト・SIMD
● LOAD-FP, STORE-FP で、サイズを大きく指定でき
る
ベクトル "V”拡張
●
データ・サイズ色々
● 命令は、spec-v2.2の中では
ちゃんと規定されていない
● vaddはある(例題に)
ベクトル "V”拡張
● この例題をみれば、大体使えるな(^^;
圧縮命令 "C”拡張
● RVC
● 16bit命令
ユーザ・レベル割り込み "N”拡張
● URET命令
● UIEビット:割り込み禁止
●
ユーザレベル割込が受け付けられると
– UIEがUPIEへコピーされる
– UIEは0になる
その他
● “B” ビット操作
● “J” 動的変換言語 (Java用???)
● "T” トランザクション・メモリ
以上

RISC-V User level ISA