如何在 ns3 中使用 nvcc 作为编译器
How to use nvcc as compiler in ns3
我尝试在 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 编译器的正确方法吗?
谢谢。
我还没有找到在 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 代码中的任何 public 函数
一点解释:
CXXFLAGS_EXTRA
和 LINKFLAGS_EXTRA
在 ns-3 的编译系统中添加编译标志。您需要同时添加您的 cuda 代码和 NVidia 的 cuda 库才能使用这些函数。
- 如果您使用任何其他库,也将它们放入
CXXFLAGS_EXTRA
和 LINKFLAGS_EXTRA
- 检查你系统中的cuda目录名。它可能不是你机器上的 lib64。
您的问题可能是 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 荒谬的严格测试。解决方法是 运行 "waf configure" 使用真正的 gcc,然后编辑 Waf 存储检测结果的文件,因此在构建步骤中 Waf 实际上会 运行 您的编译器而不是 gcc。您可以通过编辑 build/c4che/_cache.py 来完成此操作:将 CC 定义更改为编译器的完整路径。
我尝试在 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 编译器的正确方法吗?
谢谢。
我还没有找到在 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"
一点解释:
CXXFLAGS_EXTRA
和LINKFLAGS_EXTRA
在 ns-3 的编译系统中添加编译标志。您需要同时添加您的 cuda 代码和 NVidia 的 cuda 库才能使用这些函数。- 如果您使用任何其他库,也将它们放入
CXXFLAGS_EXTRA
和LINKFLAGS_EXTRA
- 检查你系统中的cuda目录名。它可能不是你机器上的 lib64。
您的问题可能是 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 荒谬的严格测试。解决方法是 运行 "waf configure" 使用真正的 gcc,然后编辑 Waf 存储检测结果的文件,因此在构建步骤中 Waf 实际上会 运行 您的编译器而不是 gcc。您可以通过编辑 build/c4che/_cache.py 来完成此操作:将 CC 定义更改为编译器的完整路径。