メモ代わり

Feed Rss

Mandelbrot set Fractal Benchmark

06.23.2011, product, by .

Overview

マンデルブロ集合を GPU で描きます。集合の縁を拡大していき 2000 フレームをレンダリングするまでの時間を計測できます。

起動時にベンチマークか、自由に操作するか決められます。解像度も変更することができます。

free の場合は、マウス左ドラッグで移動。ホイールの上下でズーム操作できます。


Require

System
DirectX9c Shader Model 3 : 足りないと graphics initialize fail っぽいエラー出ます。
VisualStudio2008 Runtime : 足りないと起動時に msvcrt90.dll が足りないっぽいエラー出ます。Link
DirectX 2010Feb Runtime : 足りないと起動時に D3D.dll が足りないっぽいエラー出ます。 Link
GPU
nVidia Geforce 8000 以上
AMD Radeon 4000 以上
Intel G41 以上

Download

[Download click here]


Detail

マンデルブロ集合の発散するまでの回数を計算し、その値でカラーテーブルからサンプリングし、描画しています。
ほぼ GPU のみ利用。 CPU 負荷が低いためは省電力モードのまま動作することでしょう。
GPU 内浮動小数点の精度によりだいたい 100 万倍ぐらいが限界になります。中心から遠くなるほど精度が落ちます。
HLSL により実行時にシェーダをコンパイルしています。 SIMD の効きが悪いのでレンダリングスペックと一致しません。
Z テスト、アルファブレンドはしていません。よってそれらのユニットによる影響も無いと思われます。
テクスチャサンプラを最後に一箇所だけ利用しています。レンダリングピクセル数と同じ回数だけなのでメモリバンド幅による影響も少ないと考えられます。
集合のピクセルはループ回数が上限いっぱい( 256 回)に及ぶため、集合が占める割合が多いときはフレームレートが相当落ちます。
GPU の省電力機構を回避するためにベンチマークでは最初の 100 フレームを切り捨てます。
付属の tbl.png を書き換えることで色合いなどを変更できます。横軸がループ回数になり、縦軸が時間で変化します。サンプラがバイリニアなので半テクセルずれる事に注意してください。

Code

    ps_3_0
    def c0, 4, 0.00390625, 0, 0
    def c1, 1, 0, 0, -1
    defi i0, 255, 0, 0, 0
    dcl_normal v0.xyz
    dcl_2d s0
    mov r0.y, c1.x
    mov r0.zw, c1.xyxz
    mov r1.xy, c1.z
    rep i0
      mov r1.z, -c1.w
      break_ge r0.w, r1.z
      mul r1.zw, r1.xyxy, r1.xyxy
      mad r2.x, r1.x, r1.x, -r1.w    // ここらへんが SIMD に弱い
      add r2.x, r2.x, v0.x
      dp2add r2.y, r1.y, r1.x, v0.y
      add r1.z, r1.w, r1.z
      if_ge r1.z, c0.x
        mov r0.z, r0.w
        break_ne c1.x, -c1.x
      endif
      add r0.x, r0.w, c0.y
      mov r0.zw, r0.xyyx
      mov r1.xy, r2
    endrep
    mov r0.w, v0.z
    texld oC0, r0.zwzw, s0

Result

model time settings
Intel HD Graphics 2000 68.4 i5-2300
Intel HD Graphics 3000 35.7 i5-2540M
Radeon HD 6310 186.4 AMD Fusion APU
Radeon HD 5870 7.7
Radeon HD 4850 24.3
Radeon HD 5750 17.0 core:800MHz mem:1250MHz
Radeon HD 5750 16.3 core:870MHz mem:1250MHz
Geforce 9800 GTX+ 7.8
Geforce GTX 460 8.8 core:730MHz mem:1800MHz
Geforce 8500 GT 78.2
Geforce 8800M GTS 28.5