首页 > 解决方案 > 强制 NVCC 直接进入链接阶段

问题描述

我正在使用 MSVC 将 GPU 应用程序移植到 Windows,这似乎与 NVCC 不太兼容。我已经分离了编译和链接阶段。nvcc将仅预处理 cuda 文件:

nvcc -dc -ccbin cl somefile.cu

并将cl编译其他所有内容:

cl anotherfile.c

这种分离是必要的,因为许多 MSVC 标志(此处不包括)与nvcc' 包装(此处cl.exe的相关症状)不兼容。

编译完成后,有两种方法可以进行链接。

  1. 根据本指南,用于nvcc链接CUDA 设备代码,然后用于链接所有内容。link.exe

尽我所能,我link找不到 CUDA 标头,也找不到任何关于如何指向库link的文档。cudart要是像他们的g++例子一样简单就好了!

  1. 让我们nvcc做所有的链接。

然而,根据文档,“没有选择”可以跳转到链接阶段。因此,当我尝试链接所有内容时,使用...

nvcc somefile.o anotherfile.o -o app.exe

我收到了一些警告cl

cl : Command line warning D9024 : unrecognized source file type 'somefile.o', object file assumed
cl : Command line warning D9024 : unrecognized source file type 'anotherfile.o', object file assumed

自然地,nvcc假设这些目标文件是源代码并将它们发送到cl,因为文档包括:

请注意,nvcc 不区分对象、库或资源文件。

当然 cl抱怨——这些目标文件应该直接传递给链接器。我知道link最终会被调用,因为我将一些不相关的参数传递给它-Xlinker。在这些警告之后,app.exe确实是编译。

尽管文档表明没有链接器阶段参数,但我如何才能强制nvcc链接对象,而不是错误地将它们传递给cl?没有办法抑制这些警告(至少不会受到stackoverflow 社区的谴责)。

标签: visual-c++linkernvcccl

解决方案


从http://github.com/fangq/mcx查看我的 cuda 代码

您可以在 Windows 上的 Cygwin64/MSYS2 终端中编译它,转到mcx/src文件夹,然后键入“make”,这就是我看到的

nvcc -c -g -lineinfo -Xcompiler -Wall -Xcompiler "/openmp /W0" -DSAVE_DETECTORS -use_fast_math -arch=sm_30 -DMCX_TARGET_NAME='"Fermi MCX"' -DUSE_ATOMIC -use_fast_math -o mcx_core.obj  mcx_core.cu
mcx_core.cu
e:\gitroot\project\github\mcx\src\mcx_core.cu(2042) : warning C4701: potentially uninitialized local variable 'gsrcpattern' used
e:\gitroot\project\github\mcx\src\mcx_core.cu(2042) : warning C4703: potentially uninitialized local pointer variable 'gsrcpattern' used
nvcc -I/usr/local/cuda/include -I"/lib/include" -c -D_CRT_SECURE_NO_DEPRECATE -DWIN32 -Xcompiler /openmp -c -o mcx_utils.obj  mcx_utils.c
mcx_utils.c
nvcc -I/usr/local/cuda/include -I"/lib/include" -c -D_CRT_SECURE_NO_DEPRECATE -DWIN32 -Xcompiler /openmp -c -o mcx_shapes.obj  mcx_shapes.c
mcx_shapes.c
nvcc -I/usr/local/cuda/include -I"/lib/include" -c -D_CRT_SECURE_NO_DEPRECATE -DWIN32 -Xcompiler /openmp -c -o tictoc.obj  tictoc.c
tictoc.c
nvcc -I/usr/local/cuda/include -I"/lib/include" -c -D_CRT_SECURE_NO_DEPRECATE -DWIN32 -Xcompiler /openmp -c -o mcextreme.obj  mcextreme.c
mcextreme.c
nvcc -I/usr/local/cuda/include -I"/lib/include" -c -D_CRT_SECURE_NO_DEPRECATE -DWIN32 -Xcompiler /openmp -c -o cjson/cJSON.obj  cjson/cJSON.c
cJSON.c
nvcc mcx_core.obj mcx_utils.obj mcx_shapes.obj tictoc.obj mcextreme.obj cjson/cJSON.obj -o ../bin/mcx -L"/lib/x64" -lcudart -Xcompiler /openmp
mcx_core.obj
mcx_utils.obj
mcx_shapes.obj
tictoc.obj
mcextreme.obj
cJSON.obj
   Creating library ../bin/mcx.lib and object ../bin/mcx.exp

它编译每个 c 单元,并按预期链接 .obj 文件,我没有发现任何问题。


推荐阅读