91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何使用CMake工具套件構(gòu)建CUDA應(yīng)用程序

星星科技指導(dǎo)員 ? 來(lái)源:NVIDIA ? 作者:wnger ? 2022-04-01 17:42 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

跨平臺(tái)軟件開發(fā)對(duì)應(yīng)用程序的構(gòu)建過(guò)程提出了許多挑戰(zhàn)。如何針對(duì)多個(gè)平臺(tái)而不維護(hù)多個(gè)平臺(tái)特定的構(gòu)建腳本、項(xiàng)目或生成文件?如果您需要構(gòu)建 CUDA 代碼作為過(guò)程的一部分呢? CMake 是一個(gè)開源、跨平臺(tái)的工具系列,旨在跨不同平臺(tái)構(gòu)建、測(cè)試和打包軟件。許多開發(fā)人員使用 CMake 來(lái)使用簡(jiǎn)單的獨(dú)立于平臺(tái)和編譯器的配置文件來(lái)控制他們的軟件編譯過(guò)程。 CMake 生成可在您選擇的編譯器環(huán)境中使用的本機(jī) makefile 和工作區(qū)。 CMake 工具套件是由 Kitware 創(chuàng)建的,是為了響應(yīng)對(duì) ITK 和 VTK 等開源項(xiàng)目的強(qiáng)大、跨平臺(tái)構(gòu)建環(huán)境的需求。

圖 1 。 CGED 將 CUDA C ++添加到支持的編程語(yǔ)言的長(zhǎng)列表中。

在這篇文章中,我想向您展示使用 cmake3 . 8 +( 3 . 9 支持 MSVC )的特性來(lái)構(gòu)建 CUDA 應(yīng)用程序是多么容易。從 2009 年起, CMake (從 2 . 8 . 0 開始)就提供了通過(guò) Find CUDA 包提供的cuda_add_executablecuda_add_library等自定義命令編譯 CUDA 代碼的能力。 CGEASE 3 . 8 使 CUDA C ++成為一種本質(zhì)上支持的語(yǔ)言。 CUDA 現(xiàn)在加入了 CMake 支持的各種語(yǔ)言、平臺(tái)、編譯器和 ide ,如圖 1 所示。

CMake 中的一個(gè) CUDA 示例

讓我們從一個(gè)用 CMake 構(gòu)建 CUDA 的例子開始。清單 1 顯示了名為“ particles ”的 CUDA 示例的 CMake 文件。我已經(jīng)在 Github 上提供了此示例的完整代碼。

cmake_minimum_required(VERSION 3.8 FATAL_ERROR)

project(cmake_and_cuda LANGUAGES CXX CUDA)



include(CTest)



add_library(particles STATIC

  randomize.cpp

  randomize.h

  particle.cu

  particle.h

  v3.cu

  v3.h

  )



# Request that particles be built with -std=c++11

# As this is a public compile feature anything that links to

# particles will also build with -std=c++11

target_compile_features(particles PUBLIC cxx_std_11)



# We need to explicitly state that we need all CUDA files in the

# particle library to be built with -dc as the member functions

# could be called by other libraries and executables

set_target_properties( particles

                       PROPERTIES CUDA_SEPARABLE_COMPILATION ON)



add_executable(particle_test test.cu)



set_property(TARGET particle_test

             PROPERTY CUDA_SEPARABLE_COMPILATION ON)

target_link_libraries(particle_test PRIVATE particles)



if(APPLE)

  # We need to add the path to the driver (libcuda.dylib) as an rpath,

  # so that the static cuda runtime can find it at runtime.

  set_property(TARGET particle_test

               PROPERTY

               BUILD_RPATH ${CMAKE_CUDA_IMPLICIT_LINK_DIRECTORIES})

endif()

在我完成清單 1 所示的所有邏輯和特性之前,讓我們先跳過(guò)構(gòu)建。如果您使用 VisualStudio ,則需要使用 CGuess 3 . 9 和 VisualStudio CUDA 構(gòu)建擴(kuò)展(包含在 CUDA 工具包中),否則您可以使用生成文件生成器(或忍者生成器)nvcc( NVIDIA CUDA 編譯器)和 C ++編譯器在您的路徑中使用 CMASE 3 . 8 或更高。(或者,您可以將CUDACXXCXX環(huán)境變量分別設(shè)置為nvcc和 C ++編譯器的路徑)。

minus.png
Y您可以使用CUDAHOSTCXX環(huán)境變量顯式指定與NVCC一起使用的主機(jī)編譯器。(這將控制NVCC-ccbin選項(xiàng)。)

