雖然 Heresy 個人算是滿早期開始接觸 NVIDIA CUDA 的,但是其實已經沒有在碰 NVIDIA CUDA 程式好一段時間了…不過,由於在開發的專案裡面,還是有一些地方有用到別人寫的 CUDA 程式,所以在維護的時候,還是需要去考慮他。
而根據從以前到現在的經驗,NVIDIA 針對 Visual Studio 的支援,一向不是做得很快、很好;往往 Visual Studio 已經出了新版本了,CUDA 才終於支援上一個版本…
某方面來說,這應該也是由於 NVIDIA CUDA 的重點是高速計算、大部分這個領域的用戶,其實都是把程式放在 Linux 叢集上跑的關係吧?但是,這對於一般 Windows 的開發者來說,其實還滿麻煩的…
最近,Heresy 在把手邊的專案移植到 Visual Studio 2017 上,CUDA 又出現問題了… orz
首先,第一個碰到的問題,就是 CUDA 9.2 在 WIndows 上會因為「Visual Studio Integration」這個模組的關係,根本裝不起來!
而且,這個問題似乎和顯示卡驅動程式的版本有關,而且應該是從 CUDA 9.1 版就開始出現了,但是 NVIDIA 卻始終沒有修復他…(參考)
而儘管 NVIDIA 官方是在 Release Note 裡面號稱有支援 VIsual Studio 2017,但是就算手動把對應的檔案拿出來用,讓整個 Visual Studio 的 CUDA 建置環境完成,結果就算是官方範例,還是無法正確建置;而錯誤訊息,也是讓人頗為無奈的「不支援的 Visual Studio 版本」…
更無奈地,是他還貼心地列出他支援 2012、2013、2015 和 2017 呢…
(你前面告訴我不支援,後面又告訴我支援,是想幹嘛?)
至於解決方法呢? 目前在官方論壇的《CUDA 9.2: "NVIDIA Installer Failed"》中,是有人有提出可用的解法。
在安裝的部分,其流程如下:
-
下載完整的安裝版本(exe (local)),以目前的版本來說,檔名應該會是「cuda_9.2.88_win10.exe」(下載頁面)
-
不要直接執行這個程式,而是將這個檔案用解壓縮軟體(例如 7-Zip)解壓縮到一個資料夾。
-
找到「CUDAVisualStudioIntegrationCUDAVisualStudioIntegration.nvi」這個檔案,用純文字檔編輯器打開,並將 88 到 111 行的內容刪除。刪除的內容如下:
<custom phase="handleExistingNsight" action="HandleExistingNsight"/>
<custom phase="detectDisableCallHome" action="DetectDisableCallHome"/>
<msi platform="x86" phase="NsightMSINoTraffic" name="${{NsightMSI}}" condition="NsightMSIActionActiveAndNoTraffic" installText="Installing Nsight Visual Studio Edition">
<arg name="CUDAINSTALLER" value="true"/>
<arg name="DISABLE_NV_CH" value="1"/>
</msi>
<msi platform="x86" phase="NsightMSITraffic" name="${{NsightMSI}}" condition="NsightMSIActionActiveAndTraffic" installText="Installing Nsight Visual Studio Edition">
<arg name="CUDAINSTALLER" value="true"/>
<arg name="DISABLE_NV_CH" value="0"/>
</msi>
<confirm phase="Confirm-install" when="install" condition="NsightMSIActionActive">
<fileExists target="${{CommonAppData}}NVIDIA CorporationNsightNsight_${{nsightVersion}}_InstallSummary.xml"/>
</confirm>
<standard phase="copytemp" condition="NsightMSIActionActive">
<copyFile source="NVIDIA_Nsight_Visual_Studio_Edition_Win64_5.6.0.18099.msi" target="${{CommonAppData}}NVIDIA CorporationNsightNVIDIA_Nsight_Visual_Studio_Edition_Win64_5.6.0.18099.msi" /></standard>
<standard phase="createStartMenuStortcuts" condition="NsightMSIActionActive">
<createShortcutGroup location="startMenu" linkGroup="${{NsightProgramGroup}}"/>
<createShortcutLink location="startMenu" targetPath="${{CommonAppData}}NVIDIA CorporationNsightNVIDIA_Nsight_Visual_Studio_Edition_Win64_5.6.0.18099.msi" linkGroup="${{NsightProgramGroup}}" linkName="Nsight Redistributable"/>
</standard>
<custom phase="ParseWarningPage" action="ReadWarningPage" condition="NsightMSIActionActive"/><msi platform="x86" phase="NVTXMSI" name="${{NVTXMSI}}" installText="Installing NVTX"/>
-
執行解壓縮出來的資料夾下的「setup.exe」來進行安裝。
這邊安裝的步驟會和直接執行「cuda_9.2.88_win10.exe」一樣,不過理論上應該不會出錯了。 -
手動安裝「CUDAVisualStudioIntegration」資料夾下的「NVIDIA NVTX Installer.x86_64.Release.v1.21018621.Win64.msi」和「NVIDIA_Nsight_Visual_Studio_Edition_Win64_5.6.0.18099.msi」這兩個檔案。
理論上,這樣可以把 CUDA 9.2 SDK 成功安裝完成。
至於不能編譯的錯誤,則是要去修改「C:Program FilesNVIDIA GPU Computing ToolkitCUDAv9.2includecrthost_config.h」這個檔案的第 131 行。
他本來的版本檢查是寫成:
#if _MSC_VER < 1600 || _MSC_VER > 1913
把它改成
#if _MSC_VER < 1600
這樣子,理論上就可以在 Visual Studio 2017 下面,使用 CUDA 9.2 了!