OpenCL getDeviceInfo:如何获取CPU中的内核信息?

OpenCL getDeviceInfo:如何获取CPU中的内核信息?,opencl,gpgpu,Opencl,Gpgpu,使用OpenCL的getDeviceInfo可以获得可用计算单元的数量(CL\u设备\u最大\u计算单元)。在我的nVidia Geforce 8600GTS上,我有4个计算单元,每个单元8个核。使用getDeviceInfo(…CL\u设备\u最大\u计算单位…)我得到4作为计算单位的答案。但是,如何获得每个计算单元的内核数的信息 OpenCL规范没有给出关于这个主题的任何提示。有人知道如何以标准方式检索每个计算单元的内核数吗?我不知道有什么方法-即使是底层的CUDA API目前也没有公开多处

使用OpenCL的getDeviceInfo可以获得可用计算单元的数量(CL\u设备\u最大\u计算单元)。在我的nVidia Geforce 8600GTS上,我有4个计算单元,每个单元8个核。使用getDeviceInfo(…CL\u设备\u最大\u计算单位…)我得到4作为计算单位的答案。但是,如何获得每个计算单元的内核数的信息


OpenCL规范没有给出关于这个主题的任何提示。有人知道如何以标准方式检索每个计算单元的内核数吗?

我不知道有什么方法-即使是底层的CUDA API目前也没有公开多处理器内部配置。在OpenCL的环境中,计算单元很可能是CPU的核心,通过API公开内部SIMD配置没有多大意义,也没有多大用处

NVIDIA确实提供cl_nv_设备_属性_查询扩展,这将为您提供设备的CUDA计算能力。然后,这将映射到每个计算单元的核心,如下所示:

1.0, 1.1, 1.2, 1.3: 8 cores per execution unit
2.0: 32 cores per execution unit
2.1: 48 cores per execution unit

这将取决于您将其编码成一个子例程,并随着硬件的变化保持最新。基于NVIDIA硬件的具体情况,并依赖NVIDIA OpenCL扩展,以上所有内容都无法移植到其他平台。

谢谢您的回答。我认为公开内部SIMD配置是有意义的。对于具有本地内存的本地工作组大小,最好知道优化工作包所需的内核数量。@Rick Rainer Ludwig:问题在于NVIDIA或AMD执行单元中的内核数量与SIMD配置没有直接关系。在NVIDIA硬件中,SIMD“宽度”始终为32,无论执行单元有8个、32个还是48个核。您应该使用的优化参数是本地组大小,而不是根据执行单元中的核数来设置,而是设置为每个执行单元的最佳扭曲/波前数。@Talonmes:我似乎错过了一些东西。我使用共享内存子矩阵进行矩阵乘法,以优化性能。它非常类似于英伟达OCMatRixMull样品。据我所知,fas共享内存位于CPU上,CPU上的所有内核都可以访问它(我的卡上有8个内核),因此它们可以使用。因此,每个子矩阵应由具有8个核的CPU计算。不同的工作组分布在不同的CPU上,但一个工作组位于CPU上。(我理解这样的OpenCL编程指南。)我错了吗?@Rick Rainer Ludwig:总之,是的,你错了。我不能给出一个完整的评论长度的答案,但所有支持NVIDIA CUDA/OpenCL的硬件的底层执行模型是,32个线程的“扭曲”在每个多处理器上以SIMD方式执行。在8核MP中,一个扭曲的每条指令在8核上执行4次,以使32线程扭曲失效。内核的数量与编程模型无关-每个MP需要许多扭曲来覆盖管道延迟,它们可以来自多个工作组(或CUDA块)。谢谢。知道了。这些翘曲没有很好的记录。甚至在官方书籍中根据您的提示,我找到了有关该主题的一些附加信息以及有助于我进一步了解的函数clGetKernelWorkGroupInfo。