CUDA:CUtil 计时器 - 对经过时间的混淆
-
13-12-2019 - |
题
当我评估我的程序时,我发现在某些时候我的延时时间高达 100 毫秒。我搜索了每项操作,但没有任何操作需要花费时间。然后我注意到无论我在哪里进行 cudaThreadSynchronize 调用,第一个调用都会花费 100 毫秒。然后我在下面写了一个这样的例子。当在第一行调用cudaThreadSynchronize时,发现最后的经过时间值小于1毫秒。但如果不被调用,则平均需要 110 毫秒。
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,必须首先在 GPU 上创建“CUDA 上下文”,这大约需要 70-100 毫秒。在你的例子中 cudaThreadSynchronize();
正在创造背景。上下文仅为您的应用程序创建一次。在进行时序分析时,我还会进行虚拟内存复制来创建上下文(正如您上面使用的那样) cudaThreadSynchronize();
).
不隶属于 StackOverflow