測定アルゴリズム解説 CrystalMark 2004

CrystalMark 2004 で使用している測定アルゴリズムについて簡単に解説を行います。 ただし、書いてある内容を理解するためにはある程度のソフトウェア/ハードウェアの知識が必要となります。わからない用語等がある場合は検索エンジンなどで調べてください。

ALU / FPU / MEM は全てのテストは搭載 CPU 数にかかわらず 4 スレッドで行っています。

目次 諸注意 スコアの基準 ALU FPU  MEM HDD GDI D2D OGL

諸注意 

CrystalMark のテスト結果はあくまで CrystalMark によるテスト結果であり、普遍的なコンピュータ性能を示しているわけではありません。CrystalMark のテスト内容を理解した上で性能評価を行う必要があります。特に以下は誤解の多い注意点です。

スコアの基準 

ALU/FPU の各項目(それぞれ 4 つずつ) のスコアは私のメインマシンである Pentium 4 HT 2.4GHz を 3.0GHz にオーバークロックしたもの + GeForce FX 5600 + Windows XP でだいたい 2000 になるように調整されています。数字そのものには全く意味がありません!

GDI の各項目は 1024x768x32 + フォントスムージング 「標準」 の状態で 私の環境でだいたい 2000 になるように調整しています。数字そのもに全く意味はありません。また、描画回数に対するスコアは画面モードによって異なり以下のようになります。このようにすることで、フォントスムージングを「なし」にした時の異様なまでのテキストパワーを発揮することが無くなり落ち着いたランキングになるかと思います。ちなみに、CrystalMark のダイアログはフォントスムージングが「標準」であることを前提としており、「なし」の場合スコアメーターの数字がとても汚くなります。

※それぞれ画面のプロパティから設定できます。

    Text Rectangle Circle BitBlt
解像度 全て共通
100%
色数
24/32
100%
15/16
50%
1/4/8
25%
フォントスムージング
なし
10%
100%
標準 / あり
100%
ClearType
500%

MEM は メモリーに関する前半三つの項目に関しては MB/s の値、キャッシュに関しては MB/s の 1/10 をスコアとしています。

HDD は 100 MB/s までの分は MB/s の 40 倍 , 100 - 200 MB/s の分は MB/s の 20 倍, 200 - 300 MB/s の分は MB/s の 10 倍、300 MB/s 以降に関しては MB/s の 5 倍となります。シーケンシャルもランダムも皆同じです。

例1. 120MB/s の場合 100x40 + 20x 20 = 4400
 例2. 250MB/s の場合 100x40 + 100x20 + 50x10 = 6500

D2D は画面モードにかかわらず (スプライト数) * ( FPS*10 ) / 1000 がスコアとなります。

OGL のスコアは一秒あたりのライン/ポリゴン表示数を元に算出しています。

リファレンスマシン  http://musee.cims.hokudai.ac.jp/~hiyohiyo/CrystalMark/09/ranking.php?ID=1

※MEM/HDD は速度を MB/s 単位で表示していますが、あくまで CrystalMark による測定結果です。

ALU (整数演算) 

Pentium 4 など 1 次データキャッシュが少ない( 8KB ) CPU でも扱うデータが全て 1 次データキャッシュに収まり、CPU がフルパワーを発揮する(ような気がする)ベンチマークです。Hyper-Threading を使うとキャッシュを二つの内部仮想プロセッサ(?)で半分 (4KB) ずつ利用するという情報(真偽のほどは未確認)を得たので 4KB よりも小さい配列を使うことにしました。

Fibonacci (フィボナッチ数列) ※加算 乗算 [1]

フィボナッチ数列をひたすら求めます。配列は全く使用しません。

Napierian (自然対数の底 e) ※加算 除算 シフト 論理演算 [1]

自然対数の底 e を多倍長演算を用いて 1,000 桁求めます。約 1KB の配列を使用します。

Eratosthenes (エラトステネスのふるい) ※加算 [1]

素数を高速に列挙するアルゴリズム エラトステネスのふるい を使ったベンチマークです。ここでは、約 2,000 までに含まれる素数を繰り返し列挙します。約 1KB の配列を使用します。

QuickSort (クイックソート)

2KB の乱数列をクイックソートで整列します。

