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>REQUIREDQUIET 引數。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_EMULATIONTRUE 時,為 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_FLAGSCUDA_NVCC_FLAGS_<CONFIG> 變數中,則忽略此設定。對於 Visual Studio 目標,主機編譯器是使用一個或多個 Visual Studio 巨集 (例如 $(VCInstallDir)) 建構的,當從 VS 內部執行命令時,這些巨集會展開為路徑。

新增於版本 3.13: 如果設定了 CUDAHOSTCXX 環境變數,它將用作預設值。

CUDA_NVCC_FLAGSCUDA_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() 指定的格式 (OBJPTXCUBINFATBIN)。如果輸入原始檔不是 .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 計算架構。

  • CommonAll:涵蓋常見和完整的架構子集。

  • <name>FermiKeplerMaxwellKepler+TegraKepler+TeslaMaxwell+TegraPascal 之一。

  • <ver><ver>(<ver>)<ver>+PTX,其中 <ver>2.02.13.03.23.53.75.05.25.36.06.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 或可連結物件 (使用 PTXOBJ 作為 <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 在遇到問題時不會刪除不完整的結果。這會使建置系統誤以為已產生目標,而實際上存在無法使用的檔案。如果發生錯誤,該腳本現在會刪除輸出檔案。

  • 透過將所有影響建置的選項放入檔案中,然後使建置規則依賴該檔案,當選項變更時,將重新產生輸出檔案。

此腳本還會查看可選引數 STATICSHAREDMODULE,以確定何時將物件編譯目標設定為共用函式庫。BUILD_SHARED_LIBScuda_wrap_srcs() 中被忽略,但在 cuda_add_library() 中會被遵循。在某些系統上,會新增特殊旗標來建置用於共用函式庫的物件。當偵測到共用函式庫編譯時,會定義預處理器巨集 <target_name>_EXPORTS

使用 -D/D 傳遞到 add_definitions 的旗標會沿著傳遞到 nvcc。

結果變數

腳本定義了以下變數

CUDA_VERSION_MAJOR

cuda 的主要版本,由 nvcc 報告。

CUDA_VERSION_MINOR

次要版本。

CUDA_VERSIONCUDA_VERSION_STRING

完整版本,格式為 X.Y

CUDA_HAS_FP16

新增於版本 3.6: 是否支援短浮點數 (float16fp16)。

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+。