2016-03-05 116 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定義改爲編譯器的完整路徑。