8

我们一直在 linux 中开发我们的代码,但想编译一个 windows 可执行文件。旧的非 gpu 版本在 windows 中用 mingw 编译得很好,所以我希望我能用 CUDA 版本做同样的事情。

策略是在visual studio中用nvcc编译内核代码,在mingw中用gcc编译其余代码。

到目前为止,我们在 Visual Studio 中轻松编译了 .cu 文件(带有内核和内核启动)。但是,我们仍然无法在mingw中编译c代码。c代码包含cuda api调用如cudaMalloc和cuda类型如cudaEvent_t,所以我们必须包括cuda.h和cuda_runtime.h。但是,gcc 会为这些标头提供警告和错误,例如:

../include/host_defines.h:57:0: warning: "__cdecl" redefined

../include/vector_functions.h:127:14: error: 'short_4' has no member named 'x'

关于我们如何包含这些头文件并编译代码的 c 部分的任何想法?

4

3 回答 3

2

如果你真的很绝望,也许有办法。nvcc 实际上只是一堆编译器的前端。它大量调用 g++ 来剥离注释、分离设备和主机代码、处理名称修改、将内容重新链接在一起等(使用--verbose)来获取详细信息。

我的想法如下:您应该能够在将设备代码编译到 linux 机器上的 fatbin 时使用 mingw 编译主机代码(因为我猜设备二进制文件是独立于主机的)。然后将代码的两个部分与 mingw 链接在一起,或者使用驱动程序 API 动态加载 fatbin。免责声明:未测试!

于 2011-05-04T20:24:46.153 回答
1

据我所知,没有 MSVC 就不可能使用 CUDA。因此,您需要 MSVC 才能使 nvcc 工作,并且您可以使用 mingw 编译 CPU 代码并将所有内容链接在一起。

根据http://forums.nvidia.com/index.php?showtopic=30743

“目前没有支持 mingw 的计划。”

于 2011-05-04T19:40:40.397 回答
1

您可能想看看循环渲染器如何处理这个问题,请查看https://developer.blender.org/diffusion/B/browse/master/extern/cuew/https://developer.blender.org/扩散/B/browse/master/intern/cycles/device/device_cuda.cpp

我知道这不是自动魔术,但它可能会帮助您入门。

于 2015-02-06T11:44:32.510 回答