Вопрос

Когда я оцениваю мою программу, я увидел, что в какой-то момент я получаю промежуток времени до 100msec.Я искал каждую операцию, но в этом раз не проводится операция.Тогда я заметил, что везде, где я делаю место cudathreadsynchronize call, первый звонок занимает 100 мс.Тогда я написал такой пример ниже.Когда Cudathreadsynchronize вызывается на первой строке, прошедшее время в конце найден менее 1 мсек.Но если он не вызывается, то это занимает 110msec в среднем.

int main(int argc, char **argv)
{
    cudaThreadSynchronize(); //Comment out it then get 110msec as elapsed time..

    unsigned int timer;
    cutCreateTimer(&timer);
    cutStartTimer(timer);

    float *data;
    CUDA_SAFE_CALL(cudaMalloc(&data, sizeof(float) * 1024));

    cutStopTimer(timer);
    printf("CUT Elapsed: %.3f\n", cutGetTimerValue(timer));

    cutDeleteTimer(timer);

    return EXIT_SUCCESS;
}
.

Я думаю, что cudathreadsynchronize () на старте обрабатывает инициализацию библиотеки CUDA.Это правильный способ полностью инициализации ядра, поэтому он не повлияет на другие операции «Оценка»Это достаточно, и правильно называть cudathreadsynchronize в начале, или есть ли правильный путь ..

Это было полезно?

Решение

Чтобы использовать CUDA, должен быть впервые создан «CUDA Context», это занимает около 70-100 мс.В вашем примере cudaThreadSynchronize(); делает контекст.Контекст создается только один раз для вашего приложения.При выполнении анализа синхронизации я также делаю копию фиктивной памяти для создания контекста (как вы сделали выше, используя cudaThreadSynchronize();).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top