連載
» 2016年02月16日 07時00分 公開

FPGAのソフトコアCPUをベンチマークで測定するMAX 10 FPGAで学ぶFPGA開発入門(7)(2/6 ページ)

[大原 雄介,MONOist]

NIOS IIの処理能力をベンチマークで測定する

 ということで無難にNIOS IIが利用可能になったところで、もう少し遊んでみることにする。取りあえず知りたいのは「NIOS IIがどの程度の処理性能を持つか」である。こういう場合、何かしらのベンチマークを走らせてみるのが一番手っ取り早い。ということで、Dhrystoneを走らせてみた。

 Dhrystoneそのものはいまさら説明は要らないと思うが、非常に古くから使われている整数演算用ベンチマークである。幸いな事に、現在でもベンチマークは探せば入手できる(ここなど)ので、まずは入手して適当に展開しよう。必要なファイルはdhry.h(ヘッダファイル)、dhry_1.c(メインルーティン)、dhry_2.c(サブルーティン)の3つである。

 さて、まずハードウェア(つまりQuartus IIで直接記述する方)はそのままにして、まずはソフトウェアだけ入れ替えてみる。まずはここと同じ手順で、別の名前で新しいプロジェクトを立ち上げる(Photo02)。

Photo02:プロジェクト名をDhrystoneとしたが、もちろん何でもいい Photo02:プロジェクト名をDhrystoneとしたが、もちろん何でもいい

 次に、Project Explolerのウィンドウに、先ほどダウンロードしたdhry.hとdrhy_2.cをドラッグアンドドロップで投入する。すると「コピーかリンクか」を聞いてくる(Photo03)ので、どちらか好きなほうを選択(筆者はコピーを選んだ)すると、Project Explolerにこれが追加される(Photo04)。ちなみにdhry_1.cであるが、こちらは中身をコピーして、自動生成されるhello_world_small.cにそのまま貼り付けた。

Photo03:「コピーかリンクか」を選ぶ。「Link to file」を選ぶと、現在展開した場所から読み込むことになりちょっと不便なので、プロジェクトディレクトリにコピーするほうを選んだ Photo03:「コピーかリンクか」を選ぶ。「Link to file」を選ぶと、現在展開した場所から読み込むことになりちょっと不便なので、プロジェクトディレクトリにコピーするほうを選んだ
Photo04:よく見るとdhry21a.c(上の説明で言うところのdhry_1.c)も入っているが、これは後で外してhello_world_small.cに上書きの形にした Photo04:よく見るとdhry21a.c(上の説明で言うところのdhry_1.c)も入っているが、これは後で外してhello_world_small.cに上書きの形にした

 さて、これをコンパイル……してもさすがにそのままでは通らない。そこで、最低限の変更をする。変更はdhry_1.c(の中身をコピーしたhello_world_small.c)だけである。List 1がオリジナルのdhry_1.cであるが

  • 経過時間の計算やDhrystoneスコア計算のためにfloat型を使っている
  • 何回ループを回すかをSTDINから入力する
  • 出力結果をファイルに出力する

といったコードが入っており、このあたりはテストをするのに不要なのでまるまる削除した。ちなみにループ回数は

/*
  printf ("Please give the number of runs through the benchmark: ");
  {
    int n;
    scanf ("%d", &n);
    Number_Of_Runs = n;
  }
  printf ("\n");
 
  printf ("Execution starts, %d runs through Dhrystone\n",Number_Of_Runs);
*/
  Number_Of_Runs = 100000;

 という具合に10万回の決め打ちにしている。性能を比較するだけだからこれで十分であろうという判断だ。

 もう1つの変更は時間測定である。もともとのコードでは、ベンチマーク開始直前と終了直後にclock()という関数で現在のシステム時間をmsec単位で取得してここから性能を測定しているが、NIOS IIの環境ではこれが利用できない。そこで代わりにNIOS IIのHAL APIのTimestamp機能を利用した。

 具体的にはまずalt_timestamp_start()を呼んで初期化した後、ベンチマークの前後でalt_timestamp()を呼び出してタイムスタンプ値を取得、後でこれを引き算して経過時間を取得して表示する形にした。ちなみにこのalt_timestamp_start()やalt_timestamp()を利用するためには、冒頭に

#include "sys/alt_timestamp.h"
#include "alt_types.h"

 を追加する必要があり、またalt_timestamp()の戻り値はalt_u32型なので、これにあわせて変数宣言を変更している。List 2がこれらの変更を行ったソースコードである。

Copyright © ITmedia, Inc. All Rights Reserved.