在 Visual Studio 2017 使用 CUDA 9.2


雖然 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"》中,是有人有提出可用的解法。

在安裝的部分,其流程如下:

  1. 下載完整的安裝版本(exe (local)),以目前的版本來說,檔名應該會是「cuda_9.2.88_win10.exe」(下載頁面

  2. 不要直接執行這個程式,而是將這個檔案用解壓縮軟體(例如 7-Zip)解壓縮到一個資料夾。

  3. 找到「\CUDAVisualStudioIntegration\CUDAVisualStudioIntegration.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 Corporation\Nsight\Nsight_${{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 Corporation\Nsight\NVIDIA_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 Corporation\Nsight\NVIDIA_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"/>

  4. 執行解壓縮出來的資料夾下的「setup.exe」來進行安裝。

    這邊安裝的步驟會和直接執行「cuda_9.2.88_win10.exe」一樣,不過理論上應該不會出錯了。

  5. 手動安裝「\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 Files\NVIDIA GPU Computing Toolkit\CUDA\v9.2\include\crt\host_config.h」這個檔案的第 131 行。

他本來的版本檢查是寫成:

#if _MSC_VER < 1600 || _MSC_VER > 1913

把它改成

#if _MSC_VER < 1600

這樣子,理論上就可以在 Visual Studio 2017 下面,使用 CUDA 9.2 了!

對「在 Visual Studio 2017 使用 CUDA 9.2」的想法

  1. 請問一下樓主如果我現在要安裝VS2017選擇幾版?
    9.1=>VS 2017 15.4.x
    9.2=>VS 2017 15.6.x
    您所說的怕出問題裝前一版要如何選擇?

  2. CUDA Toolkit 9.1開始是有支援VS 2017 沒錯,但支援的版號分別是9.1=>VS 2017 15.4.x、9.2=>VS 2017 15.6.x,猜Heresy大應該是現在最新的15.7.x; 怕之後以後出奇怪Bug找不出我還是裝前一版。每次都只支援到上一版這問題已經很久了,每次CUDA Toolkits 出新版這問題100%會出現在Dev Zone 的 Forum,Nvidia 也是大公司,不能跟微軟合作解決這問題嗎,用 VS 寫CUDA再佈署到linux的人也很多啊…

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google photo

您的留言將使用 Google 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.