CUDA与MinGW的集成 - 更新版

8
我们一直在Linux上开发我们的代码,但是希望编译一个Windows可执行文件。旧的非GPU版本在Windows中使用mingw编译没有问题,因此我希望CUDA版本也可以这样做。
策略是在Visual Studio中使用nvcc编译内核代码,在mingw中使用gcc编译其余部分。
到目前为止,我们已经在Visual Studio中轻松编译了包含内核和内核启动的.cu文件。然而,我们仍然无法在mingw中编译C代码。C代码包含类似于cudaMalloc和cudaEvent_t的cuda api调用,因此我们必须包含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代码?

你有考虑使用驱动API吗? - Matt
@Matt 不行 - 从运行时 API 转换到驱动程序 API 需要多少工作量? - jmilloy
1
如果你有很多CUDA代码,将其转换需要一些时间 - 驱动程序API比运行时API更冗长。通过mingw编译驱动程序API代码会更容易,因为你可以通过标准C函数调用驱动程序。不过我无法告诉你是否值得切换。 - Matt
3个回答

2
如果你真的很绝望,可能有一种方法。nvcc实际上只是一堆编译器的前端。它经常调用g ++来剥离注释、分离设备和主机代码、处理名称重整、将所有东西链接在一起等等(使用--verbose)以获取详细信息。
我的想法是:你应该能够使用mingw编译主机代码,同时在Linux机器上将设备代码编译为fatbin(因为我猜设备二进制文件与主机机器无关)。然后使用mingw将代码的两部分链接在一起,或者使用驱动程序API动态加载fatbin。免责声明:未测试!

1
据我所知,没有使用MSVC是不可能使用CUDA的。因此,您需要MSVC才能使nvcc工作,并且您可以使用mingw编译CPU代码并将所有内容链接在一起。
根据NVIDIA论坛上的http://forums.nvidia.com/index.php?showtopic=30743

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


2
另一方面,如果您不绝对坚持使用CUDA(即非专有的OpenCL“足够好”),那么它可以与MinGW无缝配合使用。 - Damon
@Damon - 有没有将CUDA移植到OpenCL的经验?我记得语法很相似,如果不是完全一样的话... - jmilloy
有一个工具可以帮助从CUDA迁移到OpenCL,网址为http://gpgpu.org/2010/03/09/swan,此外还有很多手册可供参考,例如http://developer.amd.com/documentation/articles/pages/OpenCL-and-the-AMD-APP-SDK.aspx#four。 - osgx
@osgx - 是的,我看过那个帖子。同时,nvcc手册明确提到了用于mingw和cygwin编译的标志。这表明,虽然没有官方支持,但可能有人已经成功了? - jmilloy
2
我使用了随ATI Stream SDK一起提供的导入库(但nVidia的那个应该也同样好用),并且在我的nVidia卡上没有任何问题。我还尝试了一些从某个苹果用户那里找到的动态加载器代码,手动加载所有函数,并用GetProcAddress替换了它所谓的东西。那也可以工作(尽管后来我认为过度灵活是愚蠢的,因为现在可以将OpenCL简单地作为要求)。至于CUDA-CL,我不知道,听说它类似于OpenCL,但我对CUDA毫无经验。 - Damon
显示剩余2条评论

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接