根据NVIDIA编程指南:
应用程序在运行时加载的任何PTX代码都会进一步编译 设备驱动程序的二进制代码。这被称为即时 汇编。即时编译会增加应用程序加载时间, 但允许应用程序从最新的编译器改进中受益。
...
将CUDA_FORCE_PTX_JIT设置为1会强制设备驱动程序忽略任何设备 嵌入在应用程序中的二进制代码(参见第3.1.4节)和 实时编译嵌入式PTX代码;如果内核没有 嵌入了PTX代码,无法加载
我使用以下标志编译了我的简单vectorAdd:
nvcc -o vectorAdd -gencode arch=compute_20,code=sm_20 vectorAdd.cu
如果未设置CUDA_FORCE_PTX_JIT
环境变量,我会得到正确的结果。但是当我将CUDA_FORCE_PTX_JIT
环境变量设置为1
时,我会从cudaGetErrorString
收到以下错误:
invalid device function
如何解决此问题并使CUDA_FORCE_PTX_JIT正常工作?也许我的编译方式没有嵌入任何PTX代码。
先谢谢。
更多信息:
CUDA驱动程序版本:295.41
CUDA工具包版本:4.0
操作系统:Ubuntu 10.04
硬件:GTX 480或Tesla C2050
答案 0 :(得分:0)
我找到了一个锻炼来解决这个问题。在编译期间,不得以任何方式指定目标GPU(删除-arch
或-gencode
标志)。随后,驱动程序在运行时生成目标二进制文件。