【问题标题】:OpenCL getDeviceInfo: How to get information about the cores within a CPU?OpenCL getDeviceInfo:如何获取有关 CPU 内核的信息?
【发布时间】:2011-05-01 21:08:06
【问题描述】:

使用 OpenCL 的 getDeviceInfo 可以获取可用计算单元的数量 (CL_DEVICE_MAX_COMPUTE_UNITS)。在我的 nVidia Geforce 8600GTS 上,我有 4 个计算单元,每个单元有 8 个内核。使用 getDeviceInfo(...CL_DEVICE_MAX_COMPUTE_UNITS...) 我得到 4 作为计算单元的答案。但是,如何获取有关每个计算单元的内核数的信息?

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

【问题讨论】:

    标签: opencl gpgpu


    【解决方案1】:

    我不知道——即使是底层的 CUDA API 目前也没有公开多处理器内部配置。在 OpenCL 的上下文中,计算单元很可能是 CPU 的核心,通过 API 公开内部 SIMD 配置没有多大意义,而且无论如何也不是那么有用。

    NVIDIA 确实提供了 cl_nv_device_attribute_query 扩展,它将为您提供设备的 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 个内核。您应该使用的优化参数是本地组大小,并且您不会根据执行单元中的核心数量来设置它 - 您将其设置为每个执行单元的扭曲/波前的最佳数量。
    • @talonmies:我似乎在这里错过了一些东西。我使用共享内存子矩阵进行了一种矩阵乘法以优化性能。它与 nVidia oclMatrixMul 示例非常相似。据我所知,共享内存位于 CPU 上,CPU 上的所有内核都可以访问它(我的卡上有 8 个内核),因此它们可以使用。因此,每个子矩阵都应由具有 8 个内核的 CPU 计算。不同的工作组分布在不同的 CPU 上,但一个工作组在 CPU 上。 (我了解这样的 OpenCL 编程指南。)我错了吗?
    • @Rick-Rainer Ludwig:总之,是的,你错了。我不能在评论的长度上给你一个完整的答案——但所有支持 NVIDIA CUDA/OpenCL 的硬件的底层执行模型是 32 个线程的“扭曲”在每个多处理器上执行 SIMD 样式。在 8 核 MP 中,warp 的每条指令在 8 个内核上执行 4 次,以退出 32 线程 warp。内核的数量与编程模型无关——每个 MP 需要许多 warp 来覆盖管道延迟,并且它们可以来自多个工作组(或 CUDA 块)。
    • 谢谢。知道了。经线没有很好的记录。即使在官方书籍中。 ;-) 根据您的提示,我找到了有关该主题的一些附加信息以及帮助我​​进一步了解的函数 clGetKernelWorkGroupInfo。
    猜你喜欢
    • 1970-01-01
    • 2018-06-14
    • 1970-01-01
    • 1970-01-01
    • 2013-03-06
    • 2012-03-26
    • 1970-01-01
    • 2014-05-26
    • 1970-01-01
    相关资源
    最近更新 更多