CMake + CUDA

Автор: | 10 февраля, 2026

Как 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