Использование HLSL для невидимого напряжения видеокарты - Как увеличить нагрузку на память?

Я разработал немного невидимый (читай: не производит никакого визуального вывода) стрессор, чтобы проверить возможности моей видеокарты (и как исследование 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;
}

Это запускает тест Лукаса Лемера для первых 40 степеней двух. Когда я отправляю этот код по таймеру и просматриваю статистику моих видеокарт с помощью GPU-Z, моя загрузка графического процессора увеличивается до 99% на протяжении всего времени. Я очень доволен этим, но я также заметил, что тепловыделение от полностью загруженного графического процессора на самом деле довольно минимальное (я получаю скачок примерно на 5-10 градусов по Цельсию, нигде рядом с тепловым скачком, который я получаю во время работы, скажем, Borderlands 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 ответ

Прочитайте много несвязных образцов в больших текстурах. Попробуйте DXT1 сжатые и несжатые значения. И использовать визуализацию для текстуры. И МРТ. Все будет биться в системах памяти GPU.

Другие вопросы по тегам