OpenCL - 如何查询设备的SIMD宽度?

Jon*_*rlo 23 gpu gpgpu opencl

在CUDA中,存在warp的概念,其被定义为可以在单个处理元件内同时执行相同指令的最大线程数.对于NVIDIA,目前市场上所有卡的经线尺寸均为32.

在ATI卡中,有一个类似的概念,但在这种情况下的术语是波前.经过一番狩猎后,我发现我所拥有的ATI卡的波前大小为64.

我的问题是,在运行时为OpenCL查询此SIMD宽度我该怎么办?

Jon*_*rlo 14

我找到了我正在寻找的答案.事实证明,您不查询设备以获取此信息,您查询内核对象(在OpenCL中).我的来源是:

http://www.hpc.lsu.edu/training/tutorials/sc10/tutorials/SC10Tutorials/docs/M13/M13.pdf

(第108页)

其中说:

最有效的工作组大小可能是本机硬件执行宽度的倍数

  • AMD的波前大小说话/ Nvidia说话的扭曲大小
  • 查询CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE的设备

因此,简而言之,答案似乎是使用param名称CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE调用clGetKernelWorkGroupInfo()方法.有关此方法的更多信息,请参阅此链接:

http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clGetKernelWorkGroupInfo.html


pea*_*man 6

在AMD上,您可以查询CL_DEVICE_WAVEFRONT_WIDTH_AMD.这与CL_DEVICE_SIMD_WIDTH_AMD不同,后者返回它在每个时钟周期中执行的线程数.后者可能小于波前大小,在这种情况下,它需要多个时钟周期来为波前的所有线程执行一条指令.


Rad*_*nsa 5

在 NVIDIA 上,您可以使用 clGetDeviceInfo 和 CL_DEVICE_WARP_SIZE_NV 查询扭曲大小宽度(尽管当前 GPU 始终为 32),但是,这是一个扩展,因为 OpenCL 没有定义扭曲或波前之类的内容。我不知道任何 AMD 扩展可以允许查询波前尺寸。