CUDA PTX代码%envreg< 32>特别登记册

时间:2012-12-10 15:26:17

标签: cuda opencl ptx

我尝试使用CUDA驱动程序API运行.cl内核生成的PTX汇编代码。我采取的步骤是这些(标准的opencl程序):

1)加载.cl内核

2)JIT编译它

3)获取已编译的ptx代码并保存。

到目前为止一切顺利。

我注意到ptx程序集,%envreg3,%envreg6等内部有一些特殊的寄存器。问题是这些寄存器没有设置(根据ptx_isa,这些寄存器是在内核启动之前由驱动程序设置的)当我尝试执行代码与驱动程序API。因此代码陷入无限循环,无法运行核心。但是,如果我手动设置值(确切地说,我将%envreg6替换为ptx中的blocksize),代码正在执行,我得到了正确的结果(与cpu结果相比正确)。

有没有人知道我们如何为这些寄存器设置值,或者如果我错过了什么?即cuLaunchKernel上的一个标志,它为这些寄存器设置值?

1 个答案:

答案 0 :(得分:3)

您正在尝试编译OpenCL内核并使用CUDA驱动程序API运行它。 OpenCL和CUDA之间的NVIDIA驱动程序/编译器接口是不同的,因此不支持您想要做的事情,并且根本无法工作。

据推测,唯一的解决方法是您找到的解决方法:修补PTX代码。但是我担心这在一般情况下可能不起作用。

修改 具体来说,OpenCL支持比大多数NVIDIA GPU支持更大的网格,因此需要通过划分多个实际网格启动来虚拟化网格大小,因此需要进行偏移。同样在OpenCL中,索引不一定从(0,0,0)开始,用户可以指定驱动程序必须传递给内核的偏移量。因此,为OpenCL和CUDA C启动初始化的寄存器是不同的。