ということで無難にNIOS IIが利用可能になったところで、もう少し遊んでみることにする。取りあえず知りたいのは「NIOS IIがどの程度の処理性能を持つか」である。こういう場合、何かしらのベンチマークを走らせてみるのが一番手っ取り早い。ということで、Dhrystoneを走らせてみた。
Dhrystoneそのものはいまさら説明は要らないと思うが、非常に古くから使われている整数演算用ベンチマークである。幸いな事に、現在でもベンチマークは探せば入手できる(ここなど)ので、まずは入手して適当に展開しよう。必要なファイルはdhry.h(ヘッダファイル)、dhry_1.c(メインルーティン)、dhry_2.c(サブルーティン)の3つである。
さて、まずハードウェア(つまりQuartus IIで直接記述する方)はそのままにして、まずはソフトウェアだけ入れ替えてみる。まずはここと同じ手順で、別の名前で新しいプロジェクトを立ち上げる(Photo02)。
次に、Project Explolerのウィンドウに、先ほどダウンロードしたdhry.hとdrhy_2.cをドラッグアンドドロップで投入する。すると「コピーかリンクか」を聞いてくる(Photo03)ので、どちらか好きなほうを選択(筆者はコピーを選んだ)すると、Project Explolerにこれが追加される(Photo04)。ちなみにdhry_1.cであるが、こちらは中身をコピーして、自動生成されるhello_world_small.cにそのまま貼り付けた。
さて、これをコンパイル……してもさすがにそのままでは通らない。そこで、最低限の変更をする。変更はdhry_1.c(の中身をコピーしたhello_world_small.c)だけである。List 1がオリジナルのdhry_1.cであるが
といったコードが入っており、このあたりはテストをするのに不要なのでまるまる削除した。ちなみにループ回数は
/* 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.