在 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 中提取?
或者,有什么方法可以将使用clGetProgramInfo
和CL_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 可执行文件的共享/本地内存存储/加载库冲突硬件计数器的主要内容,如果未能解决你的问题,请参考以下文章
Nvidia GEForce 上的 OpenCL 示例程序问题
在 NVIDIA GEFORCE GTX 1050 上下载适用于 windows 10 的 openCL 1.2 [关闭]