2016-11-22 16 views
0

Visual Studio 2015で作業しています。
私はcuda 8.0を使用しています。
私のGPUは計算機能5.0(GTX 960m)をサポートしています
私はnvidia guideのコードを書いています。別の.cuファイルからextern CUDA C++コードをリンクすると、VS 2015未解決の外部シンボル

私は、cuda別のコンパイル(4つの.cuファイル)を実行しようとしています。私は__device__機能や__global__カーネルにextern宣言を使用していますが、私は次のエラーを得続ける異なる.cuファイルで宣言された関数へのアクセスを獲得するには、次の

1>GPU_Engine.cu.obj : error LNK2001: unresolved external symbol __cudaRegisterLinkedBinary_45_tmpxft_00001e30_00000000_8_GPU_Engine_cpp1_ii_1b52ddad 
1>cplx.cu.obj : error LNK2001: unresolved external symbol __cudaRegisterLinkedBinary_39_tmpxft_00001150_00000000_8_cplx_cpp1_ii_I 
1>basic.cu.obj : error LNK2001: unresolved external symbol __cudaRegisterLinkedBinary_40_tmpxft_00002648_00000000_8_basic_cpp1_ii_1458022c 
1>time_evolution.cu.obj : error LNK2001: unresolved external symbol __cudaRegisterLinkedBinary_49_tmpxft_000022d0_00000000_8_time_evolution_cpp1_ii_df1c8d01 
1>E:\0000_0003_Programs\Visual_Studio\Visual Studio 2015\Projects\GPU_Engine\x64\Release\GPU_Engine.exe : fatal error LNK1120: 4 unresolved externals 

それはMSVCリンクエラーではありませんNVCCのように私には見えます。

自分の.cuファイルのVSプロパティに--device-cフラグを使用していることを指摘しておきます。

私はまた、プロジェクトプロパティ> cuda Linker>コマンドラインについて心配しています。私は1つのcudaオブジェクトファイルのlinkageコマンドを見つけることができます。そして私はそれが大丈夫なのかどうかはわかりません。

# (Approximate command-line. Settings inherited from host are not visible below.) 
# (Please see the output window after a build for the full command-line) 

"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\bin\nvcc.exe" -dlink -o x64\Release\GPU_Engine.device-link.obj -Xcompiler "/EHsc /nologo /Zi "  



簡易コード:
私は4つの別々.cuファイルを持っている:

  • GPU_Engine.h + GPU_Engine.cu:クラス定義(クラスメンバー関数はCUDAを使用していますカーネル)
  • Cplx.h + Cplx.cu: my complex type definitイオンとサポート
  • basic.h + basic.cu:与えられた物理システムの数学モデルの基本的な機能
  • time_evolution.h + time_evolution.cu:モデル


ため
特化した機能 GPU_Engine.h:

// nothing interesting... 

GPU_Engine.cu:

// something before. 

__device__ 
double potential(int& i, int& j, int& k) { 
// do something. 
} 

__global__ 
void kernel_hamiltonian(Cplx* d_out, Cplx* d_psi, Cplx* d_lap) { 
// do something. 
} 

// something after. 

Cplx.h:

// type definition. 

extern __device__ __constant__ 
Cplx I; // imaginary unit 

// Cplx math support. 

Cplx.cu:

__device__ __constant__ 
Cplx I; // cudaMemcpyToSymbol() inside GPU_Engine.cu in "start-up" section of code. 

basic.h:

// nothing interesting... 

ベーシックです。銅:

// something before. 

extern __global__ 
void kernel_hamiltonian 

// something after. 

time_evolution.h:

// nothing interesting... 

time_evolution.cu:分割コンパイルの背後にある主要なアイデアは、NVCCオプション-rdc=trueを有効にすることですので

// something before. 

extern __device__ 
double potential(int& i, int& j, int& k) 

// something after 
+0

ok私はこの問題を解決するためにmenaged。それはささいなことでした... 参照:[stackoverflow.com質問](http://stackoverflow.com/questions/17188527/cuda-external-class-linkage-and-unresolved-extern-function-in-ptxas-file) – cukier9a7b5

答えて

1

OK --device-cではありませんが、非常に奇妙なのは、クーダガイド、makefiルのサンプルは、--device-c + --device-linkを心配していました。

関連する問題