Почему рассылки начались последовательно, занимают разное время?

У меня есть эта программа:

        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)'', то обе половинки займут почти одинаковое время.

РЕДАКТИРОВАТЬ: насколько я могу видеть на данный момент, это потеря наличности

1 ответ

Наиболее вероятным кандидатом (на мой взгляд) является переключение контекста между потоками в операционной системе. Операция, которая занимает больше времени, скорее всего будет отложена ОС в середине.

Ваша программа - не единственное, что происходит в данный момент, и иногда ОС задерживает вас, в то время как другие занимают некоторое время на обработку.

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