Figure 2. Building a static library and executable which uses CUDA and C++ with CMake and the Makefile generator.

圖 2 。構(gòu)建一個(gè)靜態(tài)庫(kù)和可執(zhí)行文件,它使用 CUDA 和 C ++與 CMake 和 Mag 文件生成器。

為了配置 CMake 項(xiàng)目并生成一個(gè) makefile ,我使用了以下命令

cmake -DCMAKE_CUDA_FLAGS=”-arch=sm_30” .

圖 1 顯示了輸出。 CMADE 自動(dòng)發(fā)現(xiàn)并驗(yàn)證 C ++和 CUDA 編譯器并生成一個(gè) MaMaFrimeProject 。注意,參數(shù)-DCMAKE_CUDA_FLAGS="-arch=sm_30"-arch=sm_30傳遞給nvcc,告訴它以我計(jì)算機(jī)中的開普勒體系結(jié)構(gòu)( SM _ 30 或 ComputeCapability 3 . 0 ) GPU 為目標(biāo)。

接下來(lái),圖 1 顯示了我如何使用命令make -j4調(diào)用構(gòu)建。這運(yùn)行了make多個(gè)線程,因此它并行編譯 C ++和 CUDA 源文件。有關(guān) CMake 如何確定在項(xiàng)目中的何處查找并行性的更多信息,請(qǐng)閱讀““用你所有的核心來(lái)建設(shè)”。 CMake 還可以自動(dòng)管理將多種語(yǔ)言構(gòu)建和鏈接到可執(zhí)行文件或共享庫(kù)中。

啟用 CUDA

讓我們深入研究 CMake 代碼并研究不同的組件。和往常一樣,根 CMake 文件中的第一個(gè)命令應(yīng)該是cmake_minimum_required,它斷言 CMake 版本足夠新,并確保 CMake 可以確定當(dāng)用戶運(yùn)行的 CMake 版本比需要的版本更新時(shí),它需要保留哪些向后兼容性。

minus.png
通過(guò)將– CUDA rt { none |共享|靜態(tài)}設(shè)置為– CUDA rt { none |共享|靜態(tài)},可以指定所有 CUDA 目標(biāo)將在項(xiàng)目?jī)?nèi)部使用的運(yùn)行時(shí)。例如,要使用靜態(tài) CUDA 運(yùn)行時(shí)庫(kù),請(qǐng)將其設(shè)置為– CUDA rt 靜態(tài)。

接下來(lái),第 2 行是 Project 命令,它設(shè)置項(xiàng)目名稱(cmake_and_cuda)并定義所需語(yǔ)言( C ++和 CUDA )。這使 CMake 能夠識(shí)別和驗(yàn)證所需的編譯器,并緩存結(jié)果。這將生成圖 3 所示的公共緩存語(yǔ)言標(biāo)志。

圖 3 。當(dāng)啟用 CUDA 時(shí), CMake 為每個(gè)配置提供默認(rèn)標(biāo)志(調(diào)試、發(fā)布、 RelWithDebInfo 和 MinSizeRel)

既然 CMake 已經(jīng)確定了項(xiàng)目需要什么語(yǔ)言,并且配置了它的內(nèi)部基礎(chǔ)設(shè)施,我們就可以繼續(xù)編寫一些真正的 CMake 代碼了。

用 CMake 建立圖書館

學(xué)習(xí) CMake 時(shí),每個(gè)人做的第一件事就是編寫一個(gè)生成單個(gè)可執(zhí)行文件的玩具示例就像這個(gè)。讓我們更大膽一點(diǎn),并生成一個(gè)可執(zhí)行文件使用的靜態(tài)庫(kù)。

使用要求是現(xiàn)代 CMake 的核心。 include 目錄、編譯器定義和編譯器選項(xiàng)等信息可以與目標(biāo)相關(guān)聯(lián),這樣這些信息就可以通過(guò)target_link_libraries自動(dòng)傳播給使用者。在 CMake 的早期版本中,構(gòu)建 CUDA 代碼需要命令,比如cuda_add_library。不幸的是,這些命令無(wú)法參與使用需求,因此無(wú)法使用傳播的編譯器標(biāo)志或定義。 CMake 中現(xiàn)在對(duì) CUDA 的內(nèi)在支持使使用 CUDA 的目標(biāo)能夠充分利用現(xiàn)代 CMake 使用需求,并為所有語(yǔ)言提供統(tǒng)一的 CMake 語(yǔ)法。

C ++語(yǔ)言層