FPU (浮動小数点演算) 

ALU テストと同様の理由で 4KB よりも小さい配列を使っています。

PureFPUMiko (純粋なFPUテスト) ※加算 乗算 [A]

基本的に キャッシュ / メモリ へのアクセスが必要ない純粋な FPU テストです。詳細はソースコードを参照のこと

RandomMeanSS (乱数->平均値->標準偏差->分散) ※加算 乗算 除算 sqrt [1]

浮動小数点の乱数を生成し、生成した乱数の平均値を求め、最後にその分散および標準偏差を求めます。約 1KB の double 型配列を使用します。

FFT (高速フーリエ変換) ※加算 乗算 除算 sin [2]

サインカーブを入力として高速フーリエ変換を行います。約 1KB の float 型配列を使用します。

Mandelbrot (マンデルブロー集合) ※加算 乗算 除算 条件分岐

有名なマンデルブロー集合を求めます。とにかく条件分岐が多いのでパイプライン段数が多い CPU にはきつめのテストとなっています。

MEM (メモリ速度) 単位 MB/s [A] 

Read (読み出し速度)

2MB の(論理的に)連続したメモリに対して読み出しを行います。

Write (書き込み速度)

2MB の連続したメモリに対して書き込みを行います。

Read/Write (読み出し -> 変更 -> 書き込み)

2MB の連続したメモリに対して読み出しを行い、読み出した値に 1 加えたあと、もとのアドレスに新しい値を書き込みます。

Cache (キャッシュ速度)

2KB の連続したメモリに対してひたすら書き出しを行います。x86 命令の rep stosd を使っています。

HDD (ハードディスク速度) 単位 MB/s 

読み出し / 書き込みを行うファイルのサイズは 128 - 1024MB の間で変更が可能です。また、ディスクのフラグメントが進んでいる場合測定結果が大きく低下する場合があります。余裕のある方はデフラグを行ってから測定を行ってください。

Read (読み出し速度)

指定したサイズのファイルから 1MB 単位で読み出しを行います。

Write (書き込み速度)

指定したサイズのファイルへ 1MB 単位で書き込みを行います。

Random Read 512K (ランダムリード)

指定したサイズのファイルから 512KB 単位でランダムに読み出しを行います。

RandomWrite 512K (ランダムライト)

指定したサイズのファイルへ 512KB 単位でランダムに書き込みを行います。

Random Read 64K (ランダムリード)

指定したサイズのファイルから 64KB 単位でランダムに読み出しを行います。

RandomWrite 64K (ランダムライト)

指定したサイズのファイルへ 64KB 単位でランダムに書き込みを行います。

GDI (2D グラフィックス) 

GDI 性能を測定します。明るい部屋で実行してください。

Text (テキスト)

CrystalMark と 4 パターンの方法でひたすら描画します。

Square (正方形)

64x64 の正方形を 4 パターンの方法でひたすら描画します。

Circle (円)

64x64 の円を 4 パターンの方法でひたすら描画します。

BitBlt (ビットマップ)

64x64 のビットマップを BitBlt / StretchBlt (拡大/縮小) / AlphaBlend でひたすら描画します。AlphaBlend は Windows 98 および 2000 以降からの対応です。95/NT4 ユーザーの方はスキップされます。

D2D / DirectDraw (DirectX 7.0 以降) 

DirectDraw 性能を測定します。明るい部屋で実行してください。

Sprite ※FastBlt ColorKey GDI

50x50 のスプライトを描画します。

スプライト数 解説
10
 ちょっとしたゲームなどの負荷はこの程度でしょう。
100
500
 かなり重めのゲームならこのくらい負荷がかかる?
1000
5000
 ここまで多くのスプライトを使うゲームはありえませんが・・・
10000

※星の画像は[ フリー素材工房 Giggurat ] で配布されているものを使用させていただいております。

OGL / OpenGL 

CPU のモデルをレンダリングします。

製作 Koinec Binary Works の Koinec 氏です。


参考文献:
[1] C言語による最新アルゴリズム辞典 奥村晴彦著 技術評論社
[2] C マガジン2002年1月号 特集1 プログラマのための数学教室

備考:
[A] ぬじぬじ氏 (旧みこみこ氏) にいただいたコードを加工して使っています。