如何在 ns3 中使用 nvcc 作为编译器

Posted

技术标签:

【中文标题】如何在 ns3 中使用 nvcc 作为编译器【英文标题】:How to use nvcc as compiler in ns3 【发布时间】:2016-03-05 01:18:50 【问题描述】:

我正在尝试在 ns3 中使用 cuda,但是当我尝试运行 CXX="nvcc" ./waf configure 时,它在屏幕上显示以下消息:

Checking for 'g++' (C++ compiler)        : not found 
Checking for 'clang++' (C++ compiler)    : not found 
Checking for 'icpc' (C++ compiler)       : not found 
could not configure a C++ compiler!
(complete log in /home/kelu/workspace/ns-3.24/build/config.log)

我检查了 config.log,它显示如下:

Checking for 'g++' (C++ compiler)
find program='nvcc' paths=['/usr/local/sbin', '/usr/local/bin', '/usr/sbin', '/usr/bin', '/sbin', '/bin', '/usr/local/cuda/bin'] var='CXX' -> ['nvcc']
from /home/kelu/workspace/ns-3.24: Could not determine the compiler type
not found
----------------------------------------
Checking for 'clang++' (C++ compiler)
find program='nvcc' paths=['/usr/local/sbin', '/usr/local/bin', '/usr/sbin', '/usr/bin', '/sbin', '/bin', '/usr/local/cuda/bin'] var='CXX' -> ['nvcc']
from /home/kelu/workspace/ns-3.24: Not clang/clang++
not found
----------------------------------------
Checking for 'icpc' (C++ compiler)
find program='nvcc' paths=['/usr/local/sbin', '/usr/local/bin', '/usr/sbin', '/usr/bin', '/sbin', '/bin', '/usr/local/cuda/bin'] var='CXX' -> ['nvcc']
from /home/kelu/workspace/ns-3.24: Not icc/icpc
not found
from /home/kelu/workspace/ns-3.24: could not configure a C++ compiler!

nvcc 位于 /usr/local/cuda/bin,在路径中。但在我看来,ns3的构建脚本并没有将nvcc解析为编译器。

谁能告诉我在ns3中使nvcc成为CXX编译器的正确方法?

谢谢。

【问题讨论】:

【参考方案1】:

您的问题可能是 Waf 实际上检查编译器的内置 #defines 以检查调用为“gcc”的编译器是否实际上是 gcc。举个具体的例子,如果它检测到编译器是 Intel 的 icc(因为它是 #defined __INTEL_COMPILER)但被“gcc”命令行调用,它将出错!

进行识别的代码位于https://waf.io/apidocs/_modules/waflib/Tools/c_config.html#get_cc_version。

因此,如果您没有尝试hard 看起来像受支持的编译器之一,那么您应该编写自己的 Waf 工具。

但是,您可以尝试破解。例如,假设您的编译器与 gcc 足够兼容,但仍然无法通过 Waf 荒谬的严格测试。修复方法是使用真正的 gcc 运行“waf configure”,然后编辑 Waf 存储检测结果的文件,因此在构建步骤中,Waf 将实际运行您的编译器而不是 gcc。您可以通过编辑 build/c4che/_cache.py 来做到这一点:将 CC 定义更改为编译器的完整路径。

【讨论】:

【参考方案2】:

我还没有找到在 ns-3 中使用 nvcc 的方法,但我确实找到了解决这个问题的方法。我很高兴在这里分享我的解决方案以帮助他人:

    使您的 cuda 代码成为静态库: ar rcs libcudacode.a a.o b.o c.o(您需要先使用 g++、nvcc 或其他任何您想要的工具制作 *.o 文件) 将 libcudacode.a 放入 /your/lib/folder/ 并将您的 cuda 代码放入 /your/src/folder 将 lib 文件夹和 src 文件夹添加到 waf 中: CXXFLAGS_EXTRA="-I/your/src/folder -I/your/cuda/dir/include" LINKFLAGS_EXTRA="-L/your/lib/folder -L/your/cuda/dir/lib64 -lcudacode -lcudart" ./waf configure./waf

现在应该编译您的代码。你可以通过#including "corresponding_header.h"访问你的cuda代码中的任何公共函数

一点解释:

    CXXFLAGS_EXTRALINKFLAGS_EXTRA 在 ns-3 的编译系统中添加编译标志。您需要添加您的 cuda 代码和 NVidia 的 cuda 库才能使用这些功能。 如果您使用了任何其他库,也将它们放入CXXFLAGS_EXTRALINKFLAGS_EXTRA 检查系统中的 cuda 目录名称。你的机器上可能不是 lib64。

【讨论】:

以上是关于如何在 ns3 中使用 nvcc 作为编译器的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 Windows 中将 nvcc 与 gcc/g++ 集成?

如何将编译器标志从 clang 传递给 nvcc

如何将英特尔 C++ 编译器与 CUDA nvcc 一起使用?

如何在没有 nvcc 的情况下在编译时获取 CUDA 工具包版本?

如何将 cuda-gdb 与使用 nvcc 编译的静态库的 g++ 链接程序一起使用?

CUDA nvcc慢主机代码