Visual c++ 强制NVCC直接进入连接阶段

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链接所有内容 尽管我尽了最大努力,我还是找

我正在使用MSVC将一个GPU应用程序移植到Windows,这似乎对NVCC不太好。我已将编译和链接阶段分开<代码>nvcc将仅预处理cuda文件:

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”