テーマ:ぼくのかんがえたさいきょうCPU

ぼくのかんがえたさいきょうCPU: ZLSアーキテクチャ

 風呂で思いついた。長いデータを格納できるレジスタをどう活用するか。  作業用のスクラッチパッドメモリというのがある。巨大な主記憶とは別にコアに近い部分にアクセス速度が早い小容量のメモリを用意し、こちらで作業することにより高速に処理できるようにする。そのスクラッチパッドメモリをどう見せるかだが、あるプロセスだけに局所的に見せようと…
トラックバック:0
コメント:0

続きを読むread more

ぼくのかんがえたさいきょうCPU:ローテート/シフト命令

シフト命令:ビット単位 ROR 右ローテート ROL 左ローテート SHR 右シフト SHL 左シフト シフト命令:バイト単位 RORB 右ローテート ROLB 左ローテート SHRB 右シフト SHLB 左シフト ぼくのかんがえたさいきょうCPU 2018命令フォーマットメモ  シフト命令は対象となる…
トラックバック:0
コメント:0

続きを読むread more

ぼくのかんがえたさいきょうCPU:EVAL命令詳細

 EVAL命令は指定したレジスタの内容を命令列として実行する。用途は自己書き換え命令の代替、マクロ命令的な利用。 ぼくのかんがえたさいきょうCPU:eval EVAL reg,step regに格納された内容を命令列として扱い、実行する。 命令列はregの下位バイトから上位バイトに向かって順に格納する。 EVA…
トラックバック:0
コメント:0

続きを読むread more

ぼくのかんがえたさいきょうCPU:型とサイズとNull、符号なし演算の扱い

型: 整数型(符号付き2の補数) ー 符号なしの演算結果は%Re側に保存 アドレス型 ー 整数型に追加する属性。アドレッシングモード側に指定されたレジスタに付加。 以下はオプション: 浮動小数点型 ー IEEE754準拠と非準拠。FP16,FP32,FP64,FP128,... DP32,DP64,DP128,... BC…
トラックバック:0
コメント:0

続きを読むread more

ぼくのかんがえたさいきょうCPU:バリア命令

 メモリオーダリングでロードやストアの順序を入れ替えて効率よく実行させるが、いったん実行中のメモリアクセスを完了させる用途にバリア命令を用意。 命令フォーマット:01110xxx 8種類 メモリ関係: FENCE #LD この命令以前のストア命令を完了 FENCE #ST この命令以前のロード命令を完了 #…
トラックバック:0
コメント:0

続きを読むread more

ぼくのかんがえたさいきょうCPU:明示的な並列実行

 アウトオブオーダ実行は自動的に命令の実行順を入れ替えてできる分から効率的に済ましていく方式だが、命令で明示的に並列実行を指示するにはどうしたらよいか考えてみた。  先行する命令列Aと後続の命令列Bについて考える。  並列実行ができない実装のプロセッサでは命令列Aの実行を済ませてから命令列Bの実行を行う。並列実行ができるプロ…
トラックバック:1
コメント:0

続きを読むread more

ぼくのかんがえたさいきょうCPU ISA整理

 ぼくのかんがえたさいきょうCPU Rd指定はいらないのでは検討でしばらく考えた結果、うまく入りそうだったので整理した。  すべての命令は直前の命令の実行結果%Pd、予備結果%Pe、フラグ%Pfとオペランドで指定したレジスタを入力とし、演算結果を%Rd、%Re、%Rfとして次の命令に渡す。汎用レジスタに保存するときは専用のWR命令…
トラックバック:0
コメント:0

続きを読むread more

ぼくのかんがえたさいきょうCPU Rd指定はいらないのでは検討

 命令フォーマットだけど演算結果を保存しないで次の命令に渡す仕様、必要なときだけデスティネーションレジスタを指定できれば要らないのでは。つまり基本1バイト命令だけで済んでしまうのでは。 00_dddddd 直前の命令の結果PdをRddddddに保存する。 バイト数 フォーマット 1 01_0_0_cond 1 01_…
トラックバック:1
コメント:0

続きを読むread more

