Как CMake работает с CUDA
С версии 3.18 CMake имеет нативную поддержку CUDA:
project(gpu LANGUAGES CXX CUDA)
Минимальный CUDA-проект
cmake_minimum_required(VERSION 3.24)
project(cuda_app LANGUAGES CXX CUDA)
add_executable(cuda_app main.cpp kernel.cu)
set_target_properties(cuda_app PROPERTIES
CUDA_SEPARABLE_COMPILATION ON
)
target_compile_features(cuda_app PUBLIC cxx_std_20)
Compute Capability
set_property(TARGET cuda_app PROPERTY CUDA_ARCHITECTURES 75 86)
Или:
cmake -DCMAKE_CUDA_ARCHITECTURES=86 ..
Статическая CUDA-библиотека
add_library(cuda_core STATIC kernel.cu)
set_target_properties(cuda_core PROPERTIES
CUDA_SEPARABLE_COMPILATION ON
)
target_link_libraries(cuda_core PUBLIC CUDA::cudart)
CUDA + Qt
Qt UI + GPU backend:
gui → gpu_backend → cuda_core
gpu_backend:
add_library(gpu_backend STATIC gpu.cpp) target_link_libraries(gpu_backend PUBLIC cuda_core Qt6::Core)
app:
target_link_libraries(app PRIVATE gpu_backend)
Включение NVCC flags
target_compile_options(cuda_core PRIVATE
$<$<COMPILE_LANGUAGE:CUDA>:--use_fast_math>
)
Debugging CUDA
set(CMAKE_CUDA_FLAGS_DEBUG "-G -lineinfo")
CUDA + Tests
add_executable(cuda_tests test_gpu.cpp) target_link_libraries(cuda_tests PRIVATE cuda_core) add_test(NAME gpu COMMAND cuda_tests)
Cross-platform GPU backend
Абстракция:
class IGpuBackend {
public:
virtual void process() = 0;
};
CUDA-реализация — плагин.
CI для CUDA
GitHub Actions:
- run: cmake -S . -B build -DCMAKE_CUDA_ARCHITECTURES=86 - run: cmake --build build
