FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

2023-05-01から1ヶ月間の記事一覧

RISC-V Vectorized Bencmark Suite (RiVec) のRVV1.0の確認

RiVec、つまりRISC-V Vectorized Bencmark SuiteはベンチマークスイートをRISC-Vベクトル向けに移植したベンチマークスイートだ。 github.com メインリポジトリには3つのブランチがあり、 master : intrinsicがEPI専用のもの、かなり古い rvv-0.7 : intrinsi…

TenstorrentのオープンソースRISC-Vベクトルプロセッサ実装Ocelotを試す (10. テストケース確認)

github.com 前回の続きなのだが、実際にPASSしたテストケースが何をやっているのかベクトル命令を切り出して確認する。 rvv_int_arithmetic_1_3828467586_2 なんかvslideupばかりやっているな? 3 0x000000008000139c vsetivli s3, 4, e32, m1, ta, ma x19 0…

TenstorrentのオープンソースRISC-Vベクトルプロセッサ実装Ocelotを試す (9. 最新版にアップグレードして再試行)

github.com なんとなくチェックするとTenstorrentのRISC-V VectorコアOcelotのリビジョンがまた上がっていた。 多少はテストベンチが通るようになっただろうか? Chipyardのリビジョン: 2a9a844e1fbf4958cf10f69810a8febac065c100 Boomのリビジョン: a2cdc47…

TenstorrentのオープンソースRISC-Vベクトルプロセッサ実装Ocelotを試す (8. 最新版にアップグレードして再試行)

github.com なんとなくチェックするとTenstorrentのRISC-V VectorコアOcelotのリビジョンがまた上がっていた。 多少はテストベンチが通るようになっただろうか? Chipyardのリビジョン: 2a9a844e1fbf4958cf10f69810a8febac065c100 Boomのリビジョン: a2cdc47…

Gem5でのROI (Region of Interests) の設定方法 (2. マクロとしての定義)

msyksphinz.hatenablog.com 上記のような方法も取れるが、マクロが定義されている。 #ifdef ENABLE_GEM5 m5_reset_stats(0,0); m5_dump_stats(0,0); #endif // ENABLE_GEM5 定義はこうだ。 .macro m5op_func, name, func .globl \name \name: .long 0x000000…

riscv-gnu-toolchainでのLinux向けGCCのconfigure調査

Official GCCでも同じことを再現したい。NewLibを使う場合はどうなるか。 まずはriscv-gnu-toolchainでの動作を確認したい。 build-binutils-linux build-gdb-linux build-gcc-linux-stage1 build-glibc-linux-headers build-glibc-linux-rv64imafdc-lp64d b…

Gem5でのROI (Region of Interests) の設定方法

Gem5ではサイクルレベルでのシミュレーションが可能で、モードによってはO3トレースファイルという情報を出力してパイプラインの動作の様子を確認することができる。 もう少し統計的な情報を出力したいときは、m5out/stats.txtというデータが便利だ。各命令…

Gem5のインストール試行とベンチマーク実行 (NEON命令をGem5で動かす)