在一個(gè)項(xiàng)目中,首先要配置的事情之一是 C ++語(yǔ)言級(jí)別( 98 , 11 , 14 , 17 …)。 CGuSE 3 . 1 介紹了為整個(gè)項(xiàng)目或基于每個(gè)目標(biāo)的基礎(chǔ)來(lái)設(shè)置 C ++語(yǔ)言級(jí)別的能力。還可以控制 CUDA 編譯的 C ++語(yǔ)言級(jí)別。

您可以通過(guò)CMAKE_CUDA_STANDARDtarget_compile_features命令輕松地要求特定版本的 CUDA 編譯器。為了使target_compile_features更容易與 CUDA 一起使用, CMake 使用了 CUDA C ++的同一組 C ++特征關(guān)鍵字。下面的代碼展示了如何請(qǐng)求 C ++ 11 對(duì)particles目標(biāo)的支持,這意味著粒子目標(biāo)所使用的任何 CUDA 文件都會(huì)被 CUDA C ++ 11 啟用(--std=c++11參數(shù)]nvcc]編譯。

# Request that particles be built with --std=c++11

# As this is a public compile feature anything that links to particles

# will also build with -std=c++11

target_compile_features(particles PUBLIC cxx_std_11)

啟用位置無(wú)關(guān)代碼

在處理大型項(xiàng)目時(shí),通常會(huì)生成一個(gè)或多個(gè)共享庫(kù)。作為共享庫(kù)一部分的每個(gè)對(duì)象文件通常都需要在啟用位置獨(dú)立代碼的情況下進(jìn)行編譯,這是通過(guò)設(shè)置fPIC編譯器標(biāo)志來(lái)完成的。不幸的是,并非所有編譯器都支持fPIC,因此 CMake 在構(gòu)建共享庫(kù)時(shí)自動(dòng)啟用位置無(wú)關(guān)的代碼,從而避免了這個(gè)問(wèn)題。對(duì)于將鏈接到共享庫(kù)的靜態(tài)庫(kù),需要通過(guò)如下設(shè)置POSITION_INDEPENDENT_CODEtarget 屬性顯式地啟用位置無(wú)關(guān)的代碼。

set_target_properties(particles PROPERTIES POSITION_INDEPENDENT_CODE ON)

CMake 3 . 8 支持 CUDA 編譯的POSITION_INDEPENDENT_CODE屬性,并在請(qǐng)求時(shí)構(gòu)建所有可重新定位的主機(jī)端代碼。對(duì)于那些希望在跨平臺(tái)項(xiàng)目或內(nèi)部共享庫(kù)中使用 CUDA 的項(xiàng)目,或者希望支持深?yuàn)W的 C ++編譯器的項(xiàng)目,這是一個(gè)好消息。

可分離匯編

默認(rèn)情況下, CUDA 編譯器使用整個(gè)程序編譯。實(shí)際上,這意味著所有設(shè)備函數(shù)和變量都需要位于單個(gè)文件或編譯單元中。單獨(dú)編譯和鏈接是在 CUDA 5 . 0 中引入的,它允許將 CUDA 程序的組件編譯成單獨(dú)的對(duì)象。為了使其正常工作,任何使用可分離編譯的庫(kù)或可執(zhí)行文件都有兩個(gè)鏈接階段。首先它必須為包含 CUDA 設(shè)備代碼的所有對(duì)象執(zhí)行設(shè)備鏈接,然后必須執(zhí)行主機(jī)端鏈接,包括上一個(gè)鏈接階段的結(jié)果。

可分離編譯不僅允許項(xiàng)目維護(hù)一個(gè)代碼結(jié)構(gòu),其中獨(dú)立的函數(shù)被保存在不同的位置,它還有助于提高增量構(gòu)建性能(所有基于 CMake 的項(xiàng)目的一個(gè)特性)。增量構(gòu)建只允許重新編譯和鏈接已修改的單元,這減少了構(gòu)建時(shí)間??煞蛛x編譯的主要缺點(diǎn)是,對(duì)于駐留在不同編譯位中的函數(shù)的調(diào)用,某些函數(shù)調(diào)用優(yōu)化被禁用,因?yàn)榫幾g器不知道被調(diào)用函數(shù)的詳細(xì)信息。

CMake 現(xiàn)在基本上理解了獨(dú)立編譯和設(shè)備鏈接的概念。隱式地, CMake 會(huì)盡可能長(zhǎng)時(shí)間地延遲 CUDA 代碼的設(shè)備鏈接,因此,如果您使用可重定位的 CUDA 代碼生成靜態(tài)庫(kù),則設(shè)備鏈接將被推遲,直到靜態(tài)庫(kù)鏈接到共享庫(kù)或可執(zhí)行文件。這是一個(gè)顯著的改進(jìn),因?yàn)楝F(xiàn)在可以將 CUDA 代碼組合到多個(gè)靜態(tài)庫(kù)中,這在 CMake 中以前是不可能的。要控制 CMake 中的可分離編譯,請(qǐng)按如下方式打開目標(biāo)的CUDA_SEPARABLE_COMPILATION屬性。

