Skip to content
Draft
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
3 changes: 3 additions & 0 deletions .clang-format
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
---
BasedOnStyle: Google
...
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
# Generated files
build/

# Prerequisites
*.d

Expand Down
197 changes: 197 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,197 @@
cmake_minimum_required(VERSION 3.18)
project(InfiniRT LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# Options for backends.
option(WITH_CPU "Enable CPU backend" OFF)
option(WITH_NVIDIA "Enable CUDA backend" OFF)
option(WITH_ILUVATAR "Enable Iluvatar GPU backend" OFF)
option(WITH_METAX "Enable MetaX backend" OFF)
option(WITH_CAMBRICON "Enable Cambricon backend" OFF)
option(WITH_MOORE "Enable Moore backend" OFF)
option(WITH_ASCEND "Enable Ascend backend" OFF)

option(AUTO_DETECT_DEVICES "Automatically detect available devices" OFF)

if(AUTO_DETECT_DEVICES)
message(STATUS "Auto-detecting available devices...")

set(WITH_CPU ON)

file(GLOB NVIDIA_DEV_FILES "/dev/nvidia*")

if(NVIDIA_DEV_FILES)
set(WITH_NVIDIA ON)
message(STATUS "Auto-detected NVIDIA environment.")
endif()

file(GLOB ILUVATAR_DEV_FILES "/dev/iluvatar*")

if(ILUVATAR_DEV_FILES)
set(WITH_ILUVATAR ON)
message(STATUS "Auto-detected Iluvatar environment.")
endif()

if(DEFINED ENV{MACA_PATH})
set(WITH_METAX ON)
message(STATUS "Auto-detected MetaX environment from MACA_PATH")
else()
execute_process(
COMMAND sh -c "grep -h 9999 /sys/bus/pci/devices/*/vendor 2>/dev/null"
OUTPUT_VARIABLE _pci_vendor_output
OUTPUT_STRIP_TRAILING_WHITESPACE
)

string(FIND "${_pci_vendor_output}" "9999" _found_pos)

if(_found_pos GREATER -1)
set(WITH_METAX ON)
message(STATUS "Detected MetaX GPU from PCI vendor ID 0x9999")
else()
set(WITH_METAX OFF)
message(STATUS "No MetaX GPU detected")
endif()
endif()

if(DEFINED ENV{NEUWARE_HOME})
set(WITH_CAMBRICON ON)
message(STATUS "Auto-detected Cambricon environment.")
endif()

if(DEFINED ENV{MUSA_ROOT} OR DEFINED ENV{MUSA_HOME} OR DEFINED ENV{MUSA_PATH})
set(WITH_MOORE ON)
set(WITH_MOORE ON CACHE BOOL "Enable Moore backend" FORCE)
message(STATUS "Auto-detected Moore environment.")
else()
set(WITH_MOORE OFF)
set(WITH_MOORE OFF CACHE BOOL "Enable Moore backend" FORCE)
endif()

if(DEFINED ENV{ASCEND_HOME_PATH} OR EXISTS "/dev/davinci0")
set(WITH_ASCEND ON)
message(STATUS "Auto-detected Ascend environment.")
endif()
endif()

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/src)

# Only one CUDA-like GPU backend can be enabled at a time.
set(_gpu_backend_count 0)
foreach(_gpu_backend WITH_NVIDIA WITH_ILUVATAR WITH_METAX WITH_MOORE WITH_ASCEND)
if(${_gpu_backend})
math(EXPR _gpu_backend_count "${_gpu_backend_count} + 1")
endif()
endforeach()

if(_gpu_backend_count GREATER 1)
message(FATAL_ERROR "`WITH_NVIDIA`, `WITH_ILUVATAR`, `WITH_METAX`, `WITH_MOORE`, and `WITH_ASCEND` are mutually exclusive. Build one GPU backend at a time.")
endif()

if(WITH_NVIDIA)
add_compile_definitions(WITH_NVIDIA=1)
enable_language(CUDA)
find_package(CUDAToolkit REQUIRED)
endif()

