空内核上的CUDA vs OpenCL性能

时间:2014-05-06 11:08:41

标签: performance cuda opencl

在CUDA和OpenCL上测量相同内核的性能时,我发现了一个奇怪的事情。

当我将内核绝对清空,没有任何输入参数和计算时,与OpenCL相比,CUDA给我的性能非常差。

CUDA内核:

__global__ void kernel_empty()
{
}

CUDA主持人:

kernel_empty<<<dim3(10000, 10000, 1), dim3(8, 8, 1)>>>();

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上运行。

有人可以解释为什么会有这么大的差异吗?

1 个答案:

答案 0 :(得分:6)

在OpenCL和CUDA中启动内核的方式是不同的,因此实际上您为每种方法启动了不同的工作量。

在OpenCL中,您可以指定全局工作大小(要启动的工作项总数)以及本地工作大小(工作组大小)。在您的示例中,您将以8x8的组启动10000 * 10000个工作项。

在CUDA中,您可以指定块大小(类似于工作组大小)和网格大小,即要启动的块数。这意味着您的CUDA示例正在启动10000x10000 ,这是总共80000x80000个CUDA线程。

所以,这个CUDA内核启动:

kernel_empty<<<dim3(10000, 10000, 1), dim3(8, 8, 1)>>>();

相当于这个OpenCL内核入队:

size_t global_work_size[3] = {80000, 80000, 1};
size_t local_work_size[3] = {8, 8, 1};
clEnqueueNDRangeKernel(queue, kernel, 3, NULL, global_work_size, local_work_size, 0, NULL, &perf_event);