Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 26 additions & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@ name: Build

on:
push:
branches: [ "main", "dev" ]
branches: [ "main" ]
pull_request:
branches: [ "main" ]

jobs:
build:
Expand All @@ -26,3 +28,26 @@ jobs:
cargo build --release
cmake -S . -B build -DCMAKE_CXX_COMPILER=clang++-14 -DCMAKE_C_COMPILER=clang-14 -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DSHUFFLE_METHOD=g++11
cmake --build build -j 32
build-gdr:
runs-on: self-hosted # or `ubuntu-22.04`

steps:
- uses: actions/checkout@v4

- name: Prepare
run: |
sudo apt install -y cmake libuv1-dev liblz4-dev liblzma-dev libdouble-conversion-dev libdwarf-dev libunwind-dev
sudo apt install -y libaio-dev libgflags-dev libgoogle-glog-dev libgtest-dev libgmock-dev clang-format-14 clang-14 clang-tidy-14 lld-14
sudo apt install -y libgoogle-perftools-dev google-perftools libssl-dev gcc-12 g++-12 libboost-all-dev meson rustc cargo
sudo apt install -y nvidia-cuda-toolkit
wget https://github.com/apple/foundationdb/releases/download/7.1.61/foundationdb-clients_7.1.61-1_amd64.deb && sudo dpkg -i foundationdb-clients_7.1.61-1_amd64.deb
git clone https://github.com/libfuse/libfuse.git libfuse -b fuse-3.16.2 --depth 1 && mkdir libfuse/build && cd libfuse/build && meson setup .. && ninja && sudo ninja install && cd ../.. && rm -rf libfuse
git submodule update --init --recursive
./patches/apply.sh

- name: Build
run: |
cargo build --release
cmake -S . -B build -DCMAKE_CXX_COMPILER=clang++-14 -DCMAKE_C_COMPILER=clang-14 -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DSHUFFLE_METHOD=g++11 -DHF3FS_ENABLE_GDR=ON
cmake --build build -j 32
ctest --test-dir build -R test_gdr --output-on-failure
1 change: 1 addition & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,7 @@ include(cmake/DumpConfig.cmake)
include(cmake/Jemalloc.cmake)
include(cmake/ApacheArrow.cmake)
include(cmake/AddCrate.cmake)
include(cmake/Cuda.cmake)
configure_file(cmake/CTestCustom.cmake ${CMAKE_BINARY_DIR} @ONLY)

add_subdirectory(src)
Expand Down
4 changes: 2 additions & 2 deletions cmake/CLangFormat.cmake
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
set(CLANG_FORMAT "/usr/bin/clang-format-14")
if(EXISTS ${CLANG_FORMAT})
find_program(CLANG_FORMAT NAMES clang-format-14 clang-format)
if(CLANG_FORMAT)
message(STATUS "Found clang-format at ${CLANG_FORMAT}")

set(SOURCE_DIRS
Expand Down
89 changes: 89 additions & 0 deletions cmake/Cuda.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
# CUDA/GDR Support for 3FS
#
# This module provides optional CUDA support for GPU Direct RDMA (GDR).
# GDR enables direct data transfers between storage and GPU memory.
#
# Options:
# HF3FS_ENABLE_GDR - Enable GPU Direct RDMA support (default: OFF)
#
# When HF3FS_ENABLE_GDR is ON:
# - CUDA Toolkit will be searched
# - HF3FS_ENABLE_GDR=1 will be defined for opted-in targets
# - CUDA libraries will be linked to relevant targets
#
# Usage in CMakeLists.txt:
# include(cmake/Cuda.cmake)
# target_add_gdr_support(mytarget SCOPE PRIVATE)

option(HF3FS_ENABLE_GDR "Enable GPU Direct RDMA (GDR) support" OFF)

set(HF3FS_CUDA_LIBRARIES "")
set(HF3FS_CUDA_INCLUDE_DIRS "")

if(HF3FS_ENABLE_GDR)
message(STATUS "GDR support requested, searching for CUDA...")

# Try to find CUDA Toolkit
# CMake 3.17+ has FindCUDAToolkit which is preferred
if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.17")
find_package(CUDAToolkit QUIET)
if(CUDAToolkit_FOUND)
if(NOT TARGET CUDA::cudart OR NOT TARGET CUDA::cuda_driver)
message(FATAL_ERROR
"CUDAToolkit was found, but required CUDA::cudart and CUDA::cuda_driver targets are unavailable")
endif()
set(HF3FS_CUDA_LIBRARIES CUDA::cudart CUDA::cuda_driver)
set(HF3FS_CUDA_INCLUDE_DIRS ${CUDAToolkit_INCLUDE_DIRS})
message(STATUS "Found CUDA Toolkit ${CUDAToolkit_VERSION}")
message(STATUS " CUDA include: ${CUDAToolkit_INCLUDE_DIRS}")
message(STATUS " CUDA libraries: CUDA::cudart;CUDA::cuda_driver")
endif()
else()
# Fallback for older CMake
find_package(CUDA QUIET)
if(CUDA_FOUND AND CUDA_CUDA_LIBRARY)
set(HF3FS_CUDA_LIBRARIES ${CUDA_LIBRARIES} ${CUDA_CUDA_LIBRARY})
list(REMOVE_DUPLICATES HF3FS_CUDA_LIBRARIES)
set(HF3FS_CUDA_INCLUDE_DIRS ${CUDA_INCLUDE_DIRS})
message(STATUS "Found CUDA ${CUDA_VERSION}")
message(STATUS " CUDA include: ${CUDA_INCLUDE_DIRS}")
message(STATUS " CUDA libraries: ${HF3FS_CUDA_LIBRARIES}")
elseif(CUDA_FOUND)
message(STATUS "Legacy CUDA discovery did not provide the required driver library")
endif()
endif()

if(NOT HF3FS_CUDA_LIBRARIES)
message(FATAL_ERROR
"HF3FS_ENABLE_GDR=ON requires CUDA runtime and driver libraries, but required CUDA components were not found")
endif()

message(STATUS "GDR support enabled")

# Check for nvidia_peermem (informational only)
if(EXISTS "/sys/module/nvidia_peermem")
message(STATUS "nvidia_peermem module detected")
else()
message(STATUS "nvidia_peermem module not detected (required at runtime for GDR)")
endif()
else()
message(STATUS "GDR support disabled (use -DHF3FS_ENABLE_GDR=ON to enable)")
endif()

# Helper function to add GDR support to a target
function(target_add_gdr_support TARGET)
cmake_parse_arguments(GDR "" "SCOPE" "" ${ARGN})
if(NOT GDR_SCOPE)
set(GDR_SCOPE PRIVATE)
endif()

if(HF3FS_ENABLE_GDR)
target_compile_definitions(${TARGET} ${GDR_SCOPE} HF3FS_ENABLE_GDR=1)
target_include_directories(${TARGET} PRIVATE ${HF3FS_CUDA_INCLUDE_DIRS})
# Project targets use the plain target_link_libraries signature. Keeping
# that signature also propagates CUDA link requirements from static
# libraries to their final consumers.
target_link_libraries(${TARGET} ${HF3FS_CUDA_LIBRARIES})
message(STATUS "Added GDR support to target: ${TARGET} (${GDR_SCOPE})")
endif()
endfunction()
Loading