女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(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)軟件開(kā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è)開(kāi)源、跨平臺(tái)的工具系列,旨在跨不同平臺(tái)構(gòu)建、測(cè)試和打包軟件。許多開(kāi)發(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 等開(kāi)源項(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 開(kāi)始)就提供了通過(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 的例子開(kāi)始。清單 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ī)中的開(kāi)普勒體系結(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ù)編寫(xiě)一些真正的 CMake 代碼了。

用 CMake 建立圖書(shū)館

學(xué)習(xí) CMake 時(shí),每個(gè)人做的第一件事就是編寫(xiě)一個(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í)間。可分離編譯的主要缺點(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)按如下方式打開(kāi)目標(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)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(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

    文章

    4886

    瀏覽量

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

    關(guān)注

    38

    文章

    3322

    瀏覽量

    58701
收藏 人收藏

    評(píng)論

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

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

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

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

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

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

    構(gòu)建開(kāi)源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

    使用人體姿勢(shì)估算-3d-0001模型執(zhí)行human_pose_estimation_demo.exe時(shí)遇到錯(cuò)誤怎么解決?

    已OpenVINO 工具套件 2020.3 安裝。 下載并轉(zhuǎn)換 人體姿勢(shì)估算-3d-0001 模型。 構(gòu)建 人類姿態(tài)估算 C++ 演示 應(yīng)用程序。 運(yùn)行演示時(shí)遇到錯(cuò)誤: [ ERRO
    發(fā)表于 03-05 07:45

    安裝OpenVINO?適用于Raspberry Pi64位操作系統(tǒng)的工具套件2022.3.1,配置英特爾?NCS2時(shí)出錯(cuò)怎么解決?

    安裝OpenVINO?適用于 Raspberry Pi* 64 位操作系統(tǒng)的工具套件 2022.3.1。 配置英特爾? NCS2時(shí)出錯(cuò): CMake Error at CMakeLists.txt
    發(fā)表于 03-05 07:27

    如何下載 OpenVINO? 工具套件

    需要下載用于開(kāi)發(fā)工作的 OpenVINO? 工具套件
    發(fā)表于 03-05 06:49

    應(yīng)用程序工具套件集成到Unity 3D OpenVINO?過(guò)程中遇到\"DLLNotFound異常\"錯(cuò)誤怎么解決?

    在將 OpenVINO?工具套件與 Unity 3D* 集成期間,Unity 3D 編輯器無(wú)法找到 OpenVINO 工具套件的依賴性,并引發(fā) DLLNotFoundException
    發(fā)表于 03-05 06:22

    使用Ozone調(diào)試基于nRF9160 Zephyr應(yīng)用程序

    Ozone是SEGGER免費(fèi)的嵌入式軟件調(diào)試器。它是一個(gè)強(qiáng)大的工具,可以讓你深入了解嵌入式系統(tǒng)中發(fā)生的事情。它在調(diào)試nRF9160 Zephyr應(yīng)用程序時(shí)特別有用。整理多個(gè)線程和多映像構(gòu)建可能很困難,但這就是你想要的
    的頭像 發(fā)表于 02-25 17:07 ?738次閱讀
    使用Ozone調(diào)試基于nRF9160 Zephyr<b class='flag-5'>應(yīng)用程序</b>

    基于HPM_SDK_ENV開(kāi)發(fā)應(yīng)用程序的升級(jí)處理

    基于HPM_SDK_ENV開(kāi)發(fā)應(yīng)用程序的方式HPM_SDK_ENV是先楫半導(dǎo)體MCU的Windows集成開(kāi)發(fā)環(huán)境,其包含HPM_SDK,工具鏈,依賴工具(cmake,ninja,ope
    的頭像 發(fā)表于 02-08 13:38 ?904次閱讀
    基于HPM_SDK_ENV開(kāi)發(fā)<b class='flag-5'>應(yīng)用程序</b>的升級(jí)處理

    ANACONDA——關(guān)于發(fā)布數(shù)據(jù)應(yīng)用程序的新簡(jiǎn)單方法

    我們推出了一款用于發(fā)布數(shù)據(jù)應(yīng)用程序的開(kāi)創(chuàng)性解決方案:具有 Panel 應(yīng)用程序部署功能的 Anaconda Cloud Notebooks。Panel 是一種開(kāi)源 Python 工具,現(xiàn)在
    的頭像 發(fā)表于 01-17 11:39 ?364次閱讀
    ANACONDA——關(guān)于發(fā)布數(shù)據(jù)<b class='flag-5'>應(yīng)用程序</b>的新簡(jiǎn)單方法

    android手機(jī)上emulate應(yīng)用程序的方法

    在Android手機(jī)上模擬(emulate)應(yīng)用程序的方法通常涉及到使用Android模擬器(Emulator)或類似的工具來(lái)模擬Android環(huán)境,以便在沒(méi)有實(shí)際物理設(shè)備的情況下運(yùn)行和測(cè)試應(yīng)用程序
    的頭像 發(fā)表于 12-05 15:33 ?1051次閱讀

    Zephyr的構(gòu)建工具

    給大家介紹一下Zephyr的構(gòu)建工具們:
    的頭像 發(fā)表于 12-05 09:51 ?1355次閱讀
    Zephyr的<b class='flag-5'>構(gòu)建工具</b>

    AWTK-WEB 快速入門(1) - C 語(yǔ)言應(yīng)用程序

    導(dǎo)讀AWTK可以使用相同的技術(shù)棧開(kāi)發(fā)各種平臺(tái)的應(yīng)用程序。有時(shí)我們需要使用Web界面與設(shè)備進(jìn)行交互,本文介紹一下如何使用C語(yǔ)言開(kāi)發(fā)AWTK-WEB應(yīng)用程序。用AWTKDesigner新建一個(gè)應(yīng)用程序
    的頭像 發(fā)表于 11-27 11:46 ?596次閱讀
    AWTK-WEB 快速入門(1) - C 語(yǔ)言<b class='flag-5'>應(yīng)用程序</b>

    TPS659xx應(yīng)用程序自定義工具

    電子發(fā)燒友網(wǎng)站提供《TPS659xx應(yīng)用程序自定義工具.pdf》資料免費(fèi)下載
    發(fā)表于 11-06 10:02 ?0次下載
    TPS659xx<b class='flag-5'>應(yīng)用程序</b>自定義<b class='flag-5'>工具</b>