コンピューターの性能を客観的に評価するための指標として、ベンチマークテストは欠かせない存在です。

その中でも「Dhrystone(ドライストーン)」は、1980年代から現代に至るまで、特にプロセッサの整数演算性能を測る基準として広く知られてきました。

この記事では、Dhrystoneの基本的な仕組みから、計算指標であるDMIPSの意味、そして現代のコンピューター評価における役割について詳しく解説します。

Dhrystoneの定義と目的

Dhrystoneとは、コンピューターのメインプロセッサ(CPU)における整数演算性能を測定するために設計された合成ベンチマークプログラムです。

1984年にReinhold Weicker氏によって開発され、主にプログラミング言語のC言語やAda、Pascalなどで記述されています。

Dhrystoneの主な目的は、実際のアプリケーションで頻繁に使用される処理をシミュレートすることにあります。

具体的には、数値の代入、制御文(if文など)、関数呼び出し、文字列操作といった基本的な操作を組み合わせて構成されています。

このプログラムを実行することで、単位時間あたりに何回のループを処理できたかを計測し、その結果をスコアとして算出します。

整数演算性能の重要性

コンピューターの処理は大きく分けて、整数演算と浮動小数点演算の2種類に分類されます。

一般的なアプリケーションやOSの制御ルーチンでは、整数演算が処理の大部分を占めています。

そのため、DhrystoneはCPUの基本的な「地力」を測るための指標として、長い間重宝されてきました。

特に組み込みシステムやマイクロコントローラの分野では、現在でも性能比較の材料としてDhrystoneの数値が参照されることがあります。

開発の歴史とWhetstoneとの関係

Dhrystoneという名称は、先行して存在していた「Whetstone(ウェットストーン)」というベンチマークに対するユーモアを交えた対比から名付けられました。

Whetstoneは、主に科学技術計算などで重要となる「浮動小数点演算性能」を測るためのベンチマークです。

「Whet(砥石)」が湿っている(Wet)イメージを持つことから、それとは対照的な「Dry(乾燥)」を冠してDhrystoneと命名されました。

このように、浮動小数点はWhetstone、整数演算はDhrystoneという使い分けが初期のコンピューター性能評価における標準となりました。

バージョンの変遷

Dhrystoneにはいくつかのバージョンが存在しますが、現在最も一般的に使用されているのは「Version 2.1」です。

1988年にリリースされたこのバージョンでは、コンパイラによる過度な最適化を防ぐための改良が加えられました。

初期のバージョンでは、ループ内のコードが単純すぎて、賢いコンパイラによって「何もしないコード」として削除されてしまう問題があったためです。

現代の性能比較で「Dhrystone」と呼称される場合、基本的にはこのVersion 2.1の結果を指していると考えて間違いありません。

性能指標「DMIPS」の計算方法

Dhrystoneの結果は、単純な1秒あたりのループ回数だけでなく、「DMIPS(Dhrystone MIPS)」という単位で表現されることが一般的です。

MIPS(Million Instructions Per Second)は1秒間に何百万個の命令を実行できるかを示す単位ですが、プロセッサのアーキテクチャによって1命令の重みが異なるため、単純比較が困難でした。

そこで、特定の基準マシンと比較して何倍の性能があるかを示す「DMIPS」が考案されました。

基準機VAX-11/780

DMIPSを算出する際の基準として、1970年代後半に登場した名機「VAX-11/780」が選ばれました。

VAX-11/780がDhrystoneを実行した際のスコアを「1 MIPS相当」と定義し、測定対象のスコアをこの基準値で割ることでDMIPSを算出します。

具体的には、VAX-11/780のDhrystoneスコアは1,757回/秒であったため、以下の式で求められます。

項目計算式
DMIPSの算出1秒あたりのDhrystoneループ実行数 ÷ 1,757
DMIPS/MHzDMIPS値を動作クロック(MHz)で割った値

また、クロック周波数に依存しないプロセッサ効率を示す指標として、1MHzあたりのDMIPS値である「DMIPS/MHz」もよく用いられます。

Dhrystoneの構成とプログラムの内容

