在CUDA中,存在 warp 的概念,其被定义为可以在单个处理元素内同时执行相同指令的最大线程数。对于NVIDIA,目前市场上所有显卡的经线尺寸为32。
在ATI卡中,有一个类似的概念,但此上下文中的术语是 wavefront 。经过一番狩猎后,我发现我所拥有的ATI卡的波前尺寸为64。
我的问题是,如何在运行时为OpenCL查询此SIMD宽度?
答案 0 :(得分:13)
我找到了我想要的答案。事实证明,您不查询设备以获取此信息,您查询内核对象(在OpenCL中)。我的来源是:
http://www.hpc.lsu.edu/training/tutorials/sc10/tutorials/SC10Tutorials/docs/M13/M13.pdf
(第108页)
说:
最有效的工作组大小可能是本机硬件执行宽度的倍数
- AMD的波前大小说话/ Nvidia中的warp大小说
- 查询CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE的设备
因此,简而言之,答案似乎是调用clGetKernelWorkGroupInfo()方法,其参数名称为CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE。有关此方法的更多信息,请参阅此链接:
http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetKernelWorkGroupInfo.html
答案 1 :(得分:6)
在AMD上,您可以查询CL_DEVICE_WAVEFRONT_WIDTH_AMD。这与CL_DEVICE_SIMD_WIDTH_AMD不同,后者返回它在每个时钟周期中执行的线程数。后者可能小于波前大小,在这种情况下,需要多个时钟周期才能为波前的所有线程执行一条指令。
答案 2 :(得分:4)
在NVIDIA上,你可以使用clGetDeviceInfo和CL_DEVICE_WARP_SIZE_NV来查询warp大小宽度(虽然现在的GPU总是32),但是,这是一个扩展,因为OpenCL没有像warp或wavefron那样定义。我不知道任何可以查询波前大小的AMD扩展。
答案 3 :(得分:2)
对于AMD:clGetDeviceInfo(..., CL_DEVICE_WAVEFRONT_WIDTH_AMD ,...)(如果支持 cl_amd_device_attribute_query 扩展名)
对于Nvidia:clGetDeviceInfo(..., CL_DEVICE_WARP_SIZE_NV ,...)(如果支持 cl_nv_device_attribute_query 扩展名)
但没有统一的方式。 Jonathan DeCarlo建议的方式不起作用,如果不支持这两个扩展,我将它用于GPU - 例如Intel iGPU,但最近我在 Intel HD 4600 上遇到了错误的结果:
英特尔HD 4600 表示 CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE = 32 ,而事实上英特尔GPU似乎波前等于16,因此我遇到了错误的结果,如果使用障碍,一切正常对于wavefront = 16。
P.S。我没有足够的声誉评论Jonathan DeCarlo对此的回答,如果有人会发表评论,我会很高兴。
答案 4 :(得分:-1)
您可以使用clGetDeviceInfo获取每个维度在本地工作集中可以拥有的最大数量的工作项。这很可能是您波前尺寸的多倍。
请参阅:http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetDeviceInfo.html
答案 5 :(得分:-2)
对于CUDA(使用NVIDIA),请查看NVIDIA的B.4.5 Cuda编程指南。有一个包含此信息的变量。您可以在运行时查询此变量。对于AMD,我不确定是否有这样的变量。