鉄火巻キのメモ書き

ただのメモ代わり

Windows + VSCodeでCUDAの環境構築

結論から言って現状(2022/9)ほぼ不可能です. 一応ビルドまでは通せないこともないので順を追って説明します. 回避策としてVisual Stuidioでの環境構築も説明します.

ほかにもWSL2を使うなどしてWindowsでCUDAの開発を行う方法はあります.気が向いたら書くかも.

(追記)WSLもダメっぽい...?

forums.developer.nvidia.com

素のWindows環境

公式やいろんなところが説明しているようにVisual Studioで開発するのが手っ取り早い().

最初に述べたように完全な環境をVSCodeで整えるのは無理ですが,できるとこまで説明します.ここでいう完全な環境とはビルドからデバッグまでできることを指します.別にVSCodeでもコード補完やビルド,実行まではできます.ただ デバッグができません . これは公式にそう書いてあります.正確に言うとwindows用のデバッガは存在するけれどもVSCode拡張機能が対応していません.

それでも解決方法があるという方は教えてください...

VSCodeで環境構築する

ツール類の導入

VSCodeC/C++の環境ができている前提で進めます. まずは拡張機能として Nsight Visual Studio Code Edition を入れます. これはCUDAのコード補完やなんやかんやをしてくれます.ここでデバッガの設定もできるのですが Linux専用機能 です.

そんでもってCUDA Toolkitをインストールします.私はTensorflowもpytorchも使う予定がなかったので最新verを入れました.そこらへんは用途に合わせて入れてください.ただし,Visual Studioでの開発予定があるのであればVisual Studioを先にインストールしてください.そうしないとVisual Studioで開発するためのプラグインがインストールされません.Visual Studioでの開発予定がなくとも後述の通りVisual Studioが必要となるので入れる順番は合わせた方がよいでしょう.

CUDAを入れたらコンパイラにパスを通します.おそらくインストール時にデフォでパスが通っているでしょうが確認しておいた方がよいでしょう.CUDAのコンパイラC:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\[バージョン]\bin にある nvcc.exe です.まだ通すべきパスがあるのでここで再起動はしなくていいです.

最後に必要となるのは Visual Studio です.わざわざVisual Studioでの開発を回避してまでVSCodeにしたのに何故...?となりますが,理由はmsvcコンパイラが欲しいからです.WindowsでのCUDAがサポートしているC/C++コンパイラここに書いてあります. 例えばCUDA Toolkit v11.7.1であればサポートは以下です.

CUDAがサポートするコンパイラ
見事にmsvcコンパイラしかありません.無論サポート対象外のコンパイラコンパイルしてもできないことは無いですがおとなしく対象のを使うのが無難でしょう.( -ccbin, -allow-unsupported-compiler 等のオプションでググるとよい)
msvcコンパイラをインストールしたらこちらにもパスを通します.こっちのパスは勝手に設定されることはないはずなのでちゃんと設定します.msvcは C:\Program Files\Microsoft Visual Studio\[西暦]\Community\VC\Tools\MSVC\[バージョン]\bin\Hostx64\x64 にある cl.exe です.

これでPCを再起動してnvcc, clのコマンドが通れば環境の構築は終了です.

プロジェクトの設定

環境の構築が終わったらプロジェクトを用意して実際に動かしてみます.

適当にmain.cuとかいうファイルを生成してこれをビルドします.

まずはc_cpp_properties.jsonの設定です.ここはとりあえず"compilerPath"C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/[バージョン]/bin/nvcc.exeにします.あとはお好みでいいでしょう.

 {
    "configurations": [
        {
            "name": "Win32",
            "includePath": [
                "${workspaceFolder}/**",
                "C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.7/include"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE"
            ],
            "compilerPath": "C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.7/bin/nvcc.exe",
            "cStandard": "c17",
            "cppStandard": "c++20",
            "intelliSenseMode": "windows-msvc-x64"
        }
    ],
    "version": 4
}

