使用HLSL无形地压力显卡 - 如何压力记忆?

时间:2012-09-27 17:08:33

标签: memory gpu hlsl directcompute

我一直在开发一点看不见(读:不会产生任何视觉输出)压力源来测试我的显卡的功能(以及作为一般的DirectCompute的探索,我和#39;我很新)。我现在得到以下代码,我为此感到非常自豪:

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;
}

这为前两个40的幂提供Lucas Lehmer Test。当我在定时循环中发送此代码并使用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;
}

1 个答案:

答案 0 :(得分:0)

在大纹理中读取大量非相干样本。尝试DXT1压缩和非压缩值。并使用渲染纹理。和MRT。所有这些都将击败GPU内存系统。