1

グラフィックカードの機能をテストするために、目に見えない(視覚的な出力を生成しない)ストレッサーを少し開発してきました(そして、DirectCompute全般の調査として、私はかなり新しいです)。私は今、私がかなり誇りに思っている次のコードを持っています:

RWStructuredBuffer<uint> BufferOut : register(u0);

[numthreads(1, 1, 1)]
void CSMain( uint3 DTid : SV_DispatchThreadID )
{
    uint total = 0;
    float p = 0;
    while(p++ < 40.0){      
        float s= 4.0;
        float M= pow(2.0,p) - 1.0;
        for(uint i=0; i <= p - 2; i++)
        {
            s=((s*s) - 2) % M;
        }
        if(s < 1.0) total++;
    }
    BufferOut[DTid.x] = total;
}

これは、2 の最初の 40 乗に対してLucas Lehmer 検定を実行します。このコードをタイミング ループでディスパッチし、GPU-Zを使用してグラフィックス カードの統計情報を確認すると、その間 GPU 負荷が 99% に達しています。私はこれにかなり満足していますが、完全にロードされた GPU からの発熱は実際にはごくわずかであることにも気付きました (摂氏 5 度から 10 度ほど上昇しています。たとえば、ボーダーランズ 2)。私の考えでは、熱のほとんどはメモリ アクセスから発生しているため、実行全体で一貫したメモリ アクセスを含める必要があります。私の最初のコードは次のようになりました。

RWStructuredBuffer<uint> BufferOut : register(u0);

groupshared float4 memory_buffer[1024];

[numthreads(1, 1, 1)]
void CSMain( uint3 DTid : SV_DispatchThreadID )
{
    uint total = 0;
    float p = 0;
    while(p++ < 40.0){
            [fastop] // to lower compile times - Code efficiency is strangely not what Im looking for right now.
            for(uint i = 0; i < 1024; ++i)


        float s= 4.0;
        float M= pow(2.0,p) - 1.0;
        for(uint i=0; i <= p - 2; i++)
        {
            s=((s*s) - 2) % M;
        }
        if(s < 1.0) total++;
    }
    BufferOut[DTid.x] = total;
}
4

1 に答える 1

0

大きなテクスチャで多くの一貫性のないサンプルを読み取ります。DXT1 圧縮値と非圧縮値の両方を試してください。そして、テクスチャにレンダーを使用します。そしてMRT。すべてが GPU メモリ システムに勝ります。

于 2012-12-04T21:05:48.323 に答える