FindCUDA¶
變更於版本 3.27: 此模組僅在政策 CMP0146
未設定為 NEW
時可用。請將專案移植到 CMake 的第一級 CUDA
語言支援。
自版本 3.10 起已棄用: 請勿在新程式碼中使用此模組。
編譯 CUDA 程式碼不再需要使用此模組或呼叫 find_package(CUDA)
。相反地,請在對 project()
命令的最上層呼叫中,將 CUDA
列於指定的語言之中,或者使用 CUDA
呼叫 enable_language()
命令。然後,可以直接將 CUDA(.cu
)原始碼新增至目標,類似於其他語言。
新增於版本 3.17: 若要手動尋找並使用 CUDA 工具組函式庫,請改用 FindCUDAToolkit
模組。無論 CUDA
語言是否啟用,此模組都能運作。
已棄用用法的說明文件¶
用於建置 CUDA C 檔案的工具:函式庫和建置相依性。
此腳本會尋找 NVIDIA CUDA C 工具。它應該可以在 Linux、Windows 和 macOS 上運作,並且應該與 CUDA C 版本保持相當新的狀態。
新增於版本 3.19: QNX 支援。
此腳本使用標準的 find_package()
引數 <VERSION>
、REQUIRED
和 QUIET
。CUDA_FOUND
將會報告是否找到可接受的 CUDA 版本。
如果無法從系統路徑中 nvcc 的位置判斷前置詞,而且 REQUIRED
已指定給 find_package()
,則此腳本會提示使用者指定 CUDA_TOOLKIT_ROOT_DIR
。若要使用不同的已安裝工具組版本,請在執行 cmake 之前設定環境變數 CUDA_BIN_PATH
(例如 CUDA_BIN_PATH=/usr/local/cuda1.0
,而不是預設的 /usr/local/cuda
),或在設定之後設定 CUDA_TOOLKIT_ROOT_DIR
。如果您變更 CUDA_TOOLKIT_ROOT_DIR
的值,則取決於路徑的各種元件將會重新定位。
可能需要在某些平台上手動設定 CUDA_TOOLKIT_ROOT_DIR
,或使用未安裝在預設位置的 CUDA 執行階段。在較新版本的工具組中,CUDA 函式庫已包含在圖形驅動程式中 – 請務必讓驅動程式版本符合 CUDA 執行階段版本所需。
輸入變數¶
下列變數會影響腳本中巨集(依字母順序)的行為。請注意,在呼叫 cuda_add_executable()
、cuda_add_library()
、cuda_compile()
、cuda_compile_ptx()
、cuda_compile_fatbin()
、cuda_compile_cubin()
或 cuda_wrap_srcs()
之前,可以在同一個目錄中多次變更這些旗標。
CUDA_64_BIT_DEVICE_CODE
(預設:主機位元大小)設定為
ON
以編譯為 64 位元裝置程式碼,設定為 OFF 以編譯為 32 位元裝置程式碼。請注意,從 CUDA 程式碼產生物件或 C 檔案時,使其與主機程式碼不同是行不通的,因為 size_t 是由 nvcc 在產生的來源中定義。如果您編譯為 PTX,然後自行載入檔案,則可以在裝置與主機之間混合位元大小。CUDA_ATTACH_VS_BUILD_RULE_TO_CUDA_FILE
(預設:ON
)如果您希望自訂建置規則附加至 Visual Studio 中的原始檔,則設定為
ON
。如果您將相同的 cuda 檔案新增至多個目標,則關閉 (OFF)。這可讓使用者從 CUDA 檔案建置目標;但是,如果將 CUDA 原始檔新增至多個目標,則可能會發生不好的情況。執行平行建置時,自訂建置命令可能會執行多次且平行執行,導致難以理解的建置錯誤。VS 會為目標中的每個原始檔執行規則,而一個原始檔只能有一個規則,無論它新增至多少專案。當規則從多個目標執行時,可能會在產生的檔案上發生競爭條件。最終一切都會建置完成,但如果使用者不知道此行為,則可能會感到困惑。如果此腳本可以偵測到跨多個目標重複使用原始檔,並為使用者關閉此選項,那就太好了,但找不到好的解決方案。
CUDA_BUILD_CUBIN
(預設:OFF
)設定為
ON
以啟用裝置模式中具有-cubin
選項的額外編譯步驟。將會剖析輸出,並在建置期間列印暫存器、共用記憶體使用量。CUDA_BUILD_EMULATION
(預設:裝置模式為OFF
)針對模擬模式設定為
ON
。當CUDA_BUILD_EMULATION
為TRUE
時,會為 CUDA C 檔案定義-D_DEVICEEMU
。CUDA_LINK_LIBRARIES_KEYWORD
(預設:""
)新增於版本 3.9。
用於內部
target_link_libraries()
呼叫的<PRIVATE|PUBLIC|INTERFACE>
關鍵字。預設值是不使用關鍵字,這會使用target_link_libraries()
的舊「純文字」形式。請注意,這很重要,因為無論FindCUDA
模組內部使用什麼,也都必須在外部使用 –target_link_libraries()
的兩種形式不可混用。CUDA_GENERATED_OUTPUT_DIR
(預設:CMAKE_CURRENT_BINARY_DIR
)設定為您希望放置產生檔案的路徑。如果它是空白的,則輸出檔案將會放置在
CMAKE_CURRENT_BINARY_DIR
。中繼檔案將會永遠放置在CMAKE_CURRENT_BINARY_DIR/CMakeFiles
中。CUDA_HOST_COMPILATION_CPP
(預設:ON
)針對主機程式碼的 C 編譯設定為
OFF
。CUDA_HOST_COMPILER
(預設:CMAKE_C_COMPILER
)設定 nvcc 使用的主機編譯器。如果
-ccbin
或--compiler-bindir
已經存在於CUDA_NVCC_FLAGS
或CUDA_NVCC_FLAGS_<CONFIG>
變數中,則此設定會被忽略。對於 Visual Studio 目標,主機編譯器會使用一個或多個 Visual Studio 巨集(例如$(VCInstallDir)
)來建構,這些巨集會在從 VS 內部執行命令時展開為路徑。在 3.13 版本中新增:如果設定了
CUDAHOSTCXX
環境變數,它將會被用作預設值。CUDA_NVCC_FLAGS
,CUDA_NVCC_FLAGS_<CONFIG>
額外的 NVCC 命令列參數。注意:多個參數必須以分號分隔(例如
--compiler-options;-Wall
)在 3.6 版本中新增:這些變數的內容可以使用
產生器表達式
。CUDA_PROPAGATE_HOST_FLAGS
(預設值:ON
)設定為
ON
以透過 nvcc 的-Xcompiler
旗標,自動將CMAKE_{C,CXX}_FLAGS
及其配置相關的對應旗標(例如CMAKE_C_FLAGS_DEBUG
)傳遞給主機編譯器。這有助於使產生的主機程式碼更好地與系統的其他部分匹配。有時,某些旗標會導致 nvcc 出現問題,此設定可幫助您關閉旗標傳遞。這不會影響透過CUDA_NVCC_FLAGS
或透過cuda_add_library()
、cuda_add_executable()
或cuda_wrap_srcs()
指定的OPTION
旗標直接提供給 nvcc 的旗標。用於共享函式庫編譯的旗標不受此旗標影響。CUDA_SEPARABLE_COMPILATION
(預設值:OFF
)如果設定此選項,則會為所有 CUDA 執行期目標檔案啟用可分離編譯。如果在
cuda_add_executable()
和cuda_add_library()
之外使用(例如直接呼叫cuda_wrap_srcs()
),則應呼叫cuda_compute_separable_compilation_object_file_name()
和cuda_link_separable_compilation_objects()
。CUDA_SOURCE_PROPERTY_FORMAT
在 3.3 版本中新增。
如果設定此原始碼檔案屬性,則可以覆寫指定給
cuda_wrap_srcs()
的格式(OBJ
、PTX
、CUBIN
或FATBIN
)。如果輸入的原始碼檔案不是.cu
檔案,設定此檔案會使其被視為.cu
檔案。請參閱 set_source_files_properties 的文件,以了解如何設定此屬性。CUDA_USE_STATIC_CUDA_RUNTIME
(預設值:ON
)在 3.3 版本中新增。
啟用後,CUDA 執行期函式庫的靜態版本將在
CUDA_LIBRARIES
中使用。如果設定的 CUDA 版本不支援此選項,則會靜默停用。CUDA_VERBOSE_BUILD
(預設值:OFF
)設定為
ON
以查看建置 CUDA 檔案時使用的所有命令。當使用 Makefile 產生器時,值預設為VERBOSE
(執行make VERBOSE=1
以查看輸出),但將CUDA_VERBOSE_BUILD
設定為ON
將始終列印輸出。
命令¶
此腳本建立以下函式和巨集(依字母順序排列)
cuda_add_cufft_to_target(<cuda_target>)
將 cufft 函式庫新增至目標(可以是任何目標)。處理您是否處於模擬模式。
cuda_add_cublas_to_target(<cuda_target>)
將 cublas 函式庫新增至目標(可以是任何目標)。處理您是否處於模擬模式。
cuda_add_executable(<cuda_target> <file>...
[WIN32] [MACOSX_BUNDLE] [EXCLUDE_FROM_ALL] [OPTIONS ...])
建立一個可執行檔 <cuda_target>
,它由指定的檔案組成。所有非 CUDA C 檔案都使用 CMake 指定的標準建置規則進行編譯,而 CUDA 檔案則使用 nvcc 和主機編譯器編譯為目標檔案。此外,CUDA_INCLUDE_DIRS
會自動新增至 include_directories()
。在呼叫此巨集之後,可以在目標上使用一些標準的 CMake 目標呼叫(例如 set_target_properties()
和 target_link_libraries()
),但是設定調整編譯旗標的屬性將不會影響 nvcc 編譯的程式碼。這些旗標應在呼叫 cuda_add_executable()
、cuda_add_library()
或 cuda_wrap_srcs()
之前修改。
cuda_add_library(<cuda_target> <file>...
[STATIC | SHARED | MODULE] [EXCLUDE_FROM_ALL] [OPTIONS ...])
與 cuda_add_executable()
相同,只是會建立函式庫。
cuda_build_clean_target()
建立一個方便的目標,以刪除所有產生的相依性檔案。您應該在執行此目標後進行清理,以確保重新產生相依性檔案。
cuda_compile(<generated_files> <file>... [STATIC | SHARED | MODULE]
[OPTIONS ...])
從輸入的原始碼檔案傳回產生的檔案清單,以與 add_library()
或 add_executable()
一起使用。
cuda_compile_ptx(<generated_files> <file>... [OPTIONS ...])
傳回從輸入原始碼檔案產生的 PTX
檔案清單。
cuda_compile_fatbin(<generated_files> <file>... [OPTIONS ...])
在 3.1 版本中新增。
傳回從輸入原始碼檔案產生的 FATBIN
檔案清單。
cuda_compile_cubin(<generated_files> <file>... [OPTIONS ...])
在 3.1 版本中新增。
傳回從輸入原始碼檔案產生的 CUBIN
檔案清單。
cuda_compute_separable_compilation_object_file_name(<output_file_var>
<cuda_target>
<object_files>)
計算用於可分離編譯的中間連結檔案名稱。此檔案名稱通常傳遞給 CUDA_LINK_SEPARABLE_COMPILATION_OBJECTS
。 output_file_var 是根據 cuda_target 產生,其中包含需要可分離編譯的物件檔案清單,如 <object_files>
所指定。如果 <object_files>
清單為空,則 <output_file_var>
將為空。此函式會自動為 cuda_add_library()
和 cuda_add_executable()
呼叫。請注意,這是一個函式,而不是巨集。
cuda_include_directories(path0 path1 ...)
設定應傳遞給 nvcc 的目錄(例如 nvcc -Ipath0 -Ipath1 ...
)。這些路徑通常包含其他 .cu
檔案。
cuda_link_separable_compilation_objects(<output_file_var> <cuda_target>
<nvcc_flags> <object_files>)
從給定的物件檔案產生可分離編譯所需的連結物件。這會自動為 cuda_add_executable()
和 cuda_add_library()
呼叫,但可以在直接使用 cuda_wrap_srcs()
時手動呼叫。當從 cuda_add_library()
或 cuda_add_executable()
呼叫時,傳入的 <nvcc_flags>
與透過 OPTIONS
參數傳入的旗標相同。自動新增的唯一 nvcc 旗標是 CUDA_64_BIT_DEVICE_CODE
指定的位元旗標。請注意,這是一個函式而不是巨集。
cuda_select_nvcc_arch_flags(<out_variable> [<target_CUDA_architecture> ...])
根據 target_CUDA_architecture
選擇 nvcc 的 GPU 架構旗標。
target_CUDA_architecture
的值
Auto
:在執行時偵測本機電腦的 GPU 計算架構。Common
和All
:涵蓋架構的常見和完整子集。<name>
:Fermi
、Kepler
、Maxwell
、Kepler+Tegra
、Kepler+Tesla
、Maxwell+Tegra
、Pascal
其中之一。<ver>
、<ver>(<ver>)
、<ver>+PTX
,其中<ver>
是2.0
、2.1
、3.0
、3.2
、3.5
、3.7
、5.0
、5.2
、5.3
、6.0
、6.2
其中之一。
傳回要加入 CUDA_NVCC_FLAGS
中,並在 <out_variable>
中使用的旗標列表。此外,將 <out_variable>_readable
設定為產生的數值列表。
範例
cuda_select_nvcc_arch_flags(ARCH_FLAGS 3.0 3.5+PTX 5.2(5.0) Maxwell)
list(APPEND CUDA_NVCC_FLAGS ${ARCH_FLAGS})
關於 CUDA 架構的更多資訊:https://en.wikipedia.org/wiki/CUDA。請注意,這是一個函式而不是巨集。
cuda_wrap_srcs(<cuda_target> <format> <generated_files> <file>...
[STATIC | SHARED | MODULE] [OPTIONS ...])
這是一切魔法發生的地方。cuda_add_executable()
、cuda_add_library()
、cuda_compile()
和 cuda_compile_ptx()
都在底層呼叫這個函式。
給定檔案列表 <file>...
,這個巨集會產生自訂命令,以產生 PTX 或可連結的物件(使用 PTX
或 OBJ
作為 <format>
引數來切換)。不以 .cu
結尾或具有 HEADER_FILE_ONLY
屬性的檔案會被忽略。
在 OPTIONS
之後傳入的引數是傳遞給 nvcc 的額外命令列選項。您也可以透過指定組態名稱,然後接上選項來指定每個組態的選項。一般選項必須在組態特定選項之前。並非所有組態都需要指定,只會使用提供的組態。例如
cuda_add_executable(...
OPTIONS -DFLAG=2 "-DFLAG_OTHER=space in flag"
DEBUG -g
RELEASE --use_fast_math
RELWITHDEBINFO --use_fast_math;-g
MINSIZEREL --use_fast_math)
對於某些組態(也就是 VS 產生物件檔案時,CUDA_ATTACH_VS_BUILD_RULE_TO_CUDA_FILE
設定為 ON
),不會為給定的 CUDA 檔案產生任何產生的檔案。這是因為當您將 CUDA 檔案新增至 Visual Studio 時,它知道此檔案會產生物件檔案,並會自動連結產生的物件檔案。
此腳本還會產生一個單獨的 CMake 腳本,該腳本在建置時用於呼叫 nvcc。原因如下:
nvcc 可能會傳回負數作為傳回值,這會使 Visual Studio 誤以為命令成功。現在,腳本會檢查錯誤碼,並在發生問題時產生錯誤。
已知 nvcc 在遇到問題時不會刪除未完成的結果。這會使建置系統誤以為目標已產生,但實際上存在無法使用的檔案。現在,如果發生錯誤,腳本會刪除輸出檔案。
透過將影響建置的所有選項放入檔案中,然後使建置規則依賴該檔案,當選項變更時,將會重新產生輸出檔案。
此腳本還會查看可選引數 STATIC
、SHARED
或 MODULE
,以決定何時針對共享程式庫進行物件編譯。BUILD_SHARED_LIBS
在 cuda_wrap_srcs()
中會被忽略,但在 cuda_add_library()
中會被遵守。在某些系統上,會為打算用於共享程式庫的建置物件新增特殊旗標。當偵測到共享程式庫編譯時,會定義一個前置處理器巨集 <target_name>_EXPORTS
。
使用 -D
或 /D
傳遞到 add_definitions 中的旗標會一併傳遞給 nvcc。
結果變數¶
該腳本定義了以下變數
CUDA_VERSION_MAJOR
nvcc 報告的 CUDA 主要版本。
CUDA_VERSION_MINOR
次要版本。
CUDA_VERSION
、CUDA_VERSION_STRING
完整版本,格式為
X.Y
。CUDA_HAS_FP16
在 3.6 版本中新增: 是否支援短浮點數 (
float16
、fp16
)。CUDA_TOOLKIT_ROOT_DIR
CUDA 工具包的路徑(如果未設定則會定義)。
CUDA_SDK_ROOT_DIR
CUDA SDK 的路徑。使用此路徑在 SDK 中尋找檔案。此腳本不會直接支援尋找特定的程式庫或標頭,因為 NVIDIA 不支援這樣做。如果您想在路徑變更時變更程式庫,請參閱
FindCUDA.cmake
腳本,其中有如何清除這些變數的範例。此外,還有一些如何使用CUDA_SDK_ROOT_DIR
來定位標頭或程式庫的範例(風險自負)。CUDA_INCLUDE_DIRS
CUDA 標頭的包含目錄。自動為
cuda_add_executable()
和cuda_add_library()
新增。CUDA_LIBRARIES
CUDA RT 程式庫。
CUDA_CUFFT_LIBRARIES
CUDA FFT 實作的裝置或模擬程式庫(替代
cuda_add_cufft_to_target()
巨集)。CUDA_CUBLAS_LIBRARIES
CUDA BLAS 實作的裝置或模擬程式庫(替代
cuda_add_cublas_to_target()
巨集)。CUDA_cudart_static_LIBRARY
可靜態連結的 CUDA 執行階段程式庫。僅適用於 CUDA 5.5+ 版本。
CUDA_cudadevrt_LIBRARY
在 3.7 版本中新增: 裝置執行階段程式庫。可分離編譯所需。
CUDA_cupti_LIBRARY
CUDA 分析工具介面程式庫。僅適用於 CUDA 4.0+ 版本。
CUDA_curand_LIBRARY
CUDA 隨機數生成程式庫。僅適用於 CUDA 3.2+ 版本。
CUDA_cusolver_LIBRARY
在 3.2 版本中新增: CUDA 直接求解器程式庫。僅適用於 CUDA 7.0+ 版本。
CUDA_cusparse_LIBRARY
CUDA 稀疏矩陣程式庫。僅適用於 CUDA 3.2+ 版本。
CUDA_npp_LIBRARY
NVIDIA Performance Primitives 程式庫。僅適用於 CUDA 4.0+ 版本。
CUDA_nppc_LIBRARY
NVIDIA Performance Primitives 程式庫(核心)。僅適用於 CUDA 5.5+ 版本。
CUDA_nppi_LIBRARY
NVIDIA Performance Primitives 程式庫(影像處理)。僅適用於 CUDA 5.5 - 8.0 版本。
CUDA_nppial_LIBRARY
NVIDIA Performance Primitives 程式庫(影像處理)。僅適用於 CUDA 9.0 版本。
CUDA_nppicc_LIBRARY
NVIDIA Performance Primitives 程式庫(影像處理)。僅適用於 CUDA 9.0 版本。
CUDA_nppicom_LIBRARY
NVIDIA Performance Primitives 程式庫(影像處理)。僅適用於 CUDA 9.0 - 10.2 版本。已由 nvjpeg 取代。
CUDA_nppidei_LIBRARY
NVIDIA Performance Primitives 程式庫(影像處理)。僅適用於 CUDA 9.0 版本。
CUDA_nppif_LIBRARY
NVIDIA Performance Primitives 程式庫(影像處理)。僅適用於 CUDA 9.0 版本。
CUDA_nppig_LIBRARY
NVIDIA Performance Primitives 程式庫(影像處理)。僅適用於 CUDA 9.0 版本。
CUDA_nppim_LIBRARY
NVIDIA Performance Primitives 程式庫(影像處理)。僅適用於 CUDA 9.0 版本。
CUDA_nppist_LIBRARY
NVIDIA Performance Primitives 程式庫(影像處理)。僅適用於 CUDA 9.0 版本。
CUDA_nppisu_LIBRARY
NVIDIA Performance Primitives 程式庫(影像處理)。僅適用於 CUDA 9.0 版本。
CUDA_nppitc_LIBRARY
NVIDIA Performance Primitives 程式庫(影像處理)。僅適用於 CUDA 9.0 版本。
CUDA_npps_LIBRARY
NVIDIA Performance Primitives 程式庫(訊號處理)。僅適用於 CUDA 5.5+ 版本。
CUDA_nvcuvenc_LIBRARY
CUDA 視訊編碼器程式庫。僅適用於 CUDA 3.2+ 版本。僅限 Windows。
CUDA_nvcuvid_LIBRARY
CUDA 視訊解碼器程式庫。僅適用於 CUDA 3.2+ 版本。僅限 Windows。
CUDA_nvToolsExt_LIBRARY
在 3.16 版本中新增: NVIDA CUDA 工具擴充程式庫。適用於 CUDA 5+ 版本。
CUDA_OpenCL_LIBRARY
在 3.16 版本中新增: NVIDA CUDA OpenCL 程式庫。適用於 CUDA 5+ 版本。