方法一:
- cudaEvent_t start1;
- cudaEventCreate(&start1);
- cudaEvent_t stop1;
- cudaEventCreate(&stop1);
- cudaEventRecord(start1, NULL);
- // 需要测时间的内核函数kernel;
- cudaEventRecord(stop1, NULL);
- cudaEventSynchronize(stop1);
- float msecTotal1 = 0.0f;
- cudaEventElapsedTime(&msecTotal1, start1, stop1);
方法二:
- StopWatchInterface * timer_cublas;
- sdkCreateTimer(&timer_cublas);
- sdkStartTimer(&timer_cublas);
- // 需要测时间的内核函数kernel;
- cudaSyncThreads()
- sdkStopTimer(&timer_cublas);
- double dSeconds = sdkGetTimerValue(&timer_cublas)/((double)nIter);
关于方法二中的cudaSyncThreads()说明,如果在sdkStopTimer之前不加该函数,会导致测量时间仅仅是核函数在CPU上启动的耗时,而没有考虑在GPU中的耗时,使得结果和方法一小很多。所以要等CUDA启动的GPU线程同步之后,才能停止计时,这样得到的耗时才是正确的。