次にtask.jsonです.自分は以下のようにビルドだけのタスクとビルド&実行のタスクを用意しています.

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "C/C++: nvcc.exe アクティブなファイルのビルド",
            "type": "shell",
            "command": "nvcc",
            "args": [
                "-g",
                "${file}",
                "-o",
                "${fileDirname}/${workspaceFolderBasename}.exe"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
     },
        {
            "label": "C/C++: nvcc.exe アクティブなファイルのビルドと実行",
            "type": "shell",
            "command": "${fileDirname}/${workspaceFolderBasename}.exe",
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "dependsOn": [
                "C/C++: nvcc.exe アクティブなファイルのビルド"
            ]
        }
    ]
}

そしてlaunch.jsonなのですが...要りません.最初に入れた拡張機能のおかげで"CUDA C++: Launch"という設定が可能なのですが,これの"type"である"cuda-gdb"は最初に述べたようにLinux環境でしか動きません.
試しに公式にのっとって以下のようにファイルに記述して実行してみてください.「Linuxでしか使えません」と怒られます.

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "CUDA C++: Launch",
            "type": "cuda-gdb",
            "request": "launch",
            "program": "${fileDirname}/${workspaceFolderBasename}.exe",
            "preLaunchTask": "C/C++: nvcc.exe アクティブなファイルのビルド"
        }
    ]
}

というわけでlaunch,jsonはなしでプロジェクトの設定は完了です.あとはビルドが通るようなコードを書いてCTRL+SHIFT+Bを押してtask.jsonに記述したビルドまたはビルドと実行をして無事ビルドが通ればおしまいです.

以下はどうしてもWindowsでデバッガまで回したいという人向けにVisual Studioでの構築を説明します.

Visual Studioで環境構築する

公式的にwindowsでサポートされているやり方.

先述の通りCUDA Toolkitよりも先に対応のVisual Sutudioがインストールされている必要があります.もし順番を間違えてしまったらそのままCUDA Toolkitを再インストールしてPCを再起動しましょう.

CUDA Toolkitインストール後最初のVisual Studio起動時に以下のポップアップが出るのでEnableします.

そうしたら適当にテストプロジェクトを作ります.C/C++だったら大体なんでもいいと思います. ここではWindowsコンソールアプリケーションで説明します.

まずビルドのカスタマイズを行います.プロジェクト->ビルドのカスタマイズを選択し,CUDAにチェックを入れます.

もし一覧にCUDAが無いようであれば C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA[バージョン]\extras\visual_studio_integration\MSBuildExtensions 下のファイルを C:\Program Files\Microsoft Visual Studio[西暦]\Community\MSBuild\Microsoft\VC[バージョン]\BuildCustomizations にすべてコピーして一覧の更新を行います. そして新規ファイルの追加でCUDAソースファイルを追加します.これはまっさらなファイルで生成されます.ここでプロジェクトプロパティに CUDA C/C++ の項目が追加されていればOKです.無いようであればVisual Studioの再起動などを試してみてください.

次にプロジェクトの設定をしていきます.
プロジェクトのプロパティを開き, C/C++->全般->追加のインクルードディレクトCUDA C/C++->Common->Additional Include Directries$(CUDA_INC_PATH) を追加. リンカー->全般->追加のライブラリディレクト$(CUDA_PATH)/lib/$(PlatformName) 追加.リンカー->入力->追加の依存ファイルcudart.lib を追加します.
これで適当な.cuファイルにmain関数をぶち込んでビルド&デバッグができれば設定は終わりです.

ただこのままだとCUDAのライブラリ関数や構文にエラーが付きます.ビルドは問題ないので実用に支障はありませんが,どうしても気になるという人は明示的に #include<cuda_runtime.h> など適宜ヘッダをインクルードすればエラーを消せます.(<<<のsyntax errorは消せない?)

総評

色々面倒なのでLinux環境を使うべし