【发布时间】:2014-01-03 03:39:38
【问题描述】:
在一个应用程序中,我有一堆 CUDA 内核。有些使用动态并行,有些则不使用。为了在不支持的情况下提供后备选项,或只是允许应用程序继续但功能减少/部分可用,我该如何进行编译?
目前,在不需要计算 3.5 的 670(最大 sm_30)上运行使用 -arch=sm_35 编译的内核时,我得到了 invalid device function。
AFAIK 你不能使用多个 -arch=sm_* 参数并且使用多个 -gencode=* 没有帮助。同样对于可分离编译,我必须使用-dlink 创建一个额外的目标文件,但是在使用compute 3.0 时不会创建这个文件(nvlink fatal : no candidate found in fatbinary 由于-lcudadevrt,我需要3.5),如何我应该处理这个吗?
【问题讨论】:
-
您的问题类似于this one。 AFAIK 目前没有简单的清洁解决方案。如果您解构
nvcc构建序列,则可以这样做,但我不打算详细介绍。我相信当 CUDA 6 可用时,将cudadevrt与不尝试使用动态并行性的 pre-cc3.5 代码链接时将不再抛出错误,然后这个问题将很容易解决。 CUDA 6 应该很快就会推出。