OpenCL-如何查询设备';s SIMD宽度?
在CUDA中,有一个warp的概念,它被定义为在单个处理元素中可以同时执行相同指令的最大线程数。对于NVIDIA,目前市场上所有卡的扭曲尺寸均为32 在ATI卡中,有一个类似的概念,但这里的术语是波前。在四处搜寻之后,我发现我的ATI卡的波前大小为64OpenCL-如何查询设备';s SIMD宽度?,opencl,gpu,gpgpu,Opencl,Gpu,Gpgpu,在CUDA中,有一个warp的概念,它被定义为在单个处理元素中可以同时执行相同指令的最大线程数。对于NVIDIA,目前市场上所有卡的扭曲尺寸均为32 在ATI卡中,有一个类似的概念,但这里的术语是波前。在四处搜寻之后,我发现我的ATI卡的波前大小为64 我的问题是,如何在OpenCL运行时查询此SIMD宽度?您可以使用clGetDeviceInfo获取本地工作集中每个维度的最大工作项数。这很可能是波前大小的倍数 请参阅:有关CUDA(使用NVIDIA),请参阅NVIDIA的B.4.5 CUDA编
我的问题是,如何在OpenCL运行时查询此SIMD宽度?您可以使用clGetDeviceInfo获取本地工作集中每个维度的最大工作项数。这很可能是波前大小的倍数
请参阅:有关CUDA(使用NVIDIA),请参阅NVIDIA的B.4.5 CUDA编程指南。有一个变量用于包含此信息。您可以在运行时查询此变量。对于AMD,我不确定是否存在这样的变量。我找到了我想要的答案。事实证明,您没有查询设备中的这些信息,而是查询内核对象(在OpenCL中)。我的消息来源是: (第108页) 上面说: 最有效的工作组大小可能是本机硬件执行宽度的倍数
- AMD speak中的波前尺寸/Nvidia speak中的扭曲尺寸
- 查询CL_内核\u首选\u工作\u组\u大小\u倍数的设备
在NVIDIA上,您可以使用clGetDeviceInfo和CL_DEVICE_warp_size_NV查询扭曲尺寸宽度(尽管对于当前GPU,这始终是32),但是,这是一个扩展,因为OpenCL没有定义扭曲或波前。我不知道是否有任何AMD扩展可以查询波前大小。在AMD上,您可以查询CL\U设备\U波前\U宽度\U AMD。这与CL_DEVICE_SIMD_WIDTH_AMD不同,后者返回它在每个时钟周期中执行的线程数。后者可能小于波前大小,在这种情况下,需要多个时钟周期才能为波前中的所有线程执行一条指令。对于AMD:clGetDeviceInfo(…,CL\U设备\U波前\U宽度\U AMD,…)(如果CL\U AMD\U设备\U属性查询支持扩展) 对于Nvidia:clGetDeviceInfo(…,CL\U设备扭曲大小\U NV,…)(如果CL\U NV\U设备属性\U查询支持扩展名) 但是没有统一的方法。Jonathan DeCarlo建议的方法不起作用,如果这两个扩展不受支持,我就在GPU上使用它-例如Intel iGPU,但最近我在英特尔HD 4600上遇到了错误的结果: 英特尔高清4600说CL_内核_首选_工作_组_大小_倍数=32虽然事实上英特尔GPU的波前似乎等于16,所以我遇到了不正确的结果,如果波前=16使用屏障,一切都可以正常工作
另外,我没有足够的声誉来评论Jonathan DeCarlo关于这一点的回答,如果有人添加评论,我会很高兴。CUDA中没有wave,这是ATI特有的术语。“SIMD宽度”称为扭曲。Wavefront也是AMD架构特有的术语,OpenCL规范中没有任何定义。哇!我修正了打字错误。好的,为了术语的缘故,这很有帮助,但是我怎么知道程序运行的机器的“SIMD宽度”是多少呢?有没有办法?请记住,
CL\u内核\u首选\u工作\u组大小\u倍数
不能保证为SIMD大小(执行掩码中的通道数)。也就是说,根据您正在执行的操作,上述查询是报告内容的最佳选择。对于Intel graphics,SIMD大小实际上可以是8、16或32,具体取决于编译的内核及其使用的寄存器数量。您可以通过get_sub_group_size
内部查询所选SIMD大小,或者如果支持CL_intel_subgroup
扩展(Skylake或更高版本),则可以通过CL_KERNEL\u MAX_sub_group_size>外部查询所选SIMD大小。