FPGA開発日記

FPGAというより、コンピュータアーキテクチャかもね! カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages

LLVMのバックエンドを作るための第一歩 (54. Compressed命令を実装する検討)

RISC-Vの命令セットは基本的に32ビット長だが、Compresed命令という16ビット長の短縮命令が定義されている。これはArmのThumb命令のようなもので、命令フェッチのサイズを減らし、性能を向上させることを目的としている。 今回はこのCompressed命令をLLVMに…

ChiselのパラメタライズによりGenericなモジュールを作成する手法

Chiselによりインタフェースのパラメタライズの検討を行う。例えば、汎用インタフェースを使用してバスのマルチプレクサを構成することを考える。 インタフェースとしては以下のものを使う。以下のGenBundleはTで汎用化されている。valid, sideband, dataの…

LLVMのバックエンドを作るための第一歩 (53. RV64 / RV32両方のサポート)

RISC-Vには32ビットモード(RV32)、64ビットモード(RV64)、128ビットモード(RV128)が定義されている。これまではRV32による32ビットのみをサポートしてきたが、RV64もサポートしたい。具体的に言えば、 RV64モードの時にレジスタ幅を64ビットとして取り扱う(…

Chiselを使ってコンフィギャラブルなモジュール設計を行う

Chiselを使うと柔軟性の高いモジュール設計が可能となる。一つの手法として、パラメータとしてクラスを渡す手法について調査した。 例えば、RISC-Vの1モジュールのPMP(Physical Memory Protection)の簡単な機能について実装を考えてみる。ただし今回はどのメ…

LLVMのバックエンドを作るための第一歩 (52. 浮動小数点のその他の命令)

比較命令以外にも、浮動小数点の様々な演算をサポートする。例えば、以下のようなものが挙げられる。 SQRT 浮動小数点符号反転 浮動小数点絶対値 符号付整数から浮動小数点への変換、符号なし整数から浮動小数点への変換 浮動小数点から符号付整数への変換、…

LLVMのオリジナルバックエンド実装をRelease 9.0のブランチに移植してみる

LLVM Release 9.0のリリースが目前だ。release_90のブランチでは日進月歩でコミットが進んでいるようだ。 github.com これまではrelease_80ブランチの上で作業していたのだが、そろそろrelease_90の上に移ってちゃんと移植できるか確かめた方が良い気がして…

高性能プロセッサの分岐予測のサーベイ論文を読んで分岐予測について学ぶ (9. ニューラル分岐予測器2)

プロセッサアーキテクチャについて再度復習その8。今回からニューラル分岐予測器。ニューラルネットを用いた分岐予測器の続き。 読んでいるのはA Survey of Techniques for Dynamic Branch Predictionという論文で、新規技術の解説ではないのだが、現在の有…

System Verilogで記述されたRISC-VコアArianeを試す (2. Arianeのキャッシュサブシステム)

Arianeは、System Verilogで記述されたインオーダの6ステージRISC-Vパイプラインプロセッサだ。 Arianeのデザインは良くできていて、System Verilogできれいに記述されている。キャッシュサブシステムなどCPUの基本構成も綺麗に設計されているので、これを機…

RustのコードをLLVM IRに変換してRISC-V LLVMバックエンドに渡してみる

RustのフロントエンドはLLVMで実装されているらしい。 Rustの文法自体は最近触っていないせいですっかり忘れてしまったが、自作LLVMバックエンドがRustの生成したLLVMを処理することができるようになれば格好いいかもしれない。 とりあえず、RustからLLVMのI…

高性能プロセッサの分岐予測のサーベイ論文を読んで分岐予測について学ぶ (8. ニューラル分岐予測器1)

プロセッサアーキテクチャについて再度復習その8。今回からニューラル分岐予測器。ニューラルネットを用いた分岐予測器。 読んでいるのはA Survey of Techniques for Dynamic Branch Predictionという論文で、新規技術の解説ではないのだが、現在の有名どこ…

LLVMのバックエンドを作るための第一歩 (51. 浮動小数点比較命令の追加)

RISC-Vには、浮動小数の比較命令命令として以下が定義されている。 funct7 rs2 rs1 funct3 rd opcode FMIN.D 0010101 rs2 rs1 000 rd 1010011 FMAX.D 0010101 rs2 rs1 001 rd 1010011 FEQ.D 1010001 rs2 rs1 010 rd 1010011 FLT.D 1010001 rs2 rs1 001 rd 10…

高性能プロセッサの分岐予測のサーベイ論文を読んで分岐予測について学ぶ (10. 高速パスベースニューラル分岐予測器)

プロセッサアーキテクチャについて再度復習その10。ニューラル分岐予測器の続き。 A Survey of Techniques for Dynamic Branch Prediction Sparsh Mittal https://arxiv.org/pdf/1804.00261.pdf パーセプトロン分岐予測器に対して、そのレイテンシの問題を改…

高性能プロセッサの分岐予測のサーベイ論文を読んで分岐予測について学ぶ (9. パーセプトロン分岐予測器の論文を読む2)

プロセッサアーキテクチャについて再度復習その9。ニューラル分岐予測器。 A Survey of Techniques for Dynamic Branch Prediction Sparsh Mittal https://arxiv.org/pdf/1804.00261.pdf その2回目。パーセプトロン分岐予測器の実装について。 調査したのは…

TensorFlow Lite on RISC-Vの論文を読む

知り合いの人からCARRV 2019 (Third Workshop on Computer Architecture Research with RISC-V)でTensorFlow Lite on RISC-Vの発表があったと聞いたので、さっそく論文をダウンロードしてみた。 carrv.github.io Towards Deep Learning using TensorFlow Lit…

高性能プロセッサの分岐予測のサーベイ論文を読んで分岐予測について学ぶ (8. パーセプトロン分岐予測器の論文を読む)

プロセッサアーキテクチャについて再度復習その8。今回からニューラル分岐予測器。 A Survey of Techniques for Dynamic Branch Prediction Sparsh Mittal https://arxiv.org/pdf/1804.00261.pdf で、パーセプトロン分岐予測器なんて勉強したこともなかった…

System Verilogで記述されたRISC-VコアArianeを試す (1. ビルドとシミュレーション)

Arianeは、System Verilogで記述されたインオーダの6ステージRISC-Vパイプラインプロセッサだ。 RISC-Vコアとしてはそこまで性能が高いわけではないが、多くのコンポーネントがSystem Verilogで記述されているということでハードウェア技術者にとっても解析…

LLVMのバックエンドを作るための第一歩 (50. 浮動小数点レジスタ向けのCalling Conventionの追加)

浮動小数点演算命令を使った算術演算は生成できるようになったが、まだ関数の引数として浮動小数点型を使用することができない。 これは、MYRISCVXのCalling Conventionに、浮動小数点を追加していないからだ。 RISC-VのCalling Conventionでは、浮動小数点…

LLVMのバックエンドを作るための第一歩 (49. 浮動小数点算術演算命令の追加)

浮動小数点のロードストア命令が生成できるようになったので、次は簡単な算術演算ができるようにする。とりあえずは、加減乗除、そして積和演算ができるようになりたい。 私たちはすでに命令定義のクラスとテンプレートを持っているので、そこに当てはめるだ…

LLVMのバックエンドを作るための第一歩 (48. 浮動小数点メモリアクセスの追加)

では、まずは簡単な浮動小数点命令の実装から入る。 演算命令を定義するところから始めてもよいが、そのまえに必ずロードストア命令が必要になるので、ロードストア命令から入る。 RISC-Vでは、単精度浮動小数点用のFLW / FSW、倍精度浮動小数点用のFLD / FS…

LLVMのバックエンドを作るための第一歩 (47. 浮動小数点レジスタの定義)

前章まででMYRISCVXの整数命令に関してLLVMバックエンドへの実装を進めてきた。 これだけでも随分と完成度が上がってきたが、まだ足りていないものがある。その一つとして、浮動小数点命令のサポートだ。 RISC-Vでは現状では2種類の浮動小数点命令が定義され…

高性能プロセッサの分岐予測のサーベイ論文を読んで分岐予測について学ぶ (7. 予測精度を上げるためのテクニック2)

プロセッサアーキテクチャについて再度復習その7。分岐予測の続き。 読んでいるのはA Survey of Techniques for Dynamic Branch Predictionという論文で、新規技術の解説ではないのだが、現在の有名どころの分岐予測技術についてまんべんなく解説してくれて…

LLVMのバックエンドを作るための第一歩 (46. LR/SCでアトミック操作を実現することを考える)

LR/SCを用いたAtomicコードの生成 以下のようなコードを考える。 cpp_atomic.cpp #include <stdint.h> #include <atomic> std::atomic<int32_t> x32; std::atomic<int16_t> x16; std::atomic<int8_t > x8; int32_t test_32() { x32.fetch_add(2); return x32.load(); } int16_t test_16() { x16.fetch_add(</int8_t></int16_t></int32_t></atomic></stdint.h>…

LLVMのバックエンドを作るための第一歩 (45. Atomic命令を生成する)

C++ではスレッド機能がサポートされており、ClangでもLLVM IRがサポートされている。例えば、以下のようなコードでIRを出力してみる。 cpp_atomic.cpp #include <stdint.h> #include <atomic> int test_32() { std::atomic<int> x(3); int before = x.fetch_add(2); return x.load()</int></atomic></stdint.h>…

RISC-V Privileged ISAマニュアル20190608-Priv-MSU-Ratified版の変更点を読み解く

"The RISC-V Instruction Set Manual. Volume II: Privileged ISA Document Version 20190608-Priv-MSU-Ratified" が公開されてしばらくたったのだが、少し時間ができたので変更点の部分を簡単に調べてみることにした。 riscv.org 各モードの状態について。 …

RISC-V Unprivileged ISAマニュアル20190608-Base-Ratified版の変更点を読み解く

"The RISC-V Instruction Set Manual. Volume I: Unprivileged ISA Document Version 20190608-Base-Ratified" が公開されてしばらくたったのだが、少し時間ができたので変更点の部分を簡単に調べてみることにした。 riscv.org 命令セットの分類は以下のよう…

高性能プロセッサの分岐予測のサーベイ論文を読んで分岐予測について学ぶ (7. 予測精度を上げるためのテクニック1)

プロセッサアーキテクチャについて再度復習その7。分岐予測の続き。 読んでいるのはA Survey of Techniques for Dynamic Branch Predictionという論文で、新規技術の解説ではないのだが、現在の有名どころの分岐予測技術についてまんべんなく解説してくれて…

高性能プロセッサの分岐予測のサーベイ論文を読んで分岐予測について学ぶ (5. ハイブリッド分岐予測器)

プロセッサアーキテクチャについて再度復習その6。分岐予測の続き。 読んでいるのはA Survey of Techniques for Dynamic Branch Predictionという論文で、新規技術の解説ではないのだが、現在の有名どころの分岐予測技術についてまんべんなく解説してくれて…

LLVMのバックエンドを作るための第一歩 (44. 拡張Inline Assemblyのサポート)

次にコンパイルしたいのは、以下のようなCコードだ。 inline_assembly2.cpp int global_data = 200; void test () { int add_res; int b = 200, c = 300; __asm__ __volatile__("add %0,%1,%2" :"=r"(add_res) :"r"(b), "r"(c) ); int lw_res; int *lw_p = (…

オープンソースのMarkdownエディタならばMarkTextが良い感じ

最近はMarkdownを書くのにエディタとしてTyporaを使っている。Typora自体には何も不安がないが、オープンソースでないというところだけが少し引っかかる(別にオープンソースでなくても便利なので使うのだが)。 ※ 大体オープンソースであろうがなかろうが普通…

LLVMのバックエンドを作るための第一歩 (43. インラインアセンブリをサポートする)

llcにアセンブラをサポートする。具体的には、インラインアセンブリなどのC言語の内部にアセンブラを埋め込む処理をサポートする。これまで、さんざんアセンブリ言語のサポートを追加してきたじゃないか、と思うかもしれないが、インラインアセンブリでのア…