2016-03-05 121 views
2

我想在NS3使用CUDA,但是当我试图运行CXX="nvcc" ./waf configure,它在屏幕上显示以下信息使用NVCC为编译器。日志,它说以下内容:如何NS3

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编译器的正确方法吗?

谢谢。

回答

0

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

  1. 让你的CUDA代码静态库: ar rcs libcudacode.a a.o b.o c.o(你需要做的* .o文件首先使用G ++,NVCC,或其他任何你想要在/your/lib/folder/
  2. 放libcudacode.a,把你的CUDA代码/your/src/folder
  3. 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
  4. ./waf

你的代码现在应该编译。您可以通过#including "corresponding_header.h"

访问您的CUDA代码的任何公共职能的一点点解释:

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

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

确认身份的代码是https://waf.io/apidocs/_modules/waflib/Tools/c_config.html#get_cc_version

所以,如果你没有一个编译器试图看起来像一个支持的,看起来你应该写你自己的Waf工具。

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