Skip to content

Commit a7666ec

Browse files
committed
Update Cmake infra to run HIP CXX tests using top-level cmake
1 parent 650f542 commit a7666ec

File tree

7 files changed

+37
-385
lines changed

7 files changed

+37
-385
lines changed

CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,10 @@ if(FLASHINFER_ENABLE_HIP)
232232

233233
endif()
234234

235+
if(FLASHINFER_UNITTESTS)
236+
enable_testing()
237+
endif()
238+
235239
# Add library subdirectories
236240
add_subdirectory(libflashinfer)
237241

cmake/Dependencies.cmake

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,9 @@ endif()
2121

2222
# === Test Dependencies ===
2323
if(FLASHINFER_UNITTESTS)
24-
include(FetchContent)
25-
26-
# Google Test for unit testing
27-
FetchContent_Declare(
28-
googletest
29-
GIT_REPOSITORY https://github.com/google/googletest.git
30-
GIT_TAG 6910c9d9165801d8827d628cb72eb7ea9dd538c5 # release-1.16.0
31-
FIND_PACKAGE_ARGS NAMES GTest)
32-
FetchContent_MakeAvailable(googletest)
24+
find_package(GTest REQUIRED)
25+
include(GoogleTest)
26+
message(STATUS "Found GoogleTest: ${GTEST_INCLUDE_DIRS}")
3327
endif()
3428

3529
# === Benchmark Dependencies ===