# Iluvatar: CUDA-compatible device, uses `clang++` with `-x ivcore` (not `nvcc`).
if(WITH_ILUVATAR)
add_compile_definitions(WITH_ILUVATAR=1)
set(ILUVATAR_ARCH "ivcore20" CACHE STRING "Iluvatar GPU architecture")
find_program(CLANGXX NAMES clang++)
if(CLANGXX)
set(CMAKE_CUDA_COMPILER "${CLANGXX}" CACHE STRING "Iluvatar CUDA compiler (clang++)")
else()
set(CMAKE_CUDA_COMPILER "clang++" CACHE STRING "Iluvatar CUDA compiler (clang++)")
endif()
set(CMAKE_CUDA_FLAGS "-x ivcore -std=c++17 --cuda-gpu-arch=${ILUVATAR_ARCH} -fPIC -Wno-error=unused-variable -Wno-error=unused-private-field -Wno-unused-variable" CACHE STRING "Iluvatar CUDA flags")
set(CMAKE_CUDA_SEPARABLE_COMPILATION OFF CACHE BOOL "Disable RDC for Iluvatar")
message(STATUS "Iluvatar: CUDA compiler ${CMAKE_CUDA_COMPILER}, arch ${ILUVATAR_ARCH}")
enable_language(CUDA)
find_package(CUDAToolkit REQUIRED)
endif()

if(WITH_METAX)
add_compile_definitions(WITH_METAX=1)

# Normally can be found at: `/opt/maca/`.
set(MACA_PATH $ENV{MACA_PATH})
set(CMAKE_C_COMPILER ${CMAKE_CURRENT_SOURCE_DIR}/scripts/mxcc_wrapper.sh)
set(CMAKE_CXX_COMPILER ${CMAKE_CURRENT_SOURCE_DIR}/scripts/mxcc_wrapper.sh)

include_directories("${MACA_PATH}/include")
link_directories("${MACA_PATH}/lib")

# Libraries: mcruntime / mcdnn / mcblas.
find_library(MACA_RUNTIME_LIB NAMES mcruntime HINTS "${MACA_PATH}/lib" REQUIRED)
endif()

if(WITH_MOORE)
add_compile_definitions(WITH_MOORE=1)

set(MUSA_ROOT "")
foreach(_musa_env MUSA_ROOT MUSA_HOME MUSA_PATH)
if(NOT MUSA_ROOT AND DEFINED ENV{${_musa_env}} AND NOT "$ENV{${_musa_env}}" STREQUAL "")
set(MUSA_ROOT "$ENV{${_musa_env}}")
endif()
endforeach()

if(NOT MUSA_ROOT AND EXISTS "/usr/local/musa")
set(MUSA_ROOT "/usr/local/musa")
endif()

if(NOT MUSA_ROOT)
message(FATAL_ERROR "`WITH_MOORE` is `ON` but `MUSA_ROOT`/`MUSA_HOME`/`MUSA_PATH` is not set and `/usr/local/musa` was not found.")
endif()

if(NOT EXISTS "${MUSA_ROOT}/bin/mcc")
message(FATAL_ERROR "Could not find `mcc` under `${MUSA_ROOT}/bin`.")
endif()

message(STATUS "Using Moore from `${MUSA_ROOT}`.")

set(CMAKE_C_COMPILER ${CMAKE_CURRENT_SOURCE_DIR}/scripts/mcc_wrapper.sh)
set(CMAKE_CXX_COMPILER ${CMAKE_CURRENT_SOURCE_DIR}/scripts/mcc_wrapper.sh)

include_directories("${MUSA_ROOT}/include")
link_directories("${MUSA_ROOT}/lib")

find_library(MUSA_LIB NAMES musa HINTS "${MUSA_ROOT}/lib" REQUIRED)
find_library(MUSART_LIB NAMES musart HINTS "${MUSA_ROOT}/lib" REQUIRED)
endif()

if(WITH_CAMBRICON)
add_compile_definitions(WITH_CAMBRICON=1)
set(NEUWARE_HOME $ENV{NEUWARE_HOME})

include_directories("${NEUWARE_HOME}/include")
link_directories("${NEUWARE_HOME}/lib")
link_directories("${NEUWARE_HOME}/lib64")

