2

在我的库中,我需要支持计算能力 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 中找不到兼容的设备代码

4

1 回答 1

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 设备。

于 2013-11-11T20:44:53.970 回答