visual-c++ - 强制 NVCC 直接进入链接阶段
问题描述
我正在使用 MSVC 将 GPU 应用程序移植到 Windows,这似乎与 NVCC 不太兼容。我已经分离了编译和链接阶段。nvcc
将仅预处理 cuda 文件:
nvcc -dc -ccbin cl somefile.cu
并将cl
编译其他所有内容:
cl anotherfile.c
这种分离是必要的,因为许多 MSVC 标志(此处不包括)与nvcc
' 包装(此处cl.exe
的相关症状)不兼容。
编译完成后,有两种方法可以进行链接。
- 根据本指南,用于仅
nvcc
链接CUDA 设备代码,然后用于链接所有内容。link.exe
尽我所能,我link
找不到 CUDA 标头,也找不到任何关于如何指向库link
的文档。cudart
要是像他们的g++
例子一样简单就好了!
- 让我们
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 社区的谴责)。
解决方案
从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 文件,我没有发现任何问题。
推荐阅读
- haskell - Haskell 变量不在范围内
- python - 将数据框中的每一行除以 Python 中的向量
- javascript - 如何只打开特定的模态窗口?
- python - 如何在 python 执行的 sql 语句中使用 hex(x ' ' )?
- javascript - 将代码移动到函数中时,React-leaflet LayersControl 引发错误
- vue.js - 选择单选按钮时,Vue组件不呈现条件内容
- c# - CodedUITest 前端交互使用另一个本地用户(模拟)
- javascript - 为文档生成自定义 dgeni 管道
- javascript - 统计动态行数并在html的输入框中显示
- c# - 需要精确到小数点后 3 位