# Libraries: `cnrt`.
find_library(CAMBRICON_RUNTIME_LIB NAMES cnrt HINTS "${NEUWARE_HOME}/lib64" REQUIRED)
endif()

if(WITH_ASCEND)
add_compile_definitions(WITH_ASCEND=1)
if(NOT DEFINED ASCEND_HOME)
if(DEFINED ENV{ASCEND_HOME_PATH} AND NOT "$ENV{ASCEND_HOME_PATH}" STREQUAL "")
set(ASCEND_HOME "$ENV{ASCEND_HOME_PATH}" CACHE PATH "Ascend toolkit root")
else()
set(ASCEND_HOME "/usr/local/Ascend/ascend-toolkit/latest" CACHE PATH "Ascend toolkit root")
endif()
endif()
if(NOT EXISTS "${ASCEND_HOME}")
message(FATAL_ERROR "`WITH_ASCEND` is ON but `${ASCEND_HOME}` was not found. Set ASCEND_HOME_PATH.")
endif()
message(STATUS "Using Ascend from `${ASCEND_HOME}`.")
endif()

# If all other platforms are not enabled, CPU is enabled by default.
if(NOT WITH_NVIDIA AND NOT WITH_ILUVATAR AND NOT WITH_METAX AND NOT WITH_MOORE AND NOT WITH_CAMBRICON AND NOT WITH_ASCEND)
set(WITH_CPU ON CACHE BOOL "Enable CPU backend" FORCE)
add_compile_definitions(WITH_CPU=1)
endif()

add_subdirectory(src)
109 changes: 109 additions & 0 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
add_library(infinirt SHARED)

include(GNUInstallDirs)

file(GLOB BASE_SRCS CONFIGURE_DEPENDS "*.cc")
target_sources(infinirt PRIVATE ${BASE_SRCS})

if(WITH_CPU)
target_compile_definitions(infinirt PUBLIC WITH_CPU=1)

find_package(OpenMP REQUIRED)
target_link_libraries(infinirt PRIVATE OpenMP::OpenMP_CXX)
endif()

if(WITH_NVIDIA)
enable_language(CUDA)

target_compile_definitions(infinirt PUBLIC WITH_NVIDIA=1)

find_package(CUDAToolkit REQUIRED)
target_link_libraries(infinirt PUBLIC CUDA::cudart)

set_target_properties(infinirt PROPERTIES
CUDA_STANDARD 17
CUDA_STANDARD_REQUIRED ON
)
endif()

if(WITH_ILUVATAR)
enable_language(CUDA)

target_compile_definitions(infinirt PUBLIC WITH_ILUVATAR=1)

find_package(CUDAToolkit REQUIRED)
target_link_libraries(infinirt PUBLIC CUDA::cudart)

set_target_properties(infinirt PROPERTIES
CUDA_STANDARD 17
CUDA_STANDARD_REQUIRED ON
)
endif()

if(WITH_METAX)
target_compile_definitions(infinirt PRIVATE WITH_METAX=1)

target_include_directories(infinirt PUBLIC "${MACA_PATH}/include")
target_link_libraries(infinirt PUBLIC ${MACA_RUNTIME_LIB})
endif()

if(WITH_MOORE)
target_compile_definitions(infinirt PRIVATE WITH_MOORE=1)

target_include_directories(infinirt PUBLIC "${MUSA_ROOT}/include")
target_link_libraries(infinirt PUBLIC ${MUSA_LIB} ${MUSART_LIB})
endif()

if(WITH_CAMBRICON)
target_compile_definitions(infinirt PRIVATE WITH_CAMBRICON=1)

target_include_directories(infinirt PUBLIC "${NEUWARE_HOME}/include")
target_link_libraries(infinirt PUBLIC ${CAMBRICON_RUNTIME_LIB})
endif()

if(WITH_ASCEND)
# ASCEND_HOME is set by the top-level CMakeLists.txt.
target_compile_definitions(infinirt PUBLIC WITH_ASCEND=1)

# Resolve the driver lib dir two levels above the toolkit root.
get_filename_component(ASCEND_ROOT "${ASCEND_HOME}/../.." ABSOLUTE)

