Таймер, используемый для измерения cudaMalloc, дает разные результаты - PullRequest
0 голосов
/ 29 сентября 2019

В настоящее время я учусь измерять время выполнения функций 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.

Это не делает никакихсмысл, поскольку я синхронизирую устройство так, чтобы три таймера делили почти одинаковые записи времени.

Какому из них мне доверять?

...