1. 程式人生 > >編譯和除錯CUDA程式

編譯和除錯CUDA程式

編譯CUDA程式

平臺:vs2012+cuda 8.0
from:CUDA Toolkit document-Installation Guide Windows-Compiling CUDA Programs

1、建立新的專案:
新建專案-CUDA 8.0 Runtime

2、在現有專案中新增cuda程式碼
專案-屬性-生成自定義-勾選CUDA 8.0
專案-新增-新建項-NVIDIA CUDA 8.0-C/C++ FILE, 新增cuda檔案.cu

注意:最好每一次修改程式碼後,先清理,再編譯,否則編譯器可能會按照修改前的歷史檔案繼續之前的編譯,導致修改無效。

除錯CUDA程式

參考Nsight 的說明文件,開啟方式:VS選單欄-NSIGHT-help-local help

本地VS中聯合除錯CPU+GPU程式碼

在vs中,預設使用native debug,此時無法除錯cuda程式碼,提示“當前不會命中斷點。沒有與此行關聯的除錯程式的目的碼型別的可執行程式碼”

開兩個VS,主VS從VS主VS中通過NSIGHT-Star CUDA Debugging執行,事先在cuda程式碼中設定好breakpoint,此時程式執行到breakpoint;
從VS中工具-附加到程序,傳輸-選擇預設值,限定符-選擇本機使用者,可用程序-選擇主VS中執行的程式名,此時在從VS上的CPU程式碼中新增breakpoint即可。
該方法通過兩個程序,一個通過cuda debug執行,一個通過native debug執行,從而實現cpu、gpu程式碼的同時除錯。缺點是必須先執行cuda程式碼進入相應的breakpoint
這樣做的原因是,cuda debug和native debug在同一個VS程序中無法共存。

方法2:Nsight 的說明文件“Attach to a Running CUDA Process”一節

同樣需要開啟兩個vs,先執行native debug,後執行cuda debug。相對方法1要設定多幾個步驟:
)Nsight Monitor (右下角系統托盤) -Options-> CUDA -> Use this Monitor for CUDA attach ->true
)新增環境變數 NSIGHT_CUDA_DEBUGGER=1
)在第二個VS中設定附加到程序,傳輸選擇Nsight GPU Debugger,如果native debug的程序type顯示cuda且灰色,說明環境變數沒有設定成功;如果type沒有cuda,說明程序已經附加到Nsight GPU Debugger

新增環境變數的方法:
我的電腦屬性-高階設定-環境變數-新增使用者變數”NSIGHT_CUDA_DEBUGGER”,設定值為1-重啟VS。
但這樣設定的環境變數是全域性有效的,會導致每次debug cuda程式碼都呼叫NSIGHT,影響cuda執行的效率。
嘗試將環境變數設定為本程序有效,在vs中設定環境變數。
注意:通過vs的props檔案或者user檔案設定環境變數是不行的,因為這樣只能設定生成(build)環境的環境變數,而cuda debug需要執行時的環境變數。
vs中設定除錯的環境變數,專案屬性-配置屬性-除錯-環境,新增$(NSIGHT_CUDA_DEBUGGER),不成功,附加到程序時依然顯示灰色,只能採用系統新增環境變數的方法。

雙機聯調,官方文件中有說明