nvidia opencl sdk.
到处看了看帖子,说CLOCK()计时精度太低,而WINDOWS上可以用queryperformance那个方法。
由于我在linux上做的,用了这两种方法。
1.用<sys/tim.h>里那个timeval结构体,调用gettimeofday(…)那个方法做的,应该算是CPU计时把。但精度是不是还是低了?我看每次用这个测总exeute time浮动太大。
2.用opencl的函数clgeteventprofilinginf(0做的。以oclvectoradd这个最简单的例子为例,代码见
cl_ulong start,end;
cl_event event_ker_x;
ciErr1 = clEnqueueNDRangeKernel(cqCommandQueue, ckKernel, 1, NULL, &szGlobalWorkSize, &szLocalWorkSize, 0, NULL, &event_ker_x);
shrLog("clEnqueueNDRangeKernel (VectorAdd)...\n");
if (ciErr1 != CL_SUCCESS){ shrLog("Error in clEnqueueNDRangeKernel, Line %u in file %s !!!\n\n", __LINE__, __FILE__);
Cleanup(argc, argv, EXIT_FAILURE);}
clGetEventProfilingInfo(event_ker_x, CL_PROFILING_COMMAND_START, sizeof(cl_ulong), &start, NULL);
clGetEventProfilingInfo(event_ker_x, CL_PROFILING_COMMAND_END, sizeof(cl_ulong), &end, NULL);
float ker_x_time= (end-start) * 1.0e-6f;shrLog("kernel execution time is : %f\n", ker_x_time);
但运行出来结果是
kernel execution time is : 18446744027136.000000太离谱了把。 难道是在getEventProfilinginfo前要加clWaitForEvent()保证整个EVENT全部做完?那么结果是
kernel execution time is : 0.924000
单位是毫秒。
这个值对么?要不要加waitforevent()的?求大侠指教。先谢过。
楼主您好,
您需要使用clFinish或者clWaitForEvents来确保操作完成的,
加入位置请放在clGetEventProfilingInfo前,谢谢。
感谢来访。
至于您的"一般kernel的执行时间有多少”,
这个无一定标准的,从us级别的小kernel, 到运行几十s甚至几个小时的大型kernel都是存在的,
这个要看您的具体计算规模和您的实现的效率如何。
其次,是否event的计时一定是在设备端的,这个不一定的,而较大的可能是在host端计时的,即它可能是QueryPerformanceCounter/gettimeofday之类的封装。但依然建议使用,因为他们依然可以提高较高的精度(比起你不使用clGetEventProfilingInfo, 而是在kernel的开始enqueue和clFinish后的你的手工计时)。
感谢来访。
你好,版主。 但是用EVENT计时不是每次在call一个CL函数前设一个EVENT,然后GET他的PROFILINGINFO么。 我想记录总的执行时间呢?是不是一定要在HOST端计时?即一定要用CPU计时?
如果是的话,那么LINUX上有没有精度高的好的计时方法?因为像QueryPerformanceCounter好像是在提供给WINDOWS用的?
谢谢你的回帖
在您的kernel被enqueue到您的command queue里的时候,将同时返回一个cl_event的。
该event除了为您提供同步服务外,还将为您提供4个方面的计时(您需要打开贵command queue的profiling功能):
(1) event所代表的操作(这里是您的kernel, 下同) 什么时候被加入到command queue的。
(2) 贵kernel是什么时候被提交到device上的。
(3)贵kernel是什么时候在device上开始执行的。
(4)贵kernel是什么时候在device上被执行完毕的。
显然您需要在(1)-(4)都实际完成后(您可以简单的等待此event或者直接同步您的command queue, 通过使用clFinish), 才能获取到相关这4条信息的。
对此API的调用的确是在host上的,但里面的这4个信息的记录,不一定是在什么地方完成的(一般也在host上,由显卡驱动负责记录)。
但这个和“一定是用CPU计时“无关,在host上执行的代码,不一定就是用的cpu计时的:系统的时钟源很多,opencl实现将具体选择较高精度和较为稳定的时钟源的。不一定是使用cpu计时 (例如rdtsc之类)的。
关于您的第二个问题:
我对Linux的一切一无所知,无法提供任何建议。
我唯一的建议是您使用clGetEventProfilingInfo两次,然后做差得到实际运行时间。
您的其他计时方式(例如您假设存在的某函数)不可能取得比这个更高精度的。
您觉得呢?
感谢来访,午夜愉快。