日別アーカイブ: 2007年9月17日

Folding@home 1PFLOPS 超えのその後

ここ数日ポイントの低いデータしか来なくなって、1日の平均が大幅に
下がっていました。チーム順位もすっかり変動が無くなっていて、
こまめなチェックも飽きが出はじめていた、ちょうどそんな頃。
たまたま全体の stat を見ていたら歴史的瞬間(?)が待っていたという
のがこれ。
Folding@Home 1PFLOPS 達成?
また止めるタイミングを逃してしまいました。

その後1日経過してさらにスコアは上昇しています。

Folding@Home Client statistics by OS

OS Type            Current TFLOPS    Active CPUs    Total CPUs 
Windows            163               171778         1793194 
Mac OS X/PowerPC   7                 9311           105296 
Mac OS X/Intel     13                4120           23248 
Linux              36                21427          244481 
GPU                42                704            4187 
PLAYSTATIONR3      793               35552          246939 
Total              1054              242892         2417345 

Last updated at Mon, 17 Sep 2007 02:51:22  

見所は Current TFLOPS の Total です。
これは参加している全計算機の演算能力の合計で、約 24万 CPU/GPU が
実稼動していて総計 1054 TFLOPS をたたき出していることになります。
1PETA FLOPS を超えています。
そのうち PS3 は 35552台。1台あたりおおよそ 22GFLOPS くらいです。
理論的なピーク値ではなくて、実稼動でこれだけ出ているのだから
かなりのものです。

PS3 は Version 1.2 への upgrade の影響が大きいとは思いますが、
さらにポイントが低い代わりに演算効率の良いデータが増えたのか、
涼しくなって純粋に参加台数が増えたのか、その両方かもしれません。

ちなみに GPU はもっと上を行っており、処理効率が非常に高くおよそ
58GFLOPS にも達しています。アルゴリズム的に相性の良いプログラム
ではさすがに爆発的なパワーを発揮しますね。
現状 ATI X1 系でしか動いていないのは、もしかしたら分岐のコストに
原因があるのかもしれません。R600 の HD 2 系ではこの辺若干仕様が
逆行しているため、今度は G80 系の方が中心になる可能性はあります。
ともあれ汎用化の道をたどって進化している GPU なので、今後 D3D10
クラスで動くようなれば、さらに高度かつ高速な運用が見込めるでしょう。

ゲーム機にビデオカードと、今家にはいったい何 GFLOPS 分くらいの
プロセッサがあるのでしょうか・・。

Folding@Home
Wikipedia Folding@Home
Wikipedia Folding@Home jp

Direct3D ShaderModel4.0 Shaderで HELLO WORLD

あまり実用性が無いサンプルですが、Shader で HELLO WORLD を
作ってみました。

ss02t

ポイントは直接 Buffer に strcpy で文字列を書き込んでいるところ。
つまり Shader で文字列をそのまま表示しています。

描画文字列の書き込み

const char*	Message= "HELLO WORLD!";

g_iStringBuffer->Map( D3D10_MAP_WRITE_DISCARD, 0, &ptr );
strcpy( ptr, Message );	// ←ここ
g_iStringBuffer->Unmap();

描画文字列の表示も、Draw() に strlen() した文字列長をそのまま
渡しているだけです。

g_iDevice->Draw( strlen( Message ), 0 );	// ←ここ

StringBuffer は Shader の IA に渡しています。つまり Vertex 相当です。
1文字が 1頂点で、書き込まれているのはアスキーコードのみ。
stride size (1頂点のサイズ) はわずか 1byte です。

UINT	vSize= sizeof(char);	// ←ここ
UINT	vOffset= 0;
g_iDevice->IASetVertexBuffers( 0, 1, &g_iStringBuffer, &vSize, &vOffset )

InputLayout も DXGI_FORMAT_R8_UINT の1つだけ。

static const D3D10_INPUT_ELEMENT_DESC	_inputDesc[]= {
{ "CODE", 0,  DXGI_FORMAT_R8_UINT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0, },
};

もちろん Message は任意の文字列にできます。
が、付属の適当フォントがだめだめなので小文字とか はみ出します。
もう少し実用的にするなら D3D10_MAP_WRITE_DISCARD でなく
D3D10_MAP_WRITE_NO_OVERWRITE にして、バッファ管理
してあげる必要があるでしょう。
あとシェーダーでごまかしていますが、ステート周りなども未設定です。
(終了も手抜き)

詳しくは下記ソースをご覧ください。
wheelhandle_ss02t.zip

D3D10/DX10 の ジオメトリシェーダーに頼りまくってます。