Skip to content

Commit 2a2375a

Browse files
authored
fix(iluvatar): compile bindings without CMake CUDA language (#613)
1 parent 41812a1 commit 2a2375a

2 files changed

Lines changed: 65 additions & 31 deletions

File tree

CMakeLists.txt

Lines changed: 16 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
cmake_minimum_required(VERSION 3.18)
22
project(InfiniOps LANGUAGES CXX)
33

4+
if(POLICY CMP0116)
5+
cmake_policy(SET CMP0116 NEW)
6+
endif()
7+
48
set(CMAKE_CXX_STANDARD 17)
59
set(CMAKE_CXX_STANDARD_REQUIRED ON)
610

@@ -237,34 +241,24 @@ if(WITH_NVIDIA)
237241
find_package(CUDAToolkit REQUIRED)
238242
endif()
239243

240-
# Iluvatar: CUDA-compatible device, uses `clang++` with `-x ivcore` (not `nvcc`).
244+
# Iluvatar: CUDA-compatible device. CoreX clang++ works for `-x ivcore`
245+
# compilation, but CMake's CUDA language path appends `-x cuda` and can crash
246+
# the compiler. Keep CMake's CUDA language disabled for this backend and
247+
# compile the few generated dispatch sources that need CUDA syntax via custom
248+
# clang++ commands.
241249
# Reference: `InfiniCore` `xmake/iluvatar.lua`.
242250
if(WITH_ILUVATAR)
243251
add_compile_definitions(WITH_ILUVATAR=1)
244252
set(ILUVATAR_ARCH "ivcore20" CACHE STRING "Iluvatar GPU architecture")
245-
find_program(CLANGXX NAMES clang++)
246-
if(CLANGXX)
247-
set(CMAKE_CUDA_COMPILER "${CLANGXX}" CACHE STRING "Iluvatar CUDA compiler (clang++)")
248-
else()
249-
set(CMAKE_CUDA_COMPILER "clang++" CACHE STRING "Iluvatar CUDA compiler (clang++)")
253+
find_program(ILUVATAR_CUDA_COMPILER NAMES clang++ HINTS /usr/local/corex/bin)
254+
if(NOT ILUVATAR_CUDA_COMPILER)
255+
message(FATAL_ERROR "`WITH_ILUVATAR` is `ON` but CoreX `clang++` was not found.")
250256
endif()
251-
# `-x ivcore` must not be in `CMAKE_CUDA_FLAGS` — CMake passes those flags
252-
# to both compile and link steps. During linking, `-x ivcore` causes
253-
# `clang++` to re-parse `.o` files as source code.
254-
set(CMAKE_CUDA_FLAGS "--cuda-gpu-arch=${ILUVATAR_ARCH} -fPIC -Wno-error=unused-variable -Wno-error=unused-private-field -Wno-unused-variable -std=c++17" CACHE STRING "Iluvatar CUDA flags")
255-
set(CMAKE_CUDA_SEPARABLE_COMPILATION OFF CACHE BOOL "Disable RDC for Iluvatar")
256-
set(CMAKE_CUDA_ARCHITECTURES OFF CACHE STRING "Iluvatar CUDA architectures (passed via CMAKE_CUDA_FLAGS)")
257-
# Iluvatar does not ship `libcudadevrt`, which CMake's compiler test
258-
# tries to link. Disable automatic CUDA runtime linking and link
259-
# manually via `find_package(CUDAToolkit)` instead.
260-
set(CMAKE_CUDA_RUNTIME_LIBRARY NONE)
261-
message(STATUS "Iluvatar: CUDA compiler ${CMAKE_CUDA_COMPILER}, arch ${ILUVATAR_ARCH}")
262-
enable_language(CUDA)
257+
set(ILUVATAR_CUDA_FLAGS
258+
"--cuda-gpu-arch=${ILUVATAR_ARCH};-fPIC;-Wno-error=unused-variable;-Wno-error=unused-private-field;-Wno-unused-variable;-std=c++17;--cuda-path=/usr/local/corex;-x;ivcore"
259+
CACHE STRING "Iluvatar CUDA compiler flags")
260+
message(STATUS "Iluvatar: CUDA compiler ${ILUVATAR_CUDA_COMPILER}, arch ${ILUVATAR_ARCH}")
263261
find_package(CUDAToolkit REQUIRED)
264-
# Add `-x ivcore` as a compile-only flag so it is not passed during
265-
# linking, where it would cause `clang++` to re-parse `.o` files as
266-
# source.
267-
add_compile_options($<$<COMPILE_LANGUAGE:CUDA>:-x$<SEMICOLON>ivcore>)
268262
endif()
269263

270264
if(WITH_METAX)

src/CMakeLists.txt

Lines changed: 49 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -61,19 +61,12 @@ if(WITH_ILUVATAR)
6161

6262
file(GLOB_RECURSE ILUVATAR_SOURCES CONFIGURE_DEPENDS ${ILUVATAR_PATTERNS})
6363

64-
enable_language(CUDA)
65-
6664
target_compile_definitions(infiniops PUBLIC WITH_ILUVATAR=1)
6765
target_sources(infiniops PRIVATE ${ILUVATAR_SOURCES})
6866

6967
find_package(CUDAToolkit REQUIRED)
7068
target_link_libraries(infiniops PUBLIC CUDA::cudart CUDA::cublas CUDA::cuda_driver)
7169

72-
set_target_properties(infiniops PROPERTIES
73-
CUDA_STANDARD 17
74-
CUDA_STANDARD_REQUIRED ON
75-
)
76-
7770
list(APPEND DEVICE_LIST "iluvatar")
7871
endif()
7972

@@ -524,9 +517,56 @@ if(GENERATE_PYTHON_BINDINGS)
524517
endif()
525518
list(APPEND PYBIND11_COMPILE_SOURCES ${PYBIND11_DISPATCH_SOURCES})
526519

527-
# TODO: There might be a better solution.
528-
if(WITH_NVIDIA OR WITH_ILUVATAR)
520+
if(WITH_NVIDIA)
529521
set_source_files_properties(${PYBIND11_COMPILE_SOURCES} PROPERTIES LANGUAGE CUDA)
522+
elseif(WITH_ILUVATAR)
523+
set(_iluvatar_dispatch_include_flags
524+
"-I${CMAKE_CURRENT_SOURCE_DIR}"
525+
"-I${PROJECT_SOURCE_DIR}"
526+
"-I${PROJECT_SOURCE_DIR}/generated")
527+
foreach(_dir IN LISTS TORCH_INCLUDE_DIRS CUDAToolkit_INCLUDE_DIRS)
528+
list(APPEND _iluvatar_dispatch_include_flags "-I${_dir}")
529+
endforeach()
530+
531+
set(_iluvatar_dispatch_defs -DWITH_ILUVATAR=1)
532+
if(WITH_TORCH)
533+
list(APPEND _iluvatar_dispatch_defs -DWITH_TORCH=1)
534+
endif()
535+
if(DEFINED TORCH_CXX11_ABI)
536+
list(APPEND _iluvatar_dispatch_defs "-D_GLIBCXX_USE_CXX11_ABI=${TORCH_CXX11_ABI}")
537+
endif()
538+
539+
set(ILUVATAR_DISPATCH_OBJECTS)
540+
set(_iluvatar_dispatch_object_dir "${CMAKE_CURRENT_BINARY_DIR}/iluvatar_dispatch_objs")
541+
foreach(_src IN LISTS PYBIND11_DISPATCH_SOURCES)
542+
get_filename_component(_name "${_src}" NAME_WE)
543+
set(_obj "${_iluvatar_dispatch_object_dir}/${_name}.o")
544+
set(_dep "${_obj}.d")
545+
set(_depfile_arg)
546+
if(CMAKE_GENERATOR MATCHES "Ninja")
547+
set(_depfile_arg DEPFILE "${_dep}")
548+
endif()
549+
add_custom_command(
550+
OUTPUT "${_obj}"
551+
COMMAND ${CMAKE_COMMAND} -E make_directory "${_iluvatar_dispatch_object_dir}"
552+
COMMAND ${ILUVATAR_CUDA_COMPILER}
553+
${_iluvatar_dispatch_defs}
554+
${_iluvatar_dispatch_include_flags}
555+
${ILUVATAR_CUDA_FLAGS}
556+
-MMD -MF "${_dep}"
557+
-c "${_src}" -o "${_obj}"
558+
DEPENDS "${_src}"
559+
${_depfile_arg}
560+
COMMENT "Compiling ${_name}.cc with CoreX clang++"
561+
VERBATIM
562+
)
563+
list(APPEND ILUVATAR_DISPATCH_OBJECTS "${_obj}")
564+
endforeach()
565+
566+
list(REMOVE_ITEM PYBIND11_COMPILE_SOURCES ${PYBIND11_DISPATCH_SOURCES})
567+
set_source_files_properties(${ILUVATAR_DISPATCH_OBJECTS}
568+
PROPERTIES EXTERNAL_OBJECT TRUE GENERATED TRUE)
569+
list(APPEND PYBIND11_COMPILE_SOURCES ${ILUVATAR_DISPATCH_OBJECTS})
530570
endif()
531571

532572
find_package(Python COMPONENTS Interpreter Development)

0 commit comments

Comments
 (0)