Windows中在VSCode/Cursor上通過CMake或launch文件配置CUDA編程環境

前置步驟

  • 安裝符合GPU型號的CUDA Toolkit
    • 配置好 nvcc 環境變量
  • 安裝 Visual Studio
    • 參考https://blog.csdn.net/Cony_14/article/details/137510909
  • VSCode 安裝插件
    • Nsight Visual Studio Code Edition
      • 注意:不是vscode-cudacpp。若兩個插件同時安裝,會導致語法功能異常。
  • 安裝 cmake 并配置好環境變量

:Windows 端筆者暫時沒找到直接在VSCode中直接調試的方法,不過在Visual Studio中可以。

方法一:配置tasks和launch文件

  • 文件-打開文件夾-選擇.cu文件所在目錄
  • 點開側邊欄運行與調試按鈕,點擊創建launch.json文件,選擇環境為CUDA C++(CUDA-GDB)
  • 文件夾根目錄下生成了一個.vscode目錄,里面生成了一個launch.json文件
  • 手動在.vscode目錄下創建tasks.json文件

tasks.json文件內容如下:

{"version": "2.0.0","tasks": [{"label": "mynvcc","type": "shell","command": "nvcc","args": ["-o","${fileDirname}\\${fileBasenameNoExtension}",//VSCode里的宏,如果不了解可用直接copy,以工作區為默認路徑"${file}"//源文件]//等同于nvcc -o /CodeDir/test test.cu}]
}

launch.json文件內容如下:

{"version": "0.2.0","configurations": [{"name": "CUDA C++: Launch","type": "cppvsdbg","request": "launch","program": "${fileDirname}\\${fileBasenameNoExtension}.exe","console": "externalTerminal", //使用外部終端,如果是vscode的終端會似乎會根據type設置的調用調試導致閃退"preLaunchTask": "mynvcc",},{"name": "CUDA C++: Attach","type": "cuda-gdb","request": "attach"}]
}
  • 我們只需要第一個CUDA C++: Launch
  • type
    • 需要選擇cppvsdbg。默認是cuda-gdb在Windows上貌似不適配。
  • program
    • 注意:需要.exe后綴
  • preLaunchTask
    • 在執行前先編譯
    • 填寫tasks.json中label的名稱

配置好后,即可直接在VSCode中運行CUDA代碼。

方法二、配置CMake文件

  • 文件-打開文件夾-選擇.cu文件所在目錄
  • 根目錄新建 CMakeLists.txt 文件

CMakeLists.txt文件內容如下:

cmake_minimum_required(VERSION 3.20)
project(cuda_test CUDA)
set(CMAKE_CUDA_STANDARD 17)
link_directories(${LIB_DIR})
add_executable(cuda_test test.cu)
set_target_properties(cuda_test PROPERTIESCUDA_SEPARABLE_COMPILATION ON)
  • projectadd_executable 中的cuda_test
    • 自定義的項目名稱
  • add_executable 中的test.cu
    • 即:需要編譯的CUDA代碼(需修改成自己的)

查詢編譯器

  • terminal中運行 cmake -B build -G
    • 會列出一系列生成器,復制自己安裝的版本,如"Visual Studio 16 2019"

編譯運行

  • 依次運行
    • cmake -B build -G "Visual Studio 16 2019"
    • cmake --build build
    • cd build\Debug
    • .\cuda_test.exe

步驟自動化

  • 在項目根目錄下創建文件build_and_run.bat
setlocal  REM 清理 build 目錄  
if exist build (  rmdir /s /q build  echo Cleaned up build directory.  
)  REM 創建 build 目錄  
mkdir build  
echo Created build directory.  REM 使用 CMake 進行配置  
cmake -B build -G "Visual Studio 16 2019"   
if ERRORLEVEL 1 (  echo CMake configuration failed.  exit /b %ERRORLEVEL%  
)  REM 構建項目  
cmake --build build  
if ERRORLEVEL 1 (  echo Build failed.  exit /b %ERRORLEVEL%  
)  REM 進入 Debug 目錄并運行測試  
cd build\Debug  
if ERRORLEVEL 1 (  echo Failed to enter Debug directory.  exit /b %ERRORLEVEL%  
)  REM 運行  
.\cuda_test.exe  endlocal  
  • 終端-運行任務-CMake生成
    • 自動在根目錄創建.vscode目錄及tasks.json文件
{  // See https://go.microsoft.com/fwlink/?LinkId=733558  // for the documentation about the tasks.json format  "version": "2.0.0",  "tasks": [  {  "label": "Build, Run and Clean CUDA Test",  "type": "shell",  "options": {  "cwd": "${workspaceFolder}"  // 確保命令在當前工作目錄中執行  },  "command": "cmd",  "args": [  "/c",  "build_and_run.bat"  // 調用合并的批處理腳本  ],  "problemMatcher": [],  "group": {  "kind": "build",  "isDefault": true  }  }  ]  
}  
  • 編譯并運行
    • 終端-運行任務-Build, Run and Clean CUDA Test
      • Build, Run and Clean CUDA Testtasks.json文件中的lable

Cursor

  • 配置方法與VSCode一致。
  • 在VSCode中已經配置好的項目,在Cursor中直接打開,可以用一樣的方法在"Terminal - Run Task" 中運行。

編譯過程中warning信息處理

  • 警告1:LINK : warning LNK4098: 默認庫"LIBCMT"與其他庫的使用沖突;請使用 /NODEFAULTLIB:library
    • 原因:
    • CUDA代碼可能使用了靜態多線程運行庫(LIBCMT),而項目其他部分使用了動態調試多線程運行庫(MDd)
    • 解決方案:
      1. CMakeLists.txt最后加上如下內容:
        if(MSVC) set_target_properties(cuda_test PROPERTIES LINK_FLAGS "/NODEFAULTLIB:LIBCMT /NODEFAULTLIB:MSVCRT") endif()

      2. 或CMakeLists.txt修改成如下內容:

cmake_minimum_required(VERSION 3.20)
project(cuda_test CUDA)set(CMAKE_CUDA_STANDARD 17)# 確保CUDA編譯器使用正確的運行時設置
string(APPEND CMAKE_CUDA_FLAGS " --use-local-env")
string(APPEND CMAKE_CUDA_FLAGS " -Xcompiler=\"/MDd\"")# 如果是Release模式則使用MD
if(CMAKE_BUILD_TYPE STREQUAL "Release")string(REPLACE "/MDd" "/MD" CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS}")
endif()link_directories(${LIB_DIR})add_executable(cuda_test test.cu)set_target_properties(cuda_test PROPERTIESCUDA_SEPARABLE_COMPILATION ON)# 顯式添加鏈接選項
if(MSVC)set_target_properties(cuda_test PROPERTIES LINK_FLAGS "/NODEFAULTLIB:LIBCMT /NODEFAULTLIB:MSVCRT")
endif()

參考文獻:

[1] windows下用vscode編譯并運行cuda程序 https://zhuanlan.zhihu.com/p/567996994
[2] CUDA 番外篇 | Visual Studio Code的CUDA環境https://zhuanlan.zhihu.com/p/508810115
[3] windows下使用vccode+cmake編譯cuda程序https://blog.csdn.net/threestooegs/article/details/135173376
[4] CUDA Programming in VS Code with CMake https://levelup.gitconnected.com/debugging-cuda-in-cmake-applications-on-vscode-with-ease-4a1990d77b18
[5] 如何應用 VS Code,CMake 和 Make 編譯 C ++ 代碼?https://zhuanlan.zhihu.com/p/354070726
[6] Debugging CUDA in CMake applications on VSCODE with easehttps://levelup.gitconnected.com/debugging-cuda-in-cmake-applications-on-vscode-with-ease-4a1990d77b18

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/71885.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/71885.shtml
英文地址,請注明出處:http://en.pswp.cn/web/71885.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spark(8)配置Hadoop集群環境-使用腳本命令實現集群文件同步

一.hadoop的運行模式 二.scp命令————基本使用 三.scp命令———拓展使用 四.rsync遠程同步 五.xsync腳本集群之間的同步 一.hadoop的運行模式 hadoop一共有如下三種運行方式: 1. 本地運行。數據存儲在linux本地,測試偶爾用一下。我們上一節課使用…

聚焦兩會:科技與發展并進,賽逸展2025成創新新舞臺

在十四屆全國人大三次會議和全國政協十四屆三次會議期間,代表委員們圍繞多個關鍵議題展開深入討論,為國家未來發展謀篇布局。其中,技術競爭加劇與經濟轉型需求成為兩會焦點,將在首都北京舉辦的2025第七屆亞洲消費電子技術貿易展&a…

【音視頻】ffmpeg命令提取像素格式

1、提取YUV數據 提取yuv數據,并保持分辨率與原視頻一致 使用-pix_fmt或-pixel_format指定yuv格式提取數據,并保持原來的分辨率 ffmpeg -i music.mp4 -t "01:00" -pixel_format yuv420p music.yuv提取成功后,可以使用ffplay指定y…

【從零開始學習計算機科學】計算機體系結構(二)指令級并行(ILP)

【從零開始學習計算機科學】【從零開始學習計算機科學】計算機體系結構(二)指令級并行(ILP) ILP流水線(pipeline)流水線調度循環展開和循環流水循環展開。循環展開的具體步驟可以描述為,軟件流水(循環流水)。我們可以通過流水線的思想處理循環的執行,即不需要這一次的…

android edittext 防止輸入多個小數點或負號

有些英文系統的輸入法,或者定制輸入法。使用xml限制不了輸入多個小數點和多個負號。所以代碼來控制。 一、通過XML設置限制 <EditTextandroid:id="@+id/editTextNumber"android:layout_width="wrap_content"android:layout_height="wrap_conten…

2019年藍橋杯第十屆CC++大學B組真題及代碼

目錄 1A&#xff1a;組隊&#xff08;填空5分_手算&#xff09; 2B&#xff1a;年號字符&#xff08;填空5分_進制&#xff09; 3C&#xff1a;數列求值&#xff08;填空10分_枚舉&#xff09; 4D&#xff1a;數的分解&#xff08;填空10分&#xff09; 5E&#xff1a;迷宮…

從C#中的MemberwiseClone()淺拷貝說起

MemberwiseClone() 是 C# 中的一個方法&#xff0c;用于創建當前對象的淺拷貝&#xff08;shallow copy&#xff09;。它屬于 System.Object 類&#xff0c;因此所有 C# 對象都可以調用該方法。 1. MemberwiseClone() 的含義 淺拷貝&#xff1a;MemberwiseClone() 會創建一個新…

筆記六:單鏈表鏈表介紹與模擬實現

在他一生中&#xff0c;從來沒有人能夠像你們這樣&#xff0c;以他的視角看待這個世界。 ---------《尋找天堂》 目錄 文章目錄 一、什么是鏈表&#xff1f; 二、為什么要使用鏈表&#xff1f; 三、 單鏈表介紹與使用 3.1 單鏈表 3.1.1 創建單鏈表節點 3.1.2 單鏈表的頭插、…

尚硅谷爬蟲note15n

1. 多條管道 多條管道開啟&#xff08;2步&#xff09;&#xff1a; (1)定義管道類 &#xff08;2&#xff09;在settings中開啟管道 在pipelines中&#xff1a; import urllib.request # 多條管道開啟 #(1)定義管道類 #&#xff08;2&#xff09;在setti…

oracle檢查字段為空

在Oracle數據庫中&#xff0c;檢查字段是否為空通常涉及到使用IS NULL條件。如果你想查詢某個表中的字段是否為空&#xff0c;你可以使用SELECT語句結合WHERE子句來實現。這里有一些基本示例來展示如何進行這樣的查詢。 示例1: 檢查單個字段是否為空 假設你有一個表employees…

虛幻基礎:動畫層接口

文章目錄 動畫層&#xff1a;動畫圖表中的函數接口&#xff1a;名字&#xff0c;沒有實現。動畫層接口&#xff1a;由動畫藍圖實現1.動畫層可直接調用實現功能2.動畫層接口必須安裝3.動畫層默認使用本身實現4.動畫層也可使用其他動畫藍圖實現&#xff0c;但必須在角色藍圖中關聯…

HarmonyOS學習第18天:多媒體功能全解析

一、開篇引入 在當今數字化時代&#xff0c;多媒體已經深度融入我們的日常生活。無論是在工作中通過視頻會議進行溝通協作&#xff0c;還是在學習時借助在線課程的音頻講解加深理解&#xff0c;亦或是在休閑時光用手機播放音樂放松身心、觀看視頻打發時間&#xff0c;多媒體功…

緒論數據結構基本概念(刷題筆記)

&#xff08;一&#xff09;單選題 1.與數據元素本身的形式、相對位置和個數無關的是&#xff08;B&#xff09;【廣東工業大學2019年829數據結構】 A.數據存儲結構 B.數據邏輯結構 C.算法 D.操作 2.在數據結構的討論中把數據結構從邏輯上分為&#xff08;C&#xff09;【中國…

GPTQ - 生成式預訓練 Transformer 的精確訓練后壓縮

GPTQ - 生成式預訓練 Transformer 的精確訓練后壓縮 flyfish 曾經是 https://github.com/AutoGPTQ/AutoGPTQ 現在是https://github.com/ModelCloud/GPTQModel 對應論文是 《Accurate Post-Training Quantization for Generative Pre-trained Transformers》 生成式預訓練Tr…

git的使用方法

文章目錄 前言git簡介GIT的基本操作克隆倉庫 (Clone)獲取最新代碼 (Pull)提交代碼到遠程倉庫查看當前分支查看提交代碼的日志git config 配置用戶信息 GIT的實操 前言 git是一種軟件版本管理工具&#xff0c;在多人團隊軟件開發中地方非常重要。 類似與SVN&#xff0c;git工具…

php虛擬站點提示No input file specified時的問題及權限處理方法

訪問站點&#xff0c;提示如下 No input file specified. 可能是文件權限有問題&#xff0c;也可能是“.user.ini”文件路徑沒有配置對&#xff0c;最簡單的辦法就是直接將它刪除掉&#xff0c;還有就是將它設置正確 #配置成自己服務器上正確的路徑 open_basedir/mnt/qiy/te…

使用Langflow和AstraDB構建AI助手:從架構設計到與NocoBase的集成

本文由 Leandro Martins 編寫&#xff0c;最初發布于 Building an AI Assistant with Langflow and AstraDB: From Architecture to Integration with NocoBase。 引言 本文的目標是演示如何創建一個集成了 NocoBase、LangFlow 和 VectorDB 工具的 AI 助手。作為基礎&#xf…

6.聊天室環境安裝 - Ubuntu22.04 - elasticsearch(es)的安裝和使用

目錄 介紹安裝安裝kibana安裝ES客戶端使用 介紹 Elasticsearch&#xff0c; 簡稱 ES&#xff0c;它是個開源分布式搜索引擎&#xff0c;它的特點有&#xff1a;分布式&#xff0c;零配置&#xff0c;自動發現&#xff0c;索引自動分片&#xff0c;索引副本機制&#xff0c;res…

SSL VXN

SSL VPN是采用SSL&#xff08;Security Socket Layer&#xff09;/TLS&#xff08;Transport Layer Security&#xff09;協議來實現遠程接入的一種輕量級VPN技術,其基于B/S架構&#xff0c;免于安裝客戶端&#xff0c;相較與IPSEC有更高的靈活度和管理性&#xff0c;當隧道建立…

【Qt】成員函數指針

一、成員函數指針的本質 與普通函數指針的區別&#xff1a; // 普通函數指針 void (*funcPtr)() &普通函數;// 成員函數指針 void (MyClass::*memberFuncPtr)() &MyClass::成員函數;? 綁定對象&#xff1a;成員函數指針必須與類的實例對象結合使用 ? 隱含 this 指…