Rus*_*abs 3 performance cuda opencl
在CUDA和OpenCL上测量相同内核的性能时,我发现了一个奇怪的事情.
当我离开我的内核绝对空,没有任何输入参数和计算时,与OpenCL相比,CUDA给我的性能非常差.
CUDA内核:
__global__ void kernel_empty()
{
}
Run Code Online (Sandbox Code Playgroud)
CUDA主持人:
kernel_empty<<<dim3(10000, 10000, 1), dim3(8, 8, 1)>>>();
Run Code Online (Sandbox Code Playgroud)
OpenCl内核:
__attribute__((reqd_work_group_size(8, 8, 1)))
__kernel void kernel_empty()
{
}
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
OpenCL给出了6ms
CUDA给出390毫秒
clGetEventProfilingInfo使用.cudaEventElapsedTime使用.有人可以解释为什么会有这么大的差异吗?
在OpenCL和CUDA中启动内核的方式是不同的,因此实际上您为每个方法启动了不同的工作量.
在OpenCL中,您可以指定全局工作大小(要启动的工作项总数)以及本地工作大小(工作组大小).在您的示例中,您将以8x8的组启动10000*10000个工作项.
在CUDA中,您可以指定块大小(类似于工作组大小)和网格大小,即启动的块数.这意味着您的CUDA示例将启动10000x10000 块,这总共是80000x80000个CUDA线程.
那么,这个CUDA内核的发布:
kernel_empty<<<dim3(10000, 10000, 1), dim3(8, 8, 1)>>>();
Run Code Online (Sandbox Code Playgroud)
相当于这个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);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
817 次 |
| 最近记录: |