set_target_properties(particles PROPERTIES CUDA_SEPARABLE_COMPILATION ON)

info.png 高級(jí)提示
minus.png
如果需要在共享庫(kù)或可執(zhí)行文件使用之前發(fā)生可分離編譯設(shè)備鏈接,則可以通過(guò)設(shè)置 target 屬性CUDA_RESOLVE_DEVICE_SYMBOLS顯式請(qǐng)求 CMake 調(diào)用設(shè)備鏈接。

PTX 生成

如果要將 PTX 文件打包用于加載時(shí) JIT 編譯,而不是將 CUDA 代碼編譯到庫(kù)或可執(zhí)行文件的集合中,則可以啟用CUDA_PTX_COMPILATION屬性,如下例所示。本例將一些.cu文件編譯為 PTX ,然后指定安裝位置。

add_library(CudaPTX OBJECT kernelA.cu kernelB.cu)

set_property(TARGET CudaPTX PROPERTY CUDA_PTX_COMPILATION ON)



install(TARGETS CudaPTX

   OBJECTS DESTINATION bin/ptx

)

為了使 PTX 生成成為可能,對(duì) CMake 進(jìn)行了擴(kuò)展,以便所有對(duì)象庫(kù)都能夠在生成器表達(dá)式中安裝、導(dǎo)出、導(dǎo)入和引用。這也使得 PTX 文件能夠被 bin2c 等工具轉(zhuǎn)換或處理,然后作為 C 字符串嵌入到庫(kù)或可執(zhí)行文件中。這是一個(gè)基本的例子

