【问题标题】:VS 2015 unresolved external symbol when linking extern CUDA C++ code from separate .cu files从单独的 .cu 文件链接外部 CUDA C++ 代码时,VS 2015 未解析的外部符号
【发布时间】:2017-04-06 19:49:36
【问题描述】:

我在 Visual Studio 2015 工作。
我正在使用 cuda 8.0。
我的 GPU 支持计算能力 5.0 (GTX 960m)
我一直在按照nvidia guide 编写代码。

我正在尝试执行 cuda 单独编译(4 个 .cu 文件)。为了访问在不同 .cu 文件中声明的函数,我使用了 __device__ 函数或 __global__ 内核的 extern 声明,但我不断收到以下错误:

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 > 命令行。我只能找到一个 cuda 目标文件的链接命令。我不确定是否可以。

# (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:我的复杂类型定义和支持
  • 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...

basic.cu:

// something before.

extern __global__
void kernel_hamiltonian

// something after.

time_evolution.h:

// nothing interesting...

time_evolution.cu:

// something before.

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

// something after

【问题讨论】:

标签: c++ visual-studio-2015 cuda linker extern


【解决方案1】:

好的,所以单独编译背后的主要思想是启用 nvcc 选项 -rdc=true 而不是 --device-c 非常奇怪,因为在 cuda 指南中,makefile 示例关注 --device-c + --device-link

【讨论】:

    猜你喜欢
    • 2013-07-07
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    • 2020-11-06
    • 2013-06-15
    • 2012-07-29
    • 2016-08-26
    相关资源
    最近更新 更多