色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何使用CMake工具套件構建CUDA應用程序

星星科技指導員 ? 來源:NVIDIA ? 作者:wnger ? 2022-04-01 17:42 ? 次閱讀

跨平臺軟件開發對應用程序的構建過程提出了許多挑戰。如何針對多個平臺而不維護多個平臺特定的構建腳本、項目或生成文件?如果您需要構建 CUDA 代碼作為過程的一部分呢? CMake 是一個開源、跨平臺的工具系列,旨在跨不同平臺構建、測試和打包軟件。許多開發人員使用 CMake 來使用簡單的獨立于平臺和編譯器的配置文件來控制他們的軟件編譯過程。 CMake 生成可在您選擇的編譯器環境中使用的本機 makefile 和工作區。 CMake 工具套件是由 Kitware 創建的,是為了響應對 ITK 和 VTK 等開源項目的強大、跨平臺構建環境的需求。

圖 1 。 CGED 將 CUDA C ++添加到支持的編程語言的長列表中。

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

CMake 中的一個 CUDA 示例

讓我們從一個用 CMake 構建 CUDA 的例子開始。清單 1 顯示了名為“ particles ”的 CUDA 示例的 CMake 文件。我已經在 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 所示的所有邏輯和特性之前,讓我們先跳過構建。如果您使用 VisualStudio ,則需要使用 CGuess 3 . 9 和 VisualStudio CUDA 構建擴展(包含在 CUDA 工具包中),否則您可以使用生成文件生成器(或忍者生成器)nvcc( NVIDIA CUDA 編譯器)和 C ++編譯器在您的路徑中使用 CMASE 3 . 8 或更高。(或者,您可以將CUDACXXCXX環境變量分別設置為nvcc和 C ++編譯器的路徑)。

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

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

圖 2 。構建一個靜態庫和可執行文件,它使用 CUDA 和 C ++與 CMake 和 Mag 文件生成器。

為了配置 CMake 項目并生成一個 makefile ,我使用了以下命令

cmake -DCMAKE_CUDA_FLAGS=”-arch=sm_30” .

圖 1 顯示了輸出。 CMADE 自動發現并驗證 C ++和 CUDA 編譯器并生成一個 MaMaFrimeProject 。注意,參數-DCMAKE_CUDA_FLAGS="-arch=sm_30"-arch=sm_30傳遞給nvcc,告訴它以我計算機中的開普勒體系結構( SM _ 30 或 ComputeCapability 3 . 0 ) GPU 為目標。

接下來,圖 1 顯示了我如何使用命令make -j4調用構建。這運行了make多個線程,因此它并行編譯 C ++和 CUDA 源文件。有關 CMake 如何確定在項目中的何處查找并行性的更多信息,請閱讀““用你所有的核心來建設”。 CMake 還可以自動管理將多種語言構建和鏈接到可執行文件或共享庫中。

啟用 CUDA

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

minus.png
通過將– CUDA rt { none |共享|靜態}設置為– CUDA rt { none |共享|靜態},可以指定所有 CUDA 目標將在項目內部使用的運行時。例如,要使用靜態 CUDA 運行時庫,請將其設置為– CUDA rt 靜態

接下來,第 2 行是 Project 命令,它設置項目名稱(cmake_and_cuda)并定義所需語言( C ++和 CUDA )。這使 CMake 能夠識別和驗證所需的編譯器,并緩存結果。這將生成圖 3 所示的公共緩存語言標志。

圖 3 。當啟用 CUDA 時, CMake 為每個配置提供默認標志(調試、發布、 RelWithDebInfo 和 MinSizeRel)

既然 CMake 已經確定了項目需要什么語言,并且配置了它的內部基礎設施,我們就可以繼續編寫一些真正的 CMake 代碼了。

用 CMake 建立圖書館

學習 CMake 時,每個人做的第一件事就是編寫一個生成單個可執行文件的玩具示例就像這個。讓我們更大膽一點,并生成一個可執行文件使用的靜態庫。

使用要求是現代 CMake 的核心。 include 目錄、編譯器定義和編譯器選項等信息可以與目標相關聯,這樣這些信息就可以通過target_link_libraries自動傳播給使用者。在 CMake 的早期版本中,構建 CUDA 代碼需要命令,比如cuda_add_library。不幸的是,這些命令無法參與使用需求,因此無法使用傳播的編譯器標志或定義。 CMake 中現在對 CUDA 的內在支持使使用 CUDA 的目標能夠充分利用現代 CMake 使用需求,并為所有語言提供統一的 CMake 語法。

C ++語言層

在一個項目中,首先要配置的事情之一是 C ++語言級別( 98 , 11 , 14 , 17 …)。 CGuSE 3 . 1 介紹了為整個項目或基于每個目標的基礎來設置 C ++語言級別的能力。還可以控制 CUDA 編譯的 C ++語言級別。

