CUDA PTX代码%envreg<32>特殊寄存器 [英] CUDA PTX code %envreg<32> special registers

查看:22
本文介绍了CUDA PTX代码%envreg<32>特殊寄存器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

1)加载.cl内核

2)JIT编译

3)获取编译后的PTX代码并保存。

到目前为止一切顺利。

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

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

OpenCL

您正在尝试编译推荐答案内核并使用CUDA driver API运行它。OpenCL和CUDA之间的NVIDIA驱动程序/编译器接口不同,因此不支持您要执行的操作,并且从根本上无法工作。

想必,唯一的解决方法将是您找到的方法:修补PTX代码。但我担心这在一般情况下可能行不通。

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

这篇关于CUDA PTX代码%envreg<32>特殊寄存器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