cmake/Options.cmake

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -73,10 +73,10 @@ flashinfer_option(FLASHINFER_PY_LIMITED_API "Use Python's limited API for better
7373
flashinfer_option(FLASHINFER_MIN_PYTHON_ABI "Minimum Python ABI version for limited API compatibility" "3.9")
7474

7575
# === CUDA OPTIONS ===
76-
flashinfer_option(FLASHINFER_ENABLE_CUDA "Enable NVIDIA CUDA backend" ON)
76+
flashinfer_option(FLASHINFER_ENABLE_CUDA "Enable NVIDIA CUDA backend" OFF)
7777

7878
# === HIP/ROCm OPTIONS ===
79-
flashinfer_option(FLASHINFER_ENABLE_HIP "Enable AMD HIP/ROCm backend" OFF)
79+
flashinfer_option(FLASHINFER_ENABLE_HIP "Enable AMD HIP/ROCm backend" ON)
8080
flashinfer_option(FLASHINFER_HIP_ARCHITECTURES "AMD GPU architectures to target" "")
8181

8282
# === AUTO-DERIVED OPTIONS ===
@@ -112,22 +112,24 @@ if(FLASHINFER_ENABLE_HIP AND FLASHINFER_ENABLE_CUDA)
112112
endif()
113113

114114
# Handle CUDA architectures
115-
if(FLASHINFER_CUDA_ARCHITECTURES)
116-
message(STATUS "CMAKE_CUDA_ARCHITECTURES set to ${FLASHINFER_CUDA_ARCHITECTURES}.")
117-
else()
118-
# No user-provided architectures, try to detect the CUDA archs based on where
119-
# the project is being built
120-
set(detected_archs "")
121-
detect_cuda_architectures(detected_archs)
122-
if(detected_archs)
123-
set(FLASHINFER_CUDA_ARCHITECTURES ${detected_archs} CACHE STRING
124-
"CUDA architectures" FORCE)
125-
message(STATUS "Setting FLASHINFER_CUDA_ARCHITECTURES to detected values: ${FLASHINFER_CUDA_ARCHITECTURES}")
115+
if(FLASHINFER_ENABLE_CUDA)
116+
if(FLASHINFER_CUDA_ARCHITECTURES)
117+
message(STATUS "CMAKE_CUDA_ARCHITECTURES set to ${FLASHINFER_CUDA_ARCHITECTURES}.")
126118
else()
127-
# No architectures detected, use safe defaults
128-
set(FLASHINFER_CUDA_ARCHITECTURES "75;80;86" CACHE STRING
129-
"CUDA architectures to compile for" FORCE)
130-
message(STATUS "No architectures detected, using defaults: ${FLASHINFER_CUDA_ARCHITECTURES}")
119+
# No user-provided architectures, try to detect the CUDA archs based on where
120+
# the project is being built
121+
set(detected_archs "")
122+
detect_cuda_architectures(detected_archs)
123+
if(detected_archs)
124+
set(FLASHINFER_CUDA_ARCHITECTURES ${detected_archs} CACHE STRING
125+
"CUDA architectures" FORCE)
126+
message(STATUS "Setting FLASHINFER_CUDA_ARCHITECTURES to detected values: ${FLASHINFER_CUDA_ARCHITECTURES}")
127+
else()
128+
# No architectures detected, use safe defaults
129+
set(FLASHINFER_CUDA_ARCHITECTURES "75;80;86" CACHE STRING
130+
"CUDA architectures to compile for" FORCE)
131+
message(STATUS "No architectures detected, using defaults: ${FLASHINFER_CUDA_ARCHITECTURES}")
132+
endif()
131133
endif()
132134
endif()
133135

cmake/utils/ConfigureTargets.cmake

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# cmake-format: off
22
# Common configuration function for tests and benchmarks
33
function(configure_flashinfer_target)
4-
set(options IS_GTEST IS_BENCHMARK)
4+
set(options IS_GTEST IS_BENCHMARK IS_HIP)
55
set(oneValueArgs TARGET_NAME)
66
set(multiValueArgs SOURCES LINK_LIBS COMPILE_FLAGS INCLUDE_DIRS)
77

@@ -27,6 +27,10 @@ function(configure_flashinfer_target)
2727
# Create executable target
2828
add_executable(${arg_TARGET_NAME} EXCLUDE_FROM_ALL ${arg_SOURCES})
2929

30+
if(arg_IS_HIP)
31+
set_source_files_properties(${arg_SOURCES} PROPERTIES LANGUAGE HIP)
32+
endif()
33+
3034
# Add all include directories
3135
target_include_directories(
3236
${arg_TARGET_NAME}
@@ -40,9 +44,6 @@ function(configure_flashinfer_target)
4044
target_include_directories(${arg_TARGET_NAME} PRIVATE ${extra_include_dir})
4145
endforeach()
4246

43-
# Add dispatch_inc dependency
44-
add_dependencies(${arg_TARGET_NAME} dispatch_inc)
45-
4647
# Add benchmark-specific library for benchmarks
4748
if(arg_IS_BENCHMARK)
4849
target_link_libraries(${arg_TARGET_NAME} PRIVATE nvbench::main)
@@ -59,12 +60,10 @@ function(configure_flashinfer_target)
5960

6061
# Add Google Test libraries if required
6162
if(arg_IS_GTEST)
62-
target_include_directories(${arg_TARGET_NAME} PRIVATE
63-
${gtest_SOURCE_DIR}/include
64-
${gtest_SOURCE_DIR})
65-
target_link_libraries(${arg_TARGET_NAME} PRIVATE gtest gtest_main)
63+
target_link_libraries(${arg_TARGET_NAME} PRIVATE GTest::gtest GTest::gtest_main Threads::Threads)
6664
endif()
6765

66+
6867
# Register with CTest if it's a test
6968
if(NOT arg_IS_BENCHMARK)
7069
add_test(NAME ${arg_TARGET_NAME} COMMAND ${arg_TARGET_NAME})

libflashinfer/CMakeLists.txt

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,9 @@ message(STATUS "HEAD_DIMS_SM90=${HEAD_DIMS_SM90}")
6464
# the DECODE_KERNELS_SRCS, PREFILL_KERNELS_SRCS, and DISPATCH_INC_FILE
6565
# variables.
6666
include(ConfigureKernelGeneration)
67-
flashinfer_configure_kernel_generation()
67+
if(FLASHINFER_BUILD_KERNELS)
68+
flashinfer_configure_kernel_generation()
69+
endif()
6870
# ---------------------------------------------------------------------------#
6971

7072
# Set the install path for the libflashinfer headers based on whether the build
@@ -97,10 +99,7 @@ flashinfer_generate_config_header(
9799
# ---------------------------------------------------------------------------#
98100

99101
# Build decode_kernels and prefill_kernels if needed
100-
if(FLASHINFER_BUILD_KERNELS
101-
OR FLASHINFER_UNITTESTS
102-
OR FLASHINFER_CXX_BENCHMARKS)
103-
102+
if(FLASHINFER_BUILD_KERNELS)
104103
set(FLASHINFER_KERNEL_TARGETS "")
105104

106105
add_library(decode_kernels STATIC ${DECODE_KERNELS_SRCS})

libflashinfer/tests/CMakeLists.txt

Lines changed: 0 additions & 162 deletions
Original file line numberDiff line numberDiff line change
@@ -9,165 +9,3 @@ include(GoogleTest)
99
find_package(Threads REQUIRED)
1010

1111
# cmake-format: off
12-
# === Core Tests Configuration ===
13-
14-
# Single and batch decode tests
15-
configure_flashinfer_target(
16-
TARGET_NAME test_single_decode
17-
SOURCES "test_single_decode.cu"
18-
LINK_LIBS "decode_kernels"
19-
IS_GTEST ON
20-
)
21-
22-
configure_flashinfer_target(
23-
TARGET_NAME test_batch_decode
24-
SOURCES "test_batch_decode.cu"
25-
LINK_LIBS "decode_kernels"
26-
IS_GTEST ON
27-
)
28-
29-
# Single and batch prefill tests
30-
configure_flashinfer_target(
31-
TARGET_NAME test_single_prefill
32-
SOURCES "test_single_prefill.cu"
33-
LINK_LIBS "prefill_kernels"
34-
IS_GTEST ON
35-
)
36-
37-
configure_flashinfer_target(
38-
TARGET_NAME test_batch_prefill
39-
SOURCES "test_batch_prefill.cu"
40-
LINK_LIBS "prefill_kernels"
41-
IS_GTEST ON
42-
)
43-
44-
# Other core tests
45-
configure_flashinfer_target(
46-
TARGET_NAME test_page
47-
SOURCES "test_page.cu"
48-
IS_GTEST ON
49-
)
50-
51-
configure_flashinfer_target(
52-
TARGET_NAME test_cascade
53-
SOURCES "test_cascade.cu"
54-
LINK_LIBS "decode_kernels;prefill_kernels"
55-
IS_GTEST ON
56-
)
57-
58-
configure_flashinfer_target(
59-
TARGET_NAME test_sampling
60-
SOURCES "test_sampling.cu"
61-
IS_GTEST ON
62-
)
63-
64-
configure_flashinfer_target(
65-
TARGET_NAME test_norm
66-
SOURCES "test_norm.cu"
67-
IS_GTEST ON
68-
)
69-
70-
configure_flashinfer_target(
71-
TARGET_NAME test_fastdiv
72-
SOURCES "test_fastdiv.cu"
73-
IS_GTEST ON
74-
)
75-
76-
configure_flashinfer_target(
77-
TARGET_NAME test_fast_dequant
78-
SOURCES "test_fast_dequant.cu"
79-
IS_GTEST ON
80-
)
81-
82-
# === Distributed Test Configuration ===
83-
if(FLASHINFER_DIST_UNITTESTS)
84-
set(DIST_INCLUDE_DIRS
85-
"${FLASHINFER_INCLUDE_DIR}"
86-
"${mscclpp_SOURCE_DIR}/include"
87-
)
88-
89-
# Add spdlog include directory if available
90-
if(DEFINED SPDLOG_INCLUDE_DIR)
91-
list(APPEND DIST_INCLUDE_DIRS "${SPDLOG_INCLUDE_DIR}")
92-
elseif(TARGET spdlog::spdlog)
93-
# If found via find_package
94-
get_target_property(SPDLOG_INCLUDE_DIRS spdlog::spdlog INTERFACE_INCLUDE_DIRECTORIES)
95-
list(APPEND DIST_INCLUDE_DIRS "${SPDLOG_INCLUDE_DIRS}")
96-
endif()
97-
98-
configure_flashinfer_target(
99-
TARGET_NAME test_sum_all_reduce
100-
SOURCES "test_sum_all_reduce.cu"
101-
LINK_LIBS "MPI::MPI_CXX;flashinfer::mscclpp"
102-
COMPILE_FLAGS "-DENABLE_MPI"
103-
INCLUDE_DIRS "${DIST_INCLUDE_DIRS}"
104-
IS_GTEST OFF
105-
)
106-
107-
configure_flashinfer_target(
108-
TARGET_NAME test_attn_all_reduce
109-
SOURCES "test_attn_all_reduce.cu"
110-
LINK_LIBS "MPI::MPI_CXX;flashinfer::mscclpp"
111-
COMPILE_FLAGS "-DENABLE_MPI"
112-
IS_GTEST OFF
113-
)
114-
endif()
115-
116-
# === FP8 Test Configuration ===
117-
if(FLASHINFER_FP8_TESTS)
118-
# Set path to FP8 utilities
119-
set(FP8_UTILS_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../utils/fp8)
120-
121-
# Define FP8-specific CUDA compile flags - one per line for readability
122-
set(FP8_CUDA_FLAGS_LIST
123-
--expt-extended-lambda
124-
--use_fast_math
125-
--generate-code=arch=compute_90a,code=sm_90a
126-
)
127-
128-
# Combine the list into a generator expression for CUDA language only
129-
string(JOIN ";" FP8_CUDA_FLAGS_JOINED "${FP8_CUDA_FLAGS_LIST}")
130-
set(FP8_CUDA_FLAGS "$<$<COMPILE_LANGUAGE:CUDA>:${FP8_CUDA_FLAGS_JOINED}>")
131-
132-
# Define FP8-specific include directories
133-
set(FP8_INCLUDE_DIRS
134-
"${TORCH_INCLUDE_DIRS}"
135-
"${CUDA_INCLUDE_DIRS}"
136-
"${Python3_INCLUDE_DIRS}"
137-
"${FA3_INCLUDE_DIR}"
138-
"${CUTLASS_INCLUDE_DIRS}"
139-
"${FP8_UTILS_DIR}"
140-
)
141-
142-
# Add the FP8 test with improved readability
143-
configure_flashinfer_target(
144-
TARGET_NAME test_single_prefill_fa3_sm90
145-
SOURCES "fp8/test_single_prefill_fa3_sm90.cu"
146-
LINK_LIBS "FA3_LIB;${TORCH_LIBRARIES}"
147-
COMPILE_FLAGS "${FP8_CUDA_FLAGS}"
148-
INCLUDE_DIRS "${FP8_INCLUDE_DIRS}"
149-
)
150-
endif()
151-
152-
# cmake-format: on
153-
154-
# === Test Discovery and Targets ===
155-
message(STATUS "All unit test targets: ${ALL_TEST_TARGETS}")
156-
157-
# Use GoogleTest's discover_tests to find all test cases
158-
foreach(test_target IN LISTS ALL_TEST_TARGETS)
159-
if(TARGET ${test_target})
160-
gtest_discover_tests(${test_target})
161-
endif()
162-
endforeach()
163-
164-
# Create target to build all tests
165-
add_custom_target(build_tests)
166-
add_dependencies(build_tests ${ALL_TEST_TARGETS})
167-
168-
# Setup "check" target similar to autotools
169-
set(CMAKE_CTEST_COMMAND ctest --progress --output-on-failure)
170-
add_custom_target(check COMMAND ${CMAKE_COMMAND} ${CMAKE_CTEST_COMMAND})
171-
add_dependencies(check build_tests)
172-
173-
enable_testing()

0 commit comments

Comments
 (0)