我有这个程序:
for (int i = 0; i < STEPS; ++i)
{
context->CSSetShader(computeShader, NULL, 0);
ID3D11UnorderedAccessView *aUAViews[1] = {bufferOut_UAV};
context->CSSetUnorderedAccessViews(0, 1, aUAViews, NULL);
context->Dispatch(32, 32, 1);
in[i] = t.GetTime();
if (i == STEPS / 2)
{
context->End(pEventQuery);
while( context->GetData( pEventQuery, NULL, 0, 0 ) == S_FALSE ) {}
}
}
double out = t.GetTime();
context->End(pEventQuery);
while( context->GetData( pEventQuery, NULL, 0, 0 ) == S_FALSE ) {}
第一次迭代仅持续 26 毫秒,而第二次 46 毫秒?
以防万一着色器:
RWStructuredBuffer<float> Output : register(u0);
[numthreads(GROUP_SIZE_X, GROUP_SIZE_Y, 1)]
void arrayTest(uint3 DTid : SV_DispatchThreadID)
{
float i = DTid.x * 32 + DTid.y;
Output[i] = 0;
for (int k = 0; k < 100; ++k)
{
Output[i] += sqrt(i + k);
}
}
但我不认为每次开始都需要不同的时间。
有趣的是,如果我注释掉 ''if (i == STEPS / 2)'' 行,两半花费几乎相同的时间。
编辑:据我目前所见,这是因为兑现