В настоящее время я учусь измерять время выполнения функций cuda.Я использовал три разных таймера, то есть clock_t, StopWatchInterface, cudaEvent_t, чтобы измерить время, затрачиваемое cudaMalloc.Тем не менее, результаты выполнения совершенно разные.
Как уже подчеркивалось, cudaDeviceSynchronize () используется для синхронизации, но все же большая разница заключается в трех таймерах.Я очень смущен этим сейчас.
int main()
{
cudaError_t cudaError;
cudaError = cudaSetDevice(0);
double *d_AA;
float time_elapsed;
for (int i = 0; i < 5; i++)
{
cout << "iter:" << i << endl;
//Timer 1 record
cudaEvent_t start, stop;
cudaError = cudaEventCreate(&start);
cudaError = cudaEventCreate(&stop); //Timer 1 create
cudaEventRecord(start, 0); //Timer 1 start
cudaMalloc((void**)&d_AA, sizeof(double) * 1000 * 1000);
cudaEventRecord(stop, 0); //Timer 1 stop
cudaEventSynchronize(stop);
cudaError = cudaEventElapsedTime(&time_elapsed, start, stop);// timer 1 record
cout << "Timer 1 record: " << time_elapsed << "ms" << endl;
cudaFree(d_AA);
cudaEventDestroy(start);
cudaEventDestroy(stop);
//Timer 2 record
clock_t clock_start;
clock_t clock_stop; //Timer 2 create
clock_start = clock(); //Timer 2 start
cudaMalloc((void**)&d_AA, sizeof(double) * 1000 * 1000);
cudaDeviceSynchronize(); //Sync device
clock_stop = clock(); //Timer 2 stop
double clock_diff_sec = ((double)(clock_stop - clock_start) / CLOCKS_PER_SEC);
cout << "Timer 2 record: " << clock_diff_sec << "ms" << endl;
cudaFree(d_AA);
//Timer 3 record
StopWatchInterface *timer = NULL;
sdkCreateTimer(&timer);
sdkResetTimer(&timer); //Timer 3 create
sdkStartTimer(&timer); //Timer 3 start
cudaMalloc((void**)&d_AA, sizeof(double) * 1000 * 1000);
sdkStopTimer(&timer); //Timer 3 stop
cout << "Timer 3 record: " << sdkGetTimerValue(&timer) << "ms" << endl;
cudaFree(d_AA);
}
return 0;
}
Вот результаты выполнения: Результаты выполнения
Мы обнаружили, что три таймера дают совершенно разную запись времени при распределенииразмер памяти устройства (double) *1000* 1000.
StopWatchInterface записывает намного больше, чем два других с временем записи 1 мс, два других меньше 5us.
Это не делает никакихсмысл, поскольку я синхронизирую устройство так, чтобы три таймера делили почти одинаковые записи времени.
Какому из них мне доверять?