为什么Dispatches连续开始需要不同的时间?

时间:2013-04-15 15:39:44

标签: c++ compute-shader directcompute

我有这个程序:

        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 ms,而第二次46 ms?

以防着色器:

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)''两半的时间几乎相同。

编辑:据我现在所知,这是因为兑现的原因

1 个答案:

答案 0 :(得分:1)

最有可能的候选者(在我看来)是操作系统中线程之间的上下文切换。在中间的某个时间,操作系统更有可能暂停更长时间的操作。

你的程序并不是在任何特定时刻发生的唯一事情,有时操作系统会让你暂停,而其他事情则需要一些处理时间。