ちょっといくつか確認しなければならないことがあり、AArch64対応のGem5を試行してサイクル性能を測定している。 以下のようなループを作成して、FMLAのレイテンシがどのようになるのか観測したい。 for (int i = 0; i < N / 4; i++) { float32x4_t va, vb, …

Alibaba の RISC-V プロセッサ XuanTie のCコアシリーズを見ていく

Alibaba (T-Head)が出しているXuanTie RISC-Vコアのシリーズをまとめていたら、大量にあって混乱してきた。 Eシリーズ (E902 / E906) : 組み込み向け Cシリーズ (C906 / C908 / C910 / C920) : 高性能向け Rシリーズ (R910) : リアルタイム処理向け この中で…

RISC-V Vectorized FFTW3を試す (2. RISC-V向に、GCC13を使ってビルド)

前回、OfficialのリリースパッケージでRISC-V GCCを作成したのは、最新版に対応したRVV 1.0 Intrinsicを使いたかったからだった。 msyksphinz.hatenablog.com これを使って、FFTW3をビルドし直すことにする。 新しいGCCを使用して前回のブログで使用したFFTW…

Official GCCでのRISC-Vコンパイル環境構築方法

GCC13のオフィシャルパッケージを用いて、RISC-V向けのコンパイラとライブラリを構築する手法についてメモしておく。 Binutilsビルド curl -L ftp://ftp.gnu.org/gnu/binutils/binutils-2.40.tar.gz | tar xz cd binutils-2.40 mkdir build cd build export …

RISC-V Vectorized FFTW3を試す (1. RISC-V向けにビルドを試す)

FFTW3はFFTの有名なライブラリで、いくつかのアーキテクチャ向けにSIMD命令を使ったバージョンも含まれている。 いろいろと調べてみると、RISC-V RVV1.0に対応したFFTW3も有志が開発しているようなので、それを試してみることにした。 そもそも、FFTW3の使い…

論文 "Sparse Stream Semantic Registers: A Lightweight ISA Extension Accelerating General Sparse Linear Algebra" を読む2

arxiv.org https://arxiv.org/pdf/2305.05559v1.pdf 4. 性能評価 本論文 Figure4 より抜粋 Sparseな要素とDenseな要素の演算 : 図4aは、スパースベクトルの非ゼロカウントnnzを変化させた場合のカーネルのFPU使用率 baseとssrはどのようインデックスの大きさ…

論文 "Sparse Stream Semantic Registers: A Lightweight ISA Extension Accelerating General Sparse Linear Algebra" を読む1

ETH Zurichが公開した論文を読んでいる。疎行列計算のためのアクセラレータに関する論文だ。 arxiv.org https://arxiv.org/pdf/2305.05559v1.pdf 概要 疎行列演算を高速化するためのハードウェアアクセラレーション手法の提案: 疎行列の演算というのは、一…

自作CPUの命令発行ユニット変更作業 (3. Vivadoによる論理合成結果確認)

自作CPUの命令発行ユニットは、現時点であまり効率が良くないので改善したい。 一応テストが完了したので、Vivadoで論理合成してみた。 左側が改善前で、右側が改善後の結果。LUTの全体量は4%ほど削減されている。 一方で、FFの量はあまり減らなかった。 し…

Cache Coloring / Page Coloring について (2. VIPTにおけるキャッシュサイズを大きくするための手法)

では、VIPTにおいてキャッシュのサイズを大きくするためにはどうすればよいのか。 1つ目の方法は、キャッシュのWayサイズを増やしていくという方法だ。上記の構成において、2-way Associativeから8-way Associativeに変更すると、キャッシュインデックスのビ…

Cache Coloring / Page Coloring について

ここ数日、キャッシュのカラーリング(Cache Colouring)について資料を読み漁っていたので、まとめておこうと思う。 ベースの資料としては、以下が参考になると思う。 community.arm.com キャッシュ・カラーリング、もしくはページ・カラーリングという技法を…

RISC-V Vector 1.0 をサポートするオープンソースCPU Araを試す (3. ベンチマークの実行)

github.com Araでベクトル化したmemcpyのベンチマークを実行したくて、いろいろ試行錯誤していたが、テストの追加方法が分かってきた。以下のテストプログラムを動かしたいとする。 void *memcpy_vec(void *dst, void *src, size_t n) { void *save = dst; /…

RVV-1.0をサポートしたGem5を試す (1. ビルドとデバッグ)

Gem5はアーキテクチャシミュレータで、CPUを含むサブシステムをシミュレーションすることができるツールだ。RISC-Vなどのアーキテクチャをサポートし、サイクル精度シミュレーションも可能だ。 Gem5によるRISC-V Vectorのシミュレーションのサポート状況を確…

RISC-V Vector 1.0 をサポートするオープンソースCPU Araを試す (2. 波形の取得方法)

github.com 波形を取得するためには、ビルド時にtrace=1を指定する必要がある。 cd hardware make verilate trace=1 シミュレーションの実行方法は以下。 app=rv64uv-ara-vle8 make simv trace=1 以下のファイルが生成される。 trace_hart_00.dasm sim.fst s…

RISC-V Vector 1.0 をサポートするオープンソースCPU Araを試す (1. ビルド方法の調査)

github.com AraはCVA6に対してベクトルユニットを追加したもの。RVV1.0をサポートする。 git clone https://github.com/pulp-platform/ara.git git submodule update --init --recursive ツールチェインのビルド。 # Build the LLVM toolchain make toolchai…

自作CPUの命令発行ユニット変更作業 (2. テストパタンによるデバッグ作業)

自作CPUの命令発行ユニットは、現時点であまり効率が良くないので改善したい。 BRUの内部でのデバッグが必要になった。BRU内の発行エントリが解放されるとともに、Resource Allocatorが解放されるタイミングが若干速くなる。 これにより、分岐タグが投機的に…

自作CPUの命令発行ユニット変更作業

自作CPUの命令発行ユニットは、現時点であまり効率が良くないので改善したい。 通常命令発行ユニットは命令が発行して、オペランドの投機などが確定するとエントリを削除することができるのだが、それをやっていない。 つまり、命令が発行してからパイプライ…

LiteXによるSoC環境構築を試行する (13. LiteXのCPUバリアントの使い方)

現在、自作CPUのLiteX対応は、最も小さなコンフィグレーションをターゲットとしていたが、良く調べてみるとLiteXはCPUのコンフィグレーションを指定して合成が可能だ。 例えば、VexRiscvの場合は以下のようなコンフィグレーションを指定することができる。 #…

拡張インラインアセンブリ構文におけるベクトルレジスタの指定方法について

ベクトル命令のインラインアセンブリについて。 拡張インラインアセンブリでは、オペランドの制約にベクトルレジスタを入れる場合の構文。 検索しても全く出てこなかったのだが、LLVMのフォーラムに書いてあった。 https://reviews.llvm.org/D98616?id=#2626…

LiteXによるSoC環境構築を試行する (12. LiteXのメモリバンド幅を波形で確認する)

前回のテストプログラムでも、どうもmemset()とmemcpy()の速度が遅すぎると思い、一応波形で確認を取ってみたのだった。 $ litex_sim --cpu-type=scariv --output scariv_build --trace --trace-fst --trace-end 100000000000 --integrated-rom-init=./litex…

LiteXによるSoC環境構築を試行する (11. 自作CPUのSoC環境に自作ソフトウェアを追加する)

今回は、自作CPUのLiteX SoC環境に、demoアプリではない自分で作ったアプリを入れてみよう。 アプリといっても、単純にメモリへの読み書きをしてみるだけのテストだ。 memcpy()とmemset()というメモリへの書き込みを行うだけのテストを作ってみた。 static v…

RISC-Vコアの検証インタフェースRVVIについて調べる (3. トレースインタフェースRVVI-API)

RISC-Vコアの検証環境RVVIについて調査している。 RVVI-APIは、取得したトレースデータを検証用DVに渡すためのインタフェースだ。 github.com RVVI-APIは、C/C++のヘッダファイルもしくはSystemVerilogのパッケージとして定義されている。 C/C++:/include/h…