如何在 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_EXTRA
和 LINKFLAGS_EXTRA
在 ns-3 的编译系统中添加编译标志。您需要添加您的 cuda 代码和 NVidia 的 cuda 库才能使用这些功能。
如果您使用了任何其他库,也将它们放入CXXFLAGS_EXTRA
和LINKFLAGS_EXTRA
检查系统中的 cuda 目录名称。你的机器上可能不是 lib64。
【讨论】:
以上是关于如何在 ns3 中使用 nvcc 作为编译器的主要内容,如果未能解决你的问题,请参考以下文章
是否可以在 Windows 中将 nvcc 与 gcc/g++ 集成?
如何将英特尔 C++ 编译器与 CUDA nvcc 一起使用?
如何在没有 nvcc 的情况下在编译时获取 CUDA 工具包版本?