4862247fe2
Заменяет cudaMalloc + cudaIpcGetMemHandle на cuMemCreate (VMM) +
cuMemExportToShareableHandle(POSIX_FILE_DESCRIPTOR). FDs передаются consumer'у
через sendmsg(SCM_RIGHTS) в handshake. Frigate (s6-overlay не даёт share PID)
и любой другой consumer работают БЕЗ pid namespace share — только volume mount
unix socket'a /run/cuframes и IPC share для /dev/shm header.
Sync: cudaEventRecord+IPC events → cuStreamSynchronize в do_publish.
Producer ждёт ~1 ms что stream flush'нулся, потом atomic_store(seq).
Consumer читает seq через memory_order_acquire и копирует DtoD без
event wait — HW coherence гарантирована на одном GPU.
ABI break (согласован с user'ом):
- magic 0xCC7C1DCC → 0xCC7C1DCE (старые consumers fail cleanly)
- protocol V3 → V4
- libcuframes.so.0 SOVERSION остаётся, но .so.0.3.0 → .so.0.4.0
- EXTERNAL ownership убран (VMM требует cuMemCreate-allocated memory,
нельзя export'нуть произвольный cudaMalloc-pointer как POSIX FD)
- cuframes-rtsp-source переведён на LIBRARY mode + один D2D memcpy
в acquire'нутый slot (overhead малый — публишер всё равно делал такой
D2D из FFmpeg hwframe pool в EXTERNAL pool раньше)
Размер: granularity 2 MB на 5090 → NV12 1920×1080 (~3.1 MB) округляется до
4 MB, +1 MB на slot × 16 × 4 камеры = +64 MB VRAM. Терпимо.
Packet ring (cuframes_packets://) НЕ затронут — отдельный SHM с своим
magic, работает как раньше.
PoC + smoke в spike/:
- vmm_fd_pingpong/ — minimal cuMemCreate+FD round-trip
- smoke_v04/ — full publisher+subscriber, 100/100 frames без pid share
Base image: Dockerfile.runtime → CUDA 12.4 (был 13.0). Matching prod
pipeline + Frigate base, иначе libcudart conflict при load.
Compose stack (localhost-infra repo) — параллельный commit:
- убран pid: container:cuframes-pub-parking из subscribers
- image теги: gx/cuframes:0.4, gx/cuda-grid-pipeline:phase8,
gx/frigate:cuframes-v0.4
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
81 lines
2.7 KiB
CMake
81 lines
2.7 KiB
CMake
cmake_minimum_required(VERSION 3.20)
|
||
|
||
# libcuframes — главная shared library
|
||
find_package(CUDAToolkit REQUIRED)
|
||
find_package(Threads REQUIRED)
|
||
|
||
set(CUFRAMES_SOURCES
|
||
src/utils.c
|
||
src/protocol.c
|
||
src/producer.c
|
||
src/consumer.c
|
||
src/consumer_async.c
|
||
src/packet_ring.c
|
||
)
|
||
|
||
add_library(cuframes SHARED ${CUFRAMES_SOURCES})
|
||
add_library(cuframes_static STATIC ${CUFRAMES_SOURCES})
|
||
|
||
foreach(target cuframes cuframes_static)
|
||
target_include_directories(${target}
|
||
PUBLIC
|
||
$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/include>
|
||
$<INSTALL_INTERFACE:include>
|
||
PRIVATE
|
||
${CMAKE_CURRENT_SOURCE_DIR}/src
|
||
)
|
||
target_compile_features(${target} PRIVATE c_std_11)
|
||
target_compile_options(${target} PRIVATE
|
||
-Wall -Wextra -Wpedantic
|
||
-Wno-address-of-packed-member # известная проблема atomics на packed structs (x86_64 ok)
|
||
$<$<CONFIG:Debug>:-O0 -g>
|
||
$<$<CONFIG:Release>:-O2 -g>
|
||
)
|
||
target_link_libraries(${target}
|
||
PUBLIC
|
||
CUDA::cudart
|
||
CUDA::cuda_driver # v0.4 — cuMemCreate/cuMemMap/cuMemExportToShareableHandle
|
||
Threads::Threads
|
||
rt # для shm_open
|
||
)
|
||
endforeach()
|
||
|
||
# Set SOVERSION на shared lib для ABI tracking
|
||
set_target_properties(cuframes PROPERTIES
|
||
VERSION 0.4.0
|
||
SOVERSION 0
|
||
)
|
||
|
||
# Optionally — explicit visibility для exports. C-linkage уже handled extern "C"
|
||
# в header'е. Используем -fvisibility=hidden + указываем default для public symbols
|
||
# через __attribute__((visibility("default"))). Но мы это сделаем в v0.2 — пока
|
||
# default visibility внутри source files.
|
||
target_compile_definitions(cuframes PRIVATE CUFRAMES_BUILDING_DLL)
|
||
target_compile_definitions(cuframes_static PRIVATE CUFRAMES_STATIC_LIB)
|
||
|
||
# Override default fvisibility (на текущем этапе экспортируем всё)
|
||
foreach(target cuframes cuframes_static)
|
||
set_target_properties(${target} PROPERTIES
|
||
C_VISIBILITY_PRESET default
|
||
)
|
||
endforeach()
|
||
|
||
# Install rules — нужны для downstream проектов которые используют cmake --install
|
||
# (FFmpeg-cuframes Dockerfile builders, deb-пакетирование).
|
||
include(GNUInstallDirs)
|
||
install(TARGETS cuframes cuframes_static
|
||
EXPORT cuframesTargets
|
||
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||
)
|
||
install(DIRECTORY ${CMAKE_SOURCE_DIR}/include/cuframes
|
||
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
|
||
FILES_MATCHING PATTERN "*.h" PATTERN "*.hpp"
|
||
)
|
||
|
||
# Tests
|
||
if(BUILD_TESTING)
|
||
add_subdirectory(tests)
|
||
endif()
|