ぐだぐだ低レベルプログラミング(44) 64bit RISC-V、サイクル数と命令数の計測

Joseph Halfmoon

環境を変えたのに確かめていなかった命令群があります。サイクル数と命令数の計測機能です。32bit RISC-V(GD32VF103)では、お世話になっています。64bit RISC-VのK210でも使える筈ではあるのですが、確認しておきたいと思います。しかし、前々回からFlashへの書き込みはラズパイ4機に頼り切り、そろそろなんとかしないと。

※「ぐだぐだ低レベルプログラミング」投稿順indexはこちら

レジスタ名が不明です

Windows PC上のVSCode+PlatformIOでビルドしており、ターゲットは以下の通りです。

  • ターゲットボード sipeed-maix-bit-mic
  • フレームワーク arduino

この環境で、RISC-Vのインラインアセンブラを書いていると、以下のような問題が報告されます。

VSCodeQERRGNUの以下のマニュアルページによると、Clobbers と呼ばれる「破壊してしまう(データを書き換えてしまう意味ですぞ、念のため)」レジスタなどを列挙する部分です。

6.47.2 Extended Asm – Assembler Instructions with C Expression Operands

認識してくれないのか、と心配になったのですが、ビルドしてみたら問題なかったです。VSCode+PlatformIOのどこかの設定を変更すれば良いのだと思うのですが、面倒なことは皆棚上げでお楽にすませる方針なので、「とりあえず」そのままといたします(いつまでじゃ?)

実行サイクル数と命令数を数えるサンプル

32bit RISC-Vの過去記事で、さんざん使った

  • rdcycle命令(サイクル数カウンタの読み取り命令)
  • rdinstret命令(実行済命令数カウンタの読み取り命令)

をインラインアセンブラで書いてみた例が以下です。どちらの命令もRISC-Vの通例どおり、「実際にはそんな命令は無く、分かり易くコーディングするための方便」である疑似命令です。

nop(これまた疑似命令)の羅列のサイクル数と命令数を数えてみています。

DUTなお、どちらも計測対象のnop列の前後で値を測り、後の値から前の値を引くことで数を勘定しています。このため、計測命令自体の分、1命令、1サイクルが値に含まれます。

書き込みが出来なくなった件の続き

ビルドはWindows PC上で行っているのですが、前々回の問題がそのままで、PCからMAiX BiTへの書き込みができませぬ。調べてみると、どうもPC上のシリアルドライバの問題みたい。第41回で動いていたものが、第42回にいたって動かなくなったので、その間のソフトウエア・アップデートにやられた?

ボード上に搭載されているUSBインタフェースは、CH552というチップです。ただこのチップは、FTDI社のFT2232に見えるようになっていて、FTDI社のドライバを流用するものみたいです。以前FTDI社のドライバを弄りすぎ、まったく関係ないデバイスが動作しなくなって慌てた件を思い出します。当方、FTDIのチップを使っているものが多すぎてどこにどんな影響が出るか分からないのが不安。

ドライバを弄るよりも、正常に動作しているラズパイ4機に開発環境ごと、お引越しするのがよろしかろうと思いました。しかし、今回はPC上でビルド、ファイルをラズパイ4へ送って書き込み。

ビルドしてGO

ビルドしたオブジェクトをラズパイ4機に送り、kflashを使って書き込みしました。実行結果が以下に。

CYC_RESULT
「nCyc 6」とあるのが、nopが5命令とrdcycleが1命令の実行サイクル数です。また「nInst 4」とあるのが、nopが3命令とrdinstretが1命令の命令数です。

予定通りのサイクル数、命令数が得られたので、64bit RISC-V搭載K210でもOKですな。当たりまえか。

ぐだぐだ低レベルプログラミング(43) 64bit RISC-V、レジスタとレジスタ間転送 へ戻る

ぐだぐだ低レベルプログラミング(45) RISC-V、浮動小数点の丸めと例外 へ進む