Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenCL-如何查询设备';s SIMD宽度?_Opencl_Gpu_Gpgpu - Fatal编程技术网

OpenCL-如何查询设备';s SIMD宽度?

OpenCL-如何查询设备';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编

在CUDA中,有一个warp的概念,它被定义为在单个处理元素中可以同时执行相同指令的最大线程数。对于NVIDIA,目前市场上所有卡的扭曲尺寸均为32

在ATI卡中,有一个类似的概念,但这里的术语是波前。在四处搜寻之后,我发现我的ATI卡的波前大小为64


我的问题是,如何在OpenCL运行时查询此SIMD宽度?

您可以使用clGetDeviceInfo获取本地工作集中每个维度的最大工作项数。这很可能是波前大小的倍数


请参阅:

有关CUDA(使用NVIDIA),请参阅NVIDIA的B.4.5 CUDA编程指南。有一个变量用于包含此信息。您可以在运行时查询此变量。对于AMD,我不确定是否存在这样的变量。

我找到了我想要的答案。事实证明,您没有查询设备中的这些信息,而是查询内核对象(在OpenCL中)。我的消息来源是:

(第108页)

上面说:

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

  • AMD speak中的波前尺寸/Nvidia speak中的扭曲尺寸
  • 查询CL_内核\u首选\u工作\u组\u大小\u倍数的设备
因此,简而言之,答案似乎是调用参数名为CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE的clGetKernelWorkGroupInfo()方法。有关此方法的更多信息,请参阅此链接:


在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上遇到了错误的结果:

英特尔高清4600CL_内核_首选_工作_组_大小_倍数=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大小。