0

我有这个程序:

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

编辑:据我目前所见,这是因为兑现

4

1 回答 1

1

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

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

于 2013-04-15T15:45:49.580 回答