審核編輯:郭婷

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4968

    瀏覽量

    73960
  • 應(yīng)用程序
    +關(guān)注

    關(guān)注

    38

    文章

    3344

    瀏覽量

    60253
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    借助NVIDIA CUDA Tile IR后端推進(jìn)OpenAI Triton的GPU編程

    NVIDIA CUDA Tile 是基于 GPU 的編程模型,其設(shè)計(jì)目標(biāo)是為 NVIDIA Tensor Cores 提供可移植性,從而釋放 GPU 的極限性能。CUDA Tile 的一大優(yōu)勢(shì)是允許開發(fā)者基于其構(gòu)建自定義的 DS
    的頭像 發(fā)表于 02-10 10:31 ?240次閱讀

    如何在NVIDIA CUDA Tile中編寫高性能矩陣乘法

    本博文是系列課程的一部分,旨在幫助開發(fā)者學(xué)習(xí) NVIDIA CUDA Tile 編程,掌握構(gòu)建高性能 GPU 內(nèi)核的方法,并以矩陣乘法作為核心示例。
    的頭像 發(fā)表于 01-22 16:43 ?4821次閱讀
    如何在NVIDIA <b class='flag-5'>CUDA</b> Tile中編寫高性能矩陣乘法

    電子工程師必備:LMR TK-400/400 - 75EZ - HC工具套件解析

    電子工程師必備:LMR TK-400/400 - 75EZ - HC工具套件解析 在電子工程領(lǐng)域,尤其是在現(xiàn)場(chǎng)作業(yè)時(shí),找到合適的工具、確保工具齊全以及方便取用一直是個(gè)難題。今天就來(lái)給大
    的頭像 發(fā)表于 12-11 14:05 ?1419次閱讀

    使用vscode和cmake工具開發(fā)極海G32R501 MCU

    目前極海官方提供的 IDE 開發(fā)環(huán)境有 Keil/IAR/Eclipse。都能很好的完成開發(fā),但是 VS Code 配合 CMake 工具是更加“現(xiàn)代”的C/C++開發(fā)環(huán)境,本文提供了在 VS Code 環(huán)境下的開發(fā)經(jīng)驗(yàn),以供參考。
    的頭像 發(fā)表于 11-25 14:45 ?3114次閱讀
    使用vscode和<b class='flag-5'>cmake</b><b class='flag-5'>工具</b>開發(fā)極海G32R501 MCU

    PYQT 應(yīng)用程序框架及開發(fā)工具

    大家好,本團(tuán)隊(duì)此次分享的內(nèi)容為開發(fā)過(guò)程中使用到的PYQT 應(yīng)用程序框架及開發(fā)工具。 pYqt 是一個(gè)多平臺(tái)的 python 圖形用戶界面應(yīng)用程序框架,由于其面向?qū)ο蟆? 易擴(kuò)展(可實(shí)現(xiàn)組件編程等
    發(fā)表于 10-29 07:15

    【CPKCOR-RA8D1】1、VSCODE+CMAKE開發(fā)環(huán)境搭建

    Smart Configurator是一款自動(dòng)生成微控制器初始配置程序工具。通過(guò)本工具提供的基礎(chǔ)管腳配置功能和GUI,用戶可以輕松添加和配 置驅(qū)動(dòng)程序和中間件,為正在開發(fā)的
    發(fā)表于 10-09 16:17

    學(xué)生適合使用的SOLIDWORKS 云應(yīng)用程序

    SOLIDWORKS云應(yīng)用程序如何滿足學(xué)生的需求,并介紹其關(guān)鍵功能和優(yōu)勢(shì)。 SOLIDWORKS云應(yīng)用程序是SOLIDWORKS軟件與3DEXPERIENCE平臺(tái)云端設(shè)計(jì)應(yīng)用程序和人工智能設(shè)計(jì)輔助
    的頭像 發(fā)表于 09-15 10:39 ?775次閱讀
    學(xué)生適合使用的SOLIDWORKS 云<b class='flag-5'>應(yīng)用程序</b>

    SEGGER工具鏈集成到CMake和VS Code了

    SEGGER公司已將其嵌入式開發(fā)工具鏈集成到了廣泛使用的CMake構(gòu)建配置工具中,這意味著基于Visual Studio Code(VS Code)代碼編輯器的應(yīng)用開發(fā)可以方便的使用S
    的頭像 發(fā)表于 07-23 15:06 ?1015次閱讀

    使用英特爾? NPU 插件C++運(yùn)行應(yīng)用程序時(shí)出現(xiàn)錯(cuò)誤:“std::Runtime_error at memory location”怎么解決?

    使用OpenVINO?工具套件版本 2024.4.0 構(gòu)建C++應(yīng)用程序 使用英特爾? NPU 插件運(yùn)行了 C++ 應(yīng)用程序 遇到的錯(cuò)
    發(fā)表于 06-25 08:01

    請(qǐng)問(wèn)是否可以在通用Windows平臺(tái)中構(gòu)建OpenVINO? GenAI C++ 應(yīng)用程序?

    無(wú)法在通用 Windows 平臺(tái)中構(gòu)建OpenVINO? GenAI C++ 應(yīng)用程序
    發(fā)表于 06-24 07:35

    如何在 Raspberry Pi AI Camera 上構(gòu)建為開發(fā)人員提供實(shí)時(shí)的智能應(yīng)用程序!

    在這篇特邀文章中,我們的合作伙伴索尼公司的雷蒙娜-雷納(RamonaRayner)將向您展示如何快速探索不同的模型和人工智能功能,以及如何在RaspberryPi人工智能相機(jī)的基礎(chǔ)上輕松構(gòu)建應(yīng)用程序
    的頭像 發(fā)表于 03-25 09:37 ?831次閱讀
    如何在 Raspberry Pi AI Camera 上<b class='flag-5'>構(gòu)建</b>為開發(fā)人員提供實(shí)時(shí)的智能<b class='flag-5'>應(yīng)用程序</b>!

    如何部署OpenVINO?工具套件應(yīng)用程序

    編寫代碼并測(cè)試 OpenVINO? 工具套件應(yīng)用程序后,必須將應(yīng)用程序安裝或部署到生產(chǎn)環(huán)境中的目標(biāo)設(shè)備。 OpenVINO?部署管理器指南包含有關(guān)如何輕松使用部署管理器將
    發(fā)表于 03-06 08:23

    構(gòu)建開源OpenVINO?工具套件后,模型優(yōu)化器位于何處呢?

    構(gòu)建開源OpenVINO?工具套件后,模型優(yōu)化器位于何處?
    發(fā)表于 03-06 08:18

    請(qǐng)問(wèn)OpenVINO?工具套件中的驗(yàn)證應(yīng)用程序是什么?

    OpenVINO?工具套件中的驗(yàn)證應(yīng)用程序是什么?
    發(fā)表于 03-06 06:54

    無(wú)法使用Raspberry與Ubuntu 20.04構(gòu)建OpenVINO?怎么辦?

    按照 BuildForLinux* 的構(gòu)建步驟操作 使用構(gòu)建命令: cmake -DCMAKE_BUILD_TYPE=Release -DENABLE_PYTHON
    發(fā)表于 03-06 06:42