# Prefer the real driver HAL; fall back to the toolkit stub for build-only
# environments (e.g., Docker CI images without hardware drivers installed).
# CANN <= 8.0: stub at runtime/lib64/stub/; CANN >= 8.5: devlib/<arch>-linux/devlib/.
set(ASCEND_HAL_REAL "${ASCEND_ROOT}/driver/lib64/driver/libascend_hal.so")
set(ASCEND_HAL_STUB "${ASCEND_HOME}/runtime/lib64/stub/libascend_hal.so")
set(ASCEND_HAL_DEVLIB "${ASCEND_HOME}/${CMAKE_SYSTEM_PROCESSOR}-linux/devlib/libascend_hal.so")
if(EXISTS "${ASCEND_HAL_REAL}")
set(ASCEND_HAL_LIB "${ASCEND_HAL_REAL}")
elseif(EXISTS "${ASCEND_HAL_STUB}")
set(ASCEND_HAL_LIB "${ASCEND_HAL_STUB}")
message(STATUS "ascend_hal: driver not found, using stub for linking")
elseif(EXISTS "${ASCEND_HAL_DEVLIB}")
set(ASCEND_HAL_LIB "${ASCEND_HAL_DEVLIB}")
message(STATUS "ascend_hal: driver not found, using devlib for linking")
else()
message(FATAL_ERROR "libascend_hal.so not found (tried ${ASCEND_HAL_REAL}, ${ASCEND_HAL_STUB}, and ${ASCEND_HAL_DEVLIB})")
endif()

target_include_directories(infinirt PUBLIC
"${ASCEND_HOME}/include"
"${ASCEND_HOME}/include/aclnn"
"${ASCEND_HOME}/include/aclnnop")
target_link_libraries(infinirt PUBLIC
"${ASCEND_HOME}/lib64/libascendcl.so"
"${ASCEND_HAL_LIB}")
endif()

target_include_directories(infinirt PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})

install(TARGETS infinirt
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/infinirt
FILES_MATCHING PATTERN "*.h"
)
61 changes: 61 additions & 0 deletions src/ascend/data_type_.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
#ifndef INFINI_RT_ASCEND_DATA_TYPE__H_
#define INFINI_RT_ASCEND_DATA_TYPE__H_

#include <cassert>

#include "acl/acl.h"
#include "ascend/device_.h"
#include "data_type.h"

namespace infini::rt::ascend {

inline aclDataType ToAclDtype(DataType dt) {
switch (dt) {
case DataType::kInt8:
return ACL_INT8;
case DataType::kInt16:
return ACL_INT16;
case DataType::kInt32:
return ACL_INT32;
case DataType::kInt64:
return ACL_INT64;
case DataType::kUInt8:
return ACL_UINT8;
case DataType::kUInt16:
return ACL_UINT16;
case DataType::kUInt32:
return ACL_UINT32;
case DataType::kUInt64:
return ACL_UINT64;
case DataType::kFloat16:
return ACL_FLOAT16;
case DataType::kBFloat16:
return ACL_BF16;
case DataType::kFloat32:
return ACL_FLOAT;
default:
assert(false && "Unsupported dtype for Ascend backend.");
return ACL_DT_UNDEFINED;
}
}

// Returns true for integer (signed or unsigned) `DataType` values.
inline bool IsIntegerDtype(DataType dt) {
switch (dt) {
case DataType::kInt8:
case DataType::kInt16:
case DataType::kInt32:
case DataType::kInt64:
case DataType::kUInt8:
case DataType::kUInt16:
case DataType::kUInt32:
case DataType::kUInt64:
return true;
default:
return false;
}
}

} // namespace infini::rt::ascend

#endif
13 changes: 13 additions & 0 deletions src/ascend/device_.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
#ifndef INFINI_RT_ASCEND_DEVICE__H_
#define INFINI_RT_ASCEND_DEVICE__H_

#include "device.h"

namespace infini::rt {

template <>
struct DeviceEnabled<Device::Type::kAscend> : std::true_type {};

} // namespace infini::rt

#endif
Loading