2

私のライブラリでは、コンピューティング機能 2.0 以上のデバイスをサポートする必要があります。CC 3.5+ デバイスの場合、動的並列処理を利用する最適化されたカーネルを実装しました。「compute_35,sm_35」よりも小さい値が指定されている場合、nvcc コンパイラは DP をサポートしていないようです (コンパイラ/リンカー エラーが発生しています)。私の質問は、そのような場合に複数のカーネル バージョンをサポートする最善の方法は何ですか? 複数の DLL があり、実行時にそれらを選択することはできますが、もっと良い方法があるかどうか疑問に思っていました。

更新:私は#if __CUDA_ARCH__ >= 350他のもの(__ldg()など)に正常に使用していますが、次のエラーを生成するcudadevrt.libとリンクする必要があるため、DPの場合は機能しません:

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 に答える