在 Nvidia 下读取 OpenCL 可执行文件的共享/本地内存存储/加载库冲突硬件计数器

Posted

技术标签:

【中文标题】在 Nvidia 下读取 OpenCL 可执行文件的共享/本地内存存储/加载库冲突硬件计数器【英文标题】:Reading Shared/Local Memory Store/Load bank conflicts hardware counters for OpenCL executable under Nvidia 【发布时间】:2021-02-01 05:56:48 【问题描述】:

可以使用 nvprof 访问/读取 CUDA exec 的银行冲突计数器:

nvprof --events shared_st_bank_conflict,shared_ld_bank_conflict my_cuda_exe

但它不适用于使用 OpenCL 而不是 CUDA 代码的代码。

有没有办法从 OpenCL 环境中提取nvprof 之外的这些计数器,可能直接从 ptx 中提取? 或者,有什么方法可以将使用clGetProgramInfoCL_PROGRAM_BINARIES 从nvidia OpenCL 编译器生成的PTX 程序集转换为CUDA 内核并使用cuModuleLoadDataEx 运行它,从而能够使用nvprof? 是否有任何模拟 CPU 后端允许设置诸如银行大小等参数?

附加选项:

使用 opencl 到 cuda 代码的转换器,包括 CUDA 中缺少的功能,如 vloadn/vstoren、float16 和其他各种访问器。 #define 仅适用于简单内核。有没有提供它的工具?

【问题讨论】:

你能把 OpenCL 生成的 PTX 传递给cuModuleLoadDataEx 吗?不能保证从 PTX 到 SASS 的相同 ptxas 编译是相同的,但这是一个合理的猜测。 ptxas 的可能选项不同于 OpenCL 和 CUDA(例如舍入规则)。无法保证您会分析相同的程序,但也许这是一个很好的近似值。 【参考方案1】:

有没有办法从 OpenCL 中提取 nvprof 之外的这些计数器 环境,可能直接来自ptx?

没有。 CUDA 中也没有,OpenGL、DirectX 或 Vulkan 的计算着色器中也没有。

或者有什么方法可以转换从生成的 PTX 程序集 nvidia OpenCL 编译器使用 clGetProgramInfo 与 CL_PROGRAM_BINARIES 到 CUDA 内核并使用运行它 cuModuleLoadDataEx 从而能够使用 nvprof?

没有。 OpenCL PTX 和 CUDA PTX 不一样,不能互换使用

是否有任何模拟 CPU 后端允许设置此类参数 如银行规模等?

我不知道。

【讨论】:

“OpenCL PTX 和 CUDA PTX 不一样”当然。然而,在内核的多种情况下,为 CUDA(带有 get_global_id 之类的定义)和 OpenCL 编译的内核的 PTX 非常非常相似,直到头文件中的微小差异。所以理论上转换是可能的。但需要了解如何。 您问“有什么方法可以在 nvprof 之外提取这些计数器......可能直接从 ptx 中提取”,答案是否定的,您不能从用户代码中操作或访问分析数据.有一些程序员暴露的触发器计数器可以增加,你可以打开和关闭分析数据收集,但就是这样 奖励回答但不接受,因为我正在寻找任何类型的方向/解决方案但没有提供。 当一个解决方案不存在时,很难提出解决方案。如果你想用你自己的替代现实代替当前的事态,你完全有权这样做。但是您需要认识到您在支持方面使用供应商的第四层计算 API(在 CUDA、图形 API 计算功能和编译器驱动的 API 之后),并且您不应期望它只能勉强工作。如果您与 OpenCL 结缘,请使用不同的供应商。如果您与 NVIDIA 结缘,请使用 CUDA。不管你喜不喜欢,这就是残酷的现实。

以上是关于在 Nvidia 下读取 OpenCL 可执行文件的共享/本地内存存储/加载库冲突硬件计数器的主要内容,如果未能解决你的问题,请参考以下文章

请介绍下支持opencl 1.2 的N卡列表

Nvidia GEForce 上的 OpenCL 示例程序问题

在 NVIDIA GEFORCE GTX 1050 上下载适用于 windows 10 的 openCL 1.2 [关闭]

如何在 Nvidia GPU 上调试 OpenCL?

使用 Visual Studio 2010 在 Nvidia GEFORCE 上的 OpenCL 代码

NVIDIA 硬件的 OpenCL 1.2 何时可用?