CUDA: TIMER CALLIL - путаница на прошедшее время
-
13-12-2019 - |
Вопрос
Когда я оцениваю мою программу, я увидел, что в какой-то момент я получаю промежуток времени до 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();
).