ぼくのかんがえたさいきょうCPU 演算結果のバイパス

 以下をもうちょっと考えてみたもの。 ぼくのかんがえたさいきょうCPU:連鎖性言語の特徴を取り入れてみる 乗算を使わずに%r1の値を3倍するコードを考えてみる。 SLL %r1,1,%r2 ; ADD %r2,%r1,%r3 SLL命令で%r2には%r1の2倍がはいり、ADDでもとの%r1と加算されて%r3に…
トラックバック:0
コメント:0

続きを読むread more

ぼくのかんがえたさいきょうCPU レジスタの本数と拡張

 命令フォーマットでは汎用レジスタの番号指定を6bit用意している。64本が指定可能で、RISC系プロセッサの汎用レジスタ31(32)本+浮動小数点レジスタ32本をカバーできると考えた。  で、常に64本必要だろうか?インタラプトが発生した時は割り込み処理用に8本くらいでも良さそうだし、数値計算向けに大量に必要になるかもしれない。とい…
トラックバック:0
コメント:0

続きを読むread more

ぼくのかんがえたさいきょうCPU オペランド簡略化

 可変長8bit単位の命令フォーマットのうち、オペランド部分を変更。 ぼくのかんがえたさいきょうCPU 8bit可変長命令フォーマット続き ぼくのかんがえたさいきょうCPU 8bit可変長命令フォーマット オペコードは 0xxxxxxx で始まり、オペランドは 1xxxxxxx で始まる。  オペランドは以下の2種類…
トラックバック:0
コメント:0

続きを読むread more

ぼくのかんがえたさいきょうCPU レジスタを覗く窓

 ぼくのかんがえたさいきょうCPUは最大長で32768バイトの汎用レジスタを定義しているが仮に実現したとして演算器をどうするか。もうなんかドリフのコント「もし汎用レジスタが異常に長かったら」みたいなタイトルになってきてるが。  レジスタの領域をチップ内に持つのはそう難しくないだろうが、32Kバイト長と32Kバイト長を入力として演算…
トラックバック:0
コメント:0

続きを読むread more

ぼくのかんがえたさいきょうCPU シフト命令のシフト量

 ぼくのかんがえたさいきょうCPUは最大長で32768バイトの汎用レジスタを定義しているが実現性はさておきどんな問題が起こるか。  シフト命令のシフト量が最大262144になってしまう。18bit必要だ。こんなものバレルシフタで作ったらとんでもないことになってしまうし分割して複数サイクルでシフトするにしてもそもそもそんなにシフト量…
トラックバック:0
コメント:0

続きを読むread more

ぼくのかんがえたさいきょうCPU:eval

 ぼくのかんがえたさいきょうCPUは最大長で32768バイトの汎用レジスタを定義しているが実現性はさておきこれをどう活用するか。  レジスタに命令列を入れて実行させるEVAL命令というのはどうか。  EVAL レジスタ番号,実行ステップ数  この命令に当たると、レジスタ番号で指定された汎用レジスタの内容をフェッチする直…
トラックバック:0
コメント:0

続きを読むread more

ぼくのかんがえたさいきょうCPU レジスタ番号と定数

 演算に定数をつかうときは 1. レジスタに即値を代入する または 2. 即値をオペランドに指定する という感じになるのだけれども、1, はいったん即値を代入する操作が必要になり、2.はオペランドのフォーマットが長くなってしまう。ではどうしようか。  64本の汎用レジスタを使うことを考えると、これを表現するためには6bitあればよ…
トラックバック:0
コメント:0

続きを読むread more

竹下世界塔のCPUアーキ理解2017 (スライド)

 気がつけば2006年からCPUアーキテクチャについて色々調べては考えていたのだった。ということで現在までの私自身の理解をスライドにしてみました。こんなパワポ資料を作るのも十年ぶりだろうか。Keynoteだけど。 https://speakerdeck.com/houmei/2017-cpu-architeciture …
トラックバック:0
コメント:0

続きを読むread more

