在我的库中,我需要支持计算能力2.0及更高版本的设备。对于CC 3.5+设备,我已经实现了利用动态并行的优化内核。当指定小于“compute_35,sm_35”的任何内容时,nvcc编译器似乎不支持DP(我遇到了编译器/链接器错误)。我的问题是在这种情况下支持多个内核版本的最佳方法是什么?拥有多个DLL并在运行时在它们之间进行选择将起作用,但我想知道是否有更好的方法。
更新:我成功地将#if __CUDA_ARCH__ >= 350
用于其他事情(例如__ldg()
等),但它在DP情况下不起作用,因为我必须与cudadevrt.lib链接,这会产生以下错误:
1> nvlink:致命错误:在C:/ Program Files / NVIDIA GPU Computing Toolkit / CUDA / v5.5 / lib / Win32 / cudadevrt.lib中找不到兼容的设备代码
答案 0 :(得分:2)
我相信现在CUDA 6已经解决了这个问题。
特别是,已经消除/删除了与指定-lcudadevrt
库并为不需要动态并行性的代码抛出链接错误相关的编译问题。
这是我的简单测试:
$ cat t264.cu
#include <stdio.h>
__global__ void kernel1(){
printf("Hello from DP Kernel\n");
}
__global__ void kernel2(){
#if __CUDA_ARCH__ >= 350
kernel1<<<1,1>>>();
#else
printf("Hello from non-DP Kernel\n");
#endif
}
int main(){
kernel2<<<1,1>>>();
cudaDeviceSynchronize();
return 0;
}
$ nvcc -O3 -gencode arch=compute_20,code=sm_20 -gencode arch=compute_35,code=sm_35 -rdc=true -o t264 t264.cu -lcudadevrt
$ CUDA_VISIBLE_DEVICES="0" ./t264
Hello from non-DP Kernel
$ CUDA_VISIBLE_DEVICES="1" ./t264
Hello from DP Kernel
$ nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2013 NVIDIA Corporation
Built on Sat_Jan_25_17:33:19_PST_2014
Cuda compilation tools, release 6.0, V6.0.1
$
在我的情况下,设备0是Quadro5000,cc 2.0设备,设备1是GeForce GT 640,cc 3.5设备。