我尝试使用 CUDA 驱动程序 API 运行由 .cl 内核生成的 PTX 汇编代码。我采取的步骤是这些(标准 opencl 程序):
1)加载.cl内核
2)JIT编译
3)获取编译好的ptx代码并保存。
到目前为止,一切都很好。
我注意到 ptx 程序集中有一些特殊寄存器,%envreg3,%envreg6 等。问题是当我尝试使用以下命令执行代码时,这些寄存器未设置(根据 ptx_isa 这些寄存器是由驱动程序在内核启动之前设置的)驱动程序 API。所以代码陷入了无限循环,无法正确运行。但是,如果我手动设置这些值(也不完全用 ptx 内的块大小替换 %envreg6 ),则代码正在执行并且我得到正确的结果(与 cpu 结果相比是正确的)。
有谁知道如何我们可以设置值到这些寄存器,或者如果我遗漏了什么?即 cuLaunchKernel 上的标志,为这些寄存器设置值?
您正在尝试编译 OpenCL 内核并使用 CUDA 驱动程序 API 运行它。 OpenCL 和 CUDA 之间的 NVIDIA 驱动程序/编译器接口不同,因此不支持您想要做的事情,并且从根本上无法工作。
据推测,唯一的解决方法就是您找到的方法:修补 PTX 代码。但恐怕这在一般情况下可能行不通。
Edit:具体来说,OpenCL 支持比大多数 NVIDIA GPU 支持的更大的网格,因此网格大小需要通过划分多个实际网格启动来虚拟化,因此偏移是必要的。同样在 OpenCL 中,索引不一定从 (0, 0, 0) 开始,用户可以指定驱动程序必须传递给内核的偏移量。因此,为 OpenCL 和 CUDA C 启动初始化的寄存器是不同的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)