ぼくのかんがえたさいきょうCPU: 2017.06 1バイト命令・バリア・プリフィックス

 命令拡張の余地がなくなった場合に、従来未定義だった命令から始めることで続く命令列に機能を追加できる。これをプリフィックス命令という。プリフィックス命令は次の命令に対する1回だけの指示と考えることもできる。プリフィックス命令は短いほどよいので1バイト命令フォーマットから空いているところを探す。今回はメモリ操作命令の1バイトフォーマットを…
トラックバック:0
コメント:0

続きを読むread more

SIMDのマルチレイヤー表現

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

続きを読むread more

ぼくのかんがえたさいきょうCPU: 2017.06 算術演算命令

 算術演算命令はデータを数として扱い、四則演算を行う。整数型や浮動小数点型はソースレジスタRaの形式に合わせて変換され、Rdに保存される。演算結果はRaと同じレジスタ幅、レーン構成になる。 概要と基本フォーマット  変換に関するルールは次のとおり。 データと型 CO1: 00nn_xxxx A1: 0001_at…
トラックバック:0
コメント:0

続きを読むread more

ぼくのかんがえたさいきょうCPU: 2017.05 分岐条件

 ほとんどのプロセッサは4bitの16パターンで分岐の条件を決めている。2の補数を用いた符号ありの整数演算と符号なしの整数演算の条件は以下のフラグを使う。 Z ... 演算結果がゼロ N ... 演算結果がマイナス (最上位ビットが1) V ... 演算結果が2の補数の範囲外 オーバーフロー C ... 演算結果が符号なしの…
トラックバック:2
コメント:0

続きを読むread more

ぼくのかんがえたさいきょうCPU: 2017.05 SIMD補足

・SIMDロード/ストアについて アドレッシングモード計算のうちRaがベクタなら、Rb(ベクタ/スカラ)や即値(スカラ)を加算し、複数の実効アドレスを生成する。 Raの各レーンが実効アドレスサイズに拡張された後、Rbや即値を加算、それぞれのレーン用の実効アドレスを得る。 →LEA命令の場合、各レーンが実効アドレスのサイズになる。 …
トラックバック:1
コメント:0

続きを読むread more

ぼくのかんがえたさいきょうCPU: 2017.05 データと型

 汎用レジスタで扱うデータのサイズや型について定義する。メモリ操作命令ではレジスタのサイズだけを扱い中身(型)は無視する。汎用レジスタ間の算術演算でのみ型を扱う。演算の結果、データのサイズが変わってしまっては扱いにこまるので、演算結果は2つある引数のうち最初の引数に合わせることにする。 ・用語など定義 レジスタのサイズ 2^(n…
トラックバック:1
コメント:0

続きを読むread more

ぼくのかんがえたさいきょうCPU: 2017.05 論理演算命令

 論理演算命令は汎用レジスタどうしでAND,ORなどの論理演算を行う。論理演算はbitごとに行われるものでデータ幅が変わっても論理演算の結果は変化しない。データ幅が変わることで結果が変わるシフト、ローテートやPOPCなどは別扱いにする。 概要と基本フォーマット CO1: 00nn_xxxx L1: 0010_log[3:…
トラックバック:1
コメント:0

続きを読むread more

ぼくのかんがえたさいきょうCPU: 2017.05 分岐命令

 分岐命令は条件により命令の流れを変える。相対アドレスによる分岐、1命令スキップ、Conditional Moveを行う。 概要と基本フォーマット ・基本は1バイト命令。CO1:J1フォーマットを使用。 CO1: 00_nnxxxx J1: 0000_cond cond: 分岐条件 前命令の結果から判断。 …
トラックバック:1
コメント:0

続きを読むread more

ぼくのかんがえたさいきょうCPU: 2017.05 メモリ操作命令

 メモリ操作命令は汎用レジスタとメモリ間の転送を行う。メモリ操作命令はデータのサイズしか意識しない。 概要と基本フォーマット ・基本は2バイト命令。CO2:M2フォーマットを使用。 CO2: 010_xxxxx_xxdddddd M2: 010_1_wwww_mm_dddddd wwwwはデータ幅、mmはモード …
トラックバック:2
コメント:0

続きを読むread more