Dhrystoneのコードは非常にコンパクトであり、現代のプロセッサから見れば非常に小さなメモリフットプリントで動作します。

プログラム内部では、以下のような典型的なアルゴリズム要素が含まれています。

  • ポインタの参照と代入
  • 文字列の比較とコピー
  • 列挙型の使用
  • 整数計算(加減乗除)
  • 条件分岐(if-then-else)および繰り返し(for/while)

これらがバランスよく配置されており、当時のプログラミングスタイルにおける平均的な負荷を再現するように設計されています。

実際のコードの一部を簡略化したイメージは以下の通りです。

C言語
/* Dhrystoneのメインループ内で行われる処理のイメージ */
void Proc_1 (REG Pointer_Type Ptr_Val_Par)
{
  REG Pointer_Type Next_Record = Ptr_Val_Par->Ptr_Comp;  
  /* レコードのコピーや構造体への代入が頻繁に行われる */
  struct_assign (*Ptr_Val_Par->Ptr_Comp, *Ptr_Glob);
  Ptr_Val_Par->variant.var_1.Int_Comp = 5;
  Next_Record->variant.var_1.Int_Comp = Ptr_Val_Par->variant.var_1.Int_Comp;
  /* 関数の呼び出しオーバーヘッドも測定対象 */
  Proc_3 (&Next_Record->Ptr_Comp);
}

実行結果は、以下のように1秒あたりの実行回数とDMIPS値として出力されます。

実行結果
Dhrystone Benchmark, Version 2.1 (Language: C)
Execution starts, 500000 runs through Dhrystone
Execution ends

Final results:
Microseconds for one run through Dhrystone:    0.5
Dhrystones per Second:                      2000000
DMIPS:                                      1138.3

メリットと直面する課題

Dhrystoneが長年使われ続けてきた最大のメリットは、その移植性の高さとシンプルさにあります。

コードが小さいため、OSが動作していないベアメタルの組み込み環境でも容易に実行することが可能です。

しかし、現代のコンピューティングにおいてはいくつかの深刻な課題も指摘されています。

コンパイラ最適化による影響

現代のコンパイラは非常に高度な最適化機能を備えています。

Dhrystoneの処理内容が静的な解析によって「結果が変わらない計算」と判断されると、コンパイラが計算自体を省略してしまい、異常に高いスコアが出てしまうことがあります。

これを防ぐためには、コンパイルオプションを調整したり、ソースコードに手を加えたりする必要がありますが、それでは標準的な比較が難しくなります。

キャッシュメモリへの依存

Dhrystoneのプログラムサイズは非常に小さく、現代のプロセッサであればほぼ確実にL1キャッシュ内に収まってしまいます。

そのため、メインメモリへのアクセス速度や、キャッシュミス発生時のペナルティを適切に評価することができません。

実際のアプリケーションではデータの移動やメモリレイテンシが大きなボトルネックになりますが、Dhrystoneではそれが見えてこないのです。

現代におけるベンチマークの立ち位置

Dhrystoneの限界を補うために、現在では「CoreMark」や「SPECint」といったより新しいベンチマークが主流となっています。

特にCoreMarkは、Dhrystoneの欠点を解消しつつ組み込み向けに特化しており、業界標準の座を譲りつつあります。

それでもなお、過去の膨大なデータとの比較が容易である点から、Dhrystoneは依然として完全に引退することなく使われ続けています。

新しいプロセッサのホワイトペーパーでも、参考値としてDMIPS/MHzが記載されているケースは珍しくありません。

まとめ

Dhrystoneは、コンピューターの進化とともに歩んできた、歴史ある整数演算ベンチマークです。

VAX-11/780を基準としたDMIPSという単位は、異なるアーキテクチャのCPU同士を比較する上での画期的な指標となりました。

コンパイラの進化やキャッシュ構造の変化により、現代の複雑なプロセッサを完全に評価するには力不足な面もあります。

しかし、そのシンプルさと歴史的背景を理解しておくことは、コンピューター性能評価の本質を捉える上で非常に重要です。

性能評価の数値を読み解く際は、その指標が何を測定し、どのような限界を持っているのかを正しく認識するようにしましょう。