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

  • 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

nvcc 報告的 CUDA 主要版本。

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 程式庫。僅適用於 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+ 版本。