您可以通過CMAKE_CUDA_STANDARDtarget_compile_features命令輕松地要求特定版本的 CUDA 編譯器。為了使target_compile_features更容易與 CUDA 一起使用, CMake 使用了 CUDA C ++的同一組 C ++特征關鍵字。下面的代碼展示了如何請求 C ++ 11 對particles目標的支持,這意味著粒子目標所使用的任何 CUDA 文件都會被 CUDA C ++ 11 啟用(--std=c++11參數]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)

啟用位置無關代碼

在處理大型項目時,通常會生成一個或多個共享庫。作為共享庫一部分的每個對象文件通常都需要在啟用位置獨立代碼的情況下進行編譯,這是通過設置fPIC編譯器標志來完成的。不幸的是,并非所有編譯器都支持fPIC,因此 CMake 在構建共享庫時自動啟用位置無關的代碼,從而避免了這個問題。對于將鏈接到共享庫的靜態庫,需要通過如下設置POSITION_INDEPENDENT_CODEtarget 屬性顯式地啟用位置無關的代碼。

set_target_properties(particles PROPERTIES POSITION_INDEPENDENT_CODE ON)

CMake 3 . 8 支持 CUDA 編譯的POSITION_INDEPENDENT_CODE屬性,并在請求時構建所有可重新定位的主機端代碼。對于那些希望在跨平臺項目或內部共享庫中使用 CUDA 的項目,或者希望支持深奧的 C ++編譯器的項目,這是一個好消息。

可分離匯編

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

可分離編譯不僅允許項目維護一個代碼結構,其中獨立的函數被保存在不同的位置,它還有助于提高增量構建性能(所有基于 CMake 的項目的一個特性)。增量構建只允許重新編譯和鏈接已修改的單元,這減少了構建時間。可分離編譯的主要缺點是,對于駐留在不同編譯位中的函數的調用,某些函數調用優化被禁用,因為編譯器不知道被調用函數的詳細信息。

CMake 現在基本上理解了獨立編譯和設備鏈接的概念。隱式地, CMake 會盡可能長時間地延遲 CUDA 代碼的設備鏈接,因此,如果您使用可重定位的 CUDA 代碼生成靜態庫,則設備鏈接將被推遲,直到靜態庫鏈接到共享庫或可執行文件。這是一個顯著的改進,因為現在可以將 CUDA 代碼組合到多個靜態庫中,這在 CMake 中以前是不可能的。要控制 CMake 中的可分離編譯,請按如下方式打開目標的CUDA_SEPARABLE_COMPILATION屬性。

set_target_properties(particles PROPERTIES CUDA_SEPARABLE_COMPILATION ON)

info.png 高級提示
minus.png
如果需要在共享庫或可執行文件使用之前發生可分離編譯設備鏈接,則可以通過設置 target 屬性CUDA_RESOLVE_DEVICE_SYMBOLS顯式請求 CMake 調用設備鏈接。

PTX 生成

如果要將 PTX 文件打包用于加載時 JIT 編譯,而不是將 CUDA 代碼編譯到庫或可執行文件的集合中,則可以啟用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 生成成為可能,對 CMake 進行了擴展,以便所有對象庫都能夠在生成器表達式中安裝、導出、導入和引用。這也使得 PTX 文件能夠被 bin2c 等工具轉換或處理,然后作為 C 字符串嵌入到庫或可執行文件中。這是一個基本的例子

審核編輯:郭婷

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 代碼
    +關注

    關注

    30

    文章

    4779

    瀏覽量

    68524
  • 應用程序
    +關注

    關注

    37

    文章

    3265

    瀏覽量

    57677
收藏 人收藏

    評論

    相關推薦

    android手機上emulate應用程序的方法

    在Android手機上模擬(emulate)應用程序的方法通常涉及到使用Android模擬器(Emulator)或類似的工具來模擬Android環境,以便在沒有實際物理設備的情況下運行和測試應用程序
    的頭像 發表于 12-05 15:33 ?243次閱讀

    Zephyr的構建工具

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

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

    導讀AWTK可以使用相同的技術棧開發各種平臺的應用程序。有時我們需要使用Web界面與設備進行交互,本文介紹一下如何使用C語言開發AWTK-WEB應用程序。用AWTKDesigner新建一個應用程序
    的頭像 發表于 11-27 11:46 ?185次閱讀
    AWTK-WEB 快速入門(1) - C 語言<b class='flag-5'>應用程序</b>

    TPS659xx應用程序自定義工具

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

    【xG24 Matter開發套件試用體驗】+開機啟動

    于快速原型化和概念創建 2.4 GHz 無線協議的 IoT 應用程序,包括藍牙 LE、藍牙網狀網絡、Zigbee、Thread 和 Matter。 2.軟件工具使用:Simplicity Studio
    發表于 07-11 14:05

    使用Redis和Spring?Ai構建rag應用程序

    隨著AI技術的不斷進步,開發者面臨著如何有效利用現有工具和技術來加速開發過程的挑戰。Redis與SpringAI的結合為Java開發者提供了一個強大的平臺,以便快速構建并部署響應式AI應用。探索這一
    的頭像 發表于 04-29 08:04 ?1029次閱讀
    使用Redis和Spring?Ai<b class='flag-5'>構建</b>rag<b class='flag-5'>應用程序</b>

    應用程序中的服務器錯誤怎么解決?

    在使用應用程序時,可能會遇到服務器錯誤的問題。這種錯誤通常會導致應用程序無法正常運行 ,給用戶帶來不便。下面將介紹應用程序中的服務器錯誤及其解決方法,幫助您快速解決這一問題。
    的頭像 發表于 03-12 15:13 ?6179次閱讀

    使用ADS .NET Framework構建一個應用程序,.s (匯編文件)文件無法編譯的原因?

    我正在嘗試使用 ADS .NET Framework 構建一個應用程序。 我遇到了以下錯誤,因為 .s (匯編文件)文件無法編譯。
    發表于 03-04 06:58

    鴻蒙開發【編譯構建】講解

    Version 4~7工程編譯構建示意圖如下: 另外,針對Native C++開發方式,DevEco Studio支持的編譯工具鏈為CMake和NinJa,在啟動編譯后,可以在底部工具
    發表于 02-27 17:41

    請問一下CMake和Make之間的區別有哪些?

    CMake和Make是構建軟件,其工作涉及將源代碼轉換為可執行程序CMake和Make是旨在實現構建過程自動化的
    的頭像 發表于 02-27 11:44 ?1755次閱讀

    為什么無法在modustoolbox?工具箱中打開新應用程序

    我無法在modustoolbox?工具箱中打開新應用程序。 如何解決這個問題?
    發表于 01-31 07:32

    u8g2應用程序無法在moduStoolBox中構建是為什么?

    我正在嘗試按照 ModustoolBox API 文檔中的英飛凌 SSD1306 OLED 說明進行操作。 當我按照它的指示運行演示程序時,它無法構建。 我能否得到一些關于如何正確完成此操作的幫助
    發表于 01-24 07:03

    Modustoolbox3.1離線時無法構建模板應用程序怎么辦?

    離線使用 modustoolbox 3.1 軟件,之后成功建立 Ethernet_TCP_Client 的模板程序,但無法成功建立 Ethernet_TCP_Server 的應用程序 編譯出現了以下
    發表于 01-19 08:33

    如何構建linux開發環境和編譯軟件工程、應用程序

    前文介紹了如何使用官方提供的鏡像文件啟動開發板,本文將說明如何構建linux開發環境和編譯軟件工程、應用程序
    的頭像 發表于 01-03 12:31 ?2039次閱讀
    如何<b class='flag-5'>構建</b>linux開發環境和編譯軟件工程、<b class='flag-5'>應用程序</b>

    解決方案工具包QE顯示[RX,RA]V3.2.0:用于顯示應用程序的開發輔助工具

    電子發燒友網站提供《解決方案工具包QE顯示[RX,RA]V3.2.0:用于顯示應用程序的開發輔助工具.pdf》資料免費下載
    發表于 01-03 09:59 ?0次下載
    解決方案<b class='flag-5'>工具</b>包QE顯示[RX,RA]V3.2.0:用于顯示<b class='flag-5'>應用程序</b>的開發輔助<b class='flag-5'>工具</b>
    主站蜘蛛池模板: 凹凸精品视频分类视频| 亚洲免费精品视频| 青春禁区动漫免费观看| 久久中文字幕免费视频| 精品无码三级在线观看视频| 国产偷国产偷亚洲高清app| 国产99r视频精品免费观看| 成年私人影院网站在线看| WWW污污污抽搐喷潮COM| caoporn免费视频在线| bl(高h)文| 99久久亚洲精品影院| 97视频免费在线| 99精品国产在热久久| 99热在线播放| ZZoo兽2皇| 东北女人奶大毛多水多| 高清国产在线观看| 国产精品无码麻豆放荡AV| 国产精品卡1卡2卡三卡四| 国产普通话精品久久| 国内久经典AAAAA片| 娇小萝被两个黑人用半米长| 久久er国产精品免费观看2| 久久久96人妻无码精品蜜桃| 久青草国产在线观看视频| 蜜桃无码AV视频在线观看| 琪琪电影午夜理论片YY6080| 色戒无删减流畅完整版| 偷拍精品视频一区二区三区| 学校捏奶揉下面污文h| 亚洲日产2020乱码草莓毕| 玉林天天论坛| 99热国产这里只有精品6| 调教玩弄奶头乳夹开乳震动器| 国产精品婷婷久青青原| 久久精品亚洲热综合一本| 免费可以看黄的视频s色| 三级黄网站| 亚洲m男在线中文字幕| 伊人久久综合影院首页|