在CUDA和OpenCL上测量相同内核的性能时,我发现了一个奇怪的事情.
当我离开我的内核绝对空,没有任何输入参数和计算时,与OpenCL相比,CUDA给我的性能非常差.
CUDA内核:
__global__ void kernel_empty() { }
CUDA主持人:
kernel_empty<<>>();
OpenCl内核:
__attribute__((reqd_work_group_size(8, 8, 1))) __kernel void kernel_empty() { }
OpenCL主机:
cl_event perf_event; size_t global_work_offset[3] = {0, 0, 0}; size_t global_work_size[3] = {10000, 10000, 1}; size_t local_work_size[3] = {8, 8, 1}; clEnqueueNDRangeKernel(queue, kernel, 3, global_work_offset, global_work_size, local_work_size, 0, NULL, &perf_event);
OpenCL给出了6ms
CUDA给出390毫秒
两个API上的内核都正常工作,因为我正在使用它们来计算我的东西.
双方都没有返回错误代码.
使用Visual Studio 2010,发布模式
来自NVIDIA GPU Computing Toolkit 5.5的OpenCL 1.1 lib
来自NVIDIA GPU Computing Toolkit 5.5的CUDA lib
计时也是正确的,我用CPU计时器仔细检查了它们.此外,当使用巨大的网格时,您可以看到CUDA如何在没有任何计时器的情况下滞后.
对于OpenCL clGetEventProfilingInfo
使用.
对于CUDA cudaEventElapsedTime
使用.
测试在与NVIDIA Quadro K4000相同的PC上运行.
有人可以解释为什么会有这么大的差异吗?