【问题标题】:CUDA PTX code %envreg<32> special registersCUDA PTX 代码 %envreg<32> 特殊寄存器
【发布时间】:2012-11-28 00:56:46
【问题描述】:

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

1) 加载 .cl 内核

2) JIT 编译它

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

到目前为止一切顺利。

我注意到 ptx 程序集中的一些特殊寄存器,%envreg3,%envreg6 等。问题是当我尝试执行带有驱动程序 API 的代码。所以代码陷入了无限循环,无法正确运行。但是,如果我手动设置值(不完全是我将 %envreg6 替换为 ptx 中的块大小),代码正在执行并且我得到正确的结果(与 cpu 结果相比是正确的)。

有谁知道我们如何为这些寄存器设置值,或者如果我遗漏了什么?即 cuLaunchKernel 上的标志,为这些寄存器设置值?

【问题讨论】:

  • 您最终是否以某种方式实现了自动化?

标签: cuda opencl ptx


【解决方案1】:

您正在尝试编译 OpenCL 内核并使用 CUDA 驱动程序 API 运行它。 OpenCL 和 CUDA 的 NVIDIA 驱动程序/编译器接口不同,所以你想要做的不被支持,根本无法工作。

据推测,唯一的解决方法是您找到的解决方法:修补 PTX 代码。但恐怕这在一般情况下可能行不通。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    • 2014-12-17
    • 1970-01-01
    • 2021-08-09
    相关资源
    最近更新 更多