Visual c++ 强制NVCC直接进入连接阶段
我正在使用MSVC将一个GPU应用程序移植到Windows,这似乎对NVCC不太好。我已将编译和链接阶段分开<代码>nvcc将仅预处理cuda文件:Visual c++ 强制NVCC直接进入连接阶段,visual-c++,linker,nvcc,cl,Visual C++,Linker,Nvcc,Cl,我正在使用MSVC将一个GPU应用程序移植到Windows,这似乎对NVCC不太好。我已将编译和链接阶段分开nvcc将仅预处理cuda文件: nvcc-dc-ccbin cl somefile.cu 而cl将编译所有其他内容: cl另一个文件.c 这种分离是必要的,因为许多MSVC标志(此处排除)与nvcc的cl.exe的包装(一种相关症状)不一致 编译完成后,有两种方法可以进行链接 根据,使用nvcc仅链接CUDA设备代码,然后使用link.exe链接所有内容 尽管我尽了最大努力,我还是找
nvcc-dc-ccbin cl somefile.cu
而cl
将编译所有其他内容:
cl另一个文件.c
这种分离是必要的,因为许多MSVC标志(此处排除)与nvcc
的cl.exe的包装(一种相关症状)不一致
编译完成后,有两种方法可以进行链接
根据,使用nvcc
仅链接CUDA设备代码,然后使用link.exe
链接所有内容
尽管我尽了最大努力,我还是找不到link
来查找CUDA标题,也找不到任何关于如何将link
指向cudart
库的文档。要是能像他们的g++
示例那样简单就好了
让nvcc
完成所有链接
然而,根据政府的说法,“没有选择”可以跳转到链接阶段。所以当我尝试链接所有内容时,使用
nvcc somefile.o另一个文件.o-o app.exe
我从cl
收到一些警告
cl:命令行警告D9024:无法识别的源文件类型“somefile.o”,假定为对象文件
cl:命令行警告D9024:无法识别的源文件类型“anotherfile.o”,假定为对象文件
自然,nvcc
假定这些目标文件是源代码,并将它们发送到cl
,因为文档包括:
请注意,nvcc不区分对象、库或资源文件
当然,cl
在抱怨-这些对象文件应该直接传递给链接器。我知道link
最终会被调用,因为我用-Xlinker
传递了一些不相关的参数。在这些警告之后,app.exe
确实被编译
尽管doc指示没有链接器阶段参数,但如何强制nvcc
只链接对象,而不将它们错误地传递给cl
?无法抑制这些警告(至少在没有stackoverflow社区的支持下是如此)。请查看我的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单元和link.obj文件,我看不出有任何错误。甚至连标志都指定为“编译并链接”,哇!谢谢你的回答,虽然我是专门用MSVC编译的,并询问编译和链接的分离(你的构建没有这样做)不,我的命令确实将编译和链接(最后一个命令)分开,nvcc被配置为调用MSVC进行编译和链接。啊,我很抱歉-但你没有说明如何;与我的例子有什么不同?虽然不是MWE,但一种可能的解释是我编译成.o
文件,而您使用的是Windows常规.obj
。在我的状态中,使用.o
是必要的,我认为后缀不是问题。我刚刚将makefile()中的一行从.obj更改为.o,我能够在我的windows机器(win10、vc12、cuda 8)上正确编译/链接,唯一的区别是链接器发出警告cl:命令行警告D9024:无法识别的源文件类型“mcx_core.o”,假定对象文件为,与您看到的警告相同。但是二进制文件是正确创建的。好吧,重新阅读你原来的帖子-你的问题是为什么链接命令被发送到cl?您可以通过在最后一个nvcc链接命令中添加-v来找到答案。根据我的测试,它使用-link
调用nvlink
来链接,但是在发出警告的末尾有一行:cl.exe@“C:\…\tmp/tmpxft\u 00…-8.res“-Fe”。/bin/mcx”
。