GPU将如何处理不同的NDRange调用?

时间:2014-06-18 12:13:27

标签: opencl

我在理解工作项目/工作组/ warps / threads时度过了艰难的一天..我在GPU上运行程序......有些人正在帮助......有些人不是......我想知道我哪里出错了。请帮我解决一些基本的逻辑。

根据我在NDRangekernel中的理解,

global_work_size: how many workgroups
local_work_size: how many workitems in each workgroup

所以,如果我说WG,WI = 1024,1024 - >这意味着将调用1024 * 1024个作业?我理解这里将调用1024个工作组,每个工作组将有1024个工作项,因此内核将执行1024 * 1024次。

问题1:上述语句是否为真?

问题2:然后warp出现在哪里?在这里做什么是扭曲逻辑?

问题3:如果执行以下语句,将启动多少任务:

size_t glob = 1024;
clEnqueueNDRangeKernel(command_queue, kernel, 1, NULL, &glob, NULL, 0, NULL, &event);

问题4:如果执行以下语句,将启动多少任务:

size_t glob = 1024;
size_t loc = 1;
clEnqueueNDRangeKernel(command_queue, kernel, 1, NULL, &glob, &loc, 0, NULL, &event);

问题5:如果执行以下语句,将启动多少任务:

size_t glob = 1024;
size_t loc = 1024;
clEnqueueNDRangeKernel(command_queue, kernel, 1, NULL, &glob, NULL, 0, NULL, &event);

问题6:像computeprof等一些分析器提供了warps_launched,threads_launched,active_warps,active_cycles等数据?这些是什么??这里线程的逻辑是什么?

P.S。这些不是作业问题..我真的想知道当我启动内核时GPU上会发生什么......请帮帮我..

1 个答案:

答案 0 :(得分:2)

  

如果我说WG,WI = 1024,1024 - >这意味着将调用1024 * 1024个作业?我理解这里将调用1024个工作组,每个工作组将有1024个工作项,因此内核将执行1024 * 1024次。

     

问题1:上述陈述是否真实?

没有。这就是CUDA内核启动的方式(使用块大小和网格大小),但OpenCL采用了不同的方法。全局工作大小是工作项的总数,而不是工作组的数量。当地的工作规模是每个工作组中要放置的工作项目数量;此参数对总共启动的工作项数量完全没有影响。


  问题2:然后经线出现在哪里?在这里做什么是扭曲逻辑?

许多运行OpenCL的设备以SIMD方式执行小组工作项。也就是说,这些工作项组同时执行相同的指令。在NVIDIA硬件上,这些称为warp,包含32个工作项。在AMD硬件上,它们被称为波前,包含64个工作项。 OpenCL编程模型并没有真正将这些SIMD组暴露给程序员,尽管您可以查询首选工作组大小倍数(通过将CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE传递给clGetKernelWorkGroupInfo),这表明这个尺寸是多少。 OpenCL 2.0有一个cl_khr_subgroups扩展,它也开始暴露这些东西,并提供一些可以在这些设备上有效实现的同步原语。


  

问题3:如果执行以下语句,将启动多少任务:

size_t glob = 1024;
clEnqueueNDRangeKernel(command_queue, kernel, 1, NULL, &glob, NULL, 0, NULL, &event);

这将启动1024个工作项。工作组的这个大小将由运行时的实现选择。


  问题4:如果执行以下语句,将启动多少任务:

size_t glob = 1024;
size_t loc = 1;
clEnqueueNDRangeKernel(command_queue, kernel, 1, NULL, &glob, &loc, 0, NULL, &event);

这也将启动1024个工作项,但会坚持他们在大小为1的工作组中。


  

问题5:如果执行以下语句,将启动多少任务:

size_t glob = 1024;
size_t loc = 1024;
clEnqueueNDRangeKernel(command_queue, kernel, 1, NULL, &glob, NULL, 0, NULL, &event);

这也将启动1024个工作项,但它们将在一个工作组中。


  

问题6:像computeprof等一些分析器提供了warps_launched,threads_launched,active_warps,active_cycles等数据?这些是什么??这里线程的逻辑是什么?

对于NVIDIA硬件,线程是单个工作项。 NVIDIA NVVP documentation是获取每个指标所含内容的详细说明的最佳位置。