FindCUDA¶
變更於版本 3.27: 此模組僅在 policy CMP0146
未設定為 NEW
時可用。將專案移植到 CMake 的第一級 CUDA
語言支援。
自版本 3.10 起已棄用: 請勿在新程式碼中使用此模組。
不再需要使用此模組或呼叫 find_package(CUDA)
來編譯 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 的位置判斷前綴,並且為 find_package()
指定 REQUIRED
,腳本將提示使用者指定 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 檔案新增到多個目標,則關閉此選項。這允許使用者從 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_LIBRARIES
中使用 CUDA 執行階段函式庫的靜態版本。如果設定的 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()
建立一個方便的目標,用於刪除所有產生的依賴項檔案。您應該在執行此目標後執行 make clean,以確保重新產生依賴項檔案。
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
cuda 的主要版本,由 nvcc 報告。
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 lib。僅適用於 CUDA 版本 4.0+。
CUDA_nppc_LIBRARY
NVIDIA Performance Primitives lib (核心)。僅適用於 CUDA 版本 5.5+。
CUDA_nppi_LIBRARY
NVIDIA Performance Primitives lib (影像處理)。僅適用於 CUDA 版本 5.5 - 8.0。
CUDA_nppial_LIBRARY
NVIDIA Performance Primitives lib (影像處理)。僅適用於 CUDA 版本 9.0。
CUDA_nppicc_LIBRARY
NVIDIA Performance Primitives lib (影像處理)。僅適用於 CUDA 版本 9.0。
CUDA_nppicom_LIBRARY
NVIDIA Performance Primitives lib (影像處理)。僅適用於 CUDA 版本 9.0 - 10.2。由 nvjpeg 取代。
CUDA_nppidei_LIBRARY
NVIDIA Performance Primitives lib (影像處理)。僅適用於 CUDA 版本 9.0。
CUDA_nppif_LIBRARY
NVIDIA Performance Primitives lib (影像處理)。僅適用於 CUDA 版本 9.0。
CUDA_nppig_LIBRARY
NVIDIA Performance Primitives lib (影像處理)。僅適用於 CUDA 版本 9.0。
CUDA_nppim_LIBRARY
NVIDIA Performance Primitives lib (影像處理)。僅適用於 CUDA 版本 9.0。
CUDA_nppist_LIBRARY
NVIDIA Performance Primitives lib (影像處理)。僅適用於 CUDA 版本 9.0。
CUDA_nppisu_LIBRARY
NVIDIA Performance Primitives lib (影像處理)。僅適用於 CUDA 版本 9.0。
CUDA_nppitc_LIBRARY
NVIDIA Performance Primitives lib (影像處理)。僅適用於 CUDA 版本 9.0。
CUDA_npps_LIBRARY
NVIDIA Performance Primitives lib (訊號處理)。僅適用於 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+。