diff --git a/src/bridge/infini/rt.hpp b/src/bridge/infini/rt.hpp index d53cc49ac..b74b2250f 100644 --- a/src/bridge/infini/rt.hpp +++ b/src/bridge/infini/rt.hpp @@ -1,6 +1,5 @@ #pragma once -#include "infinicore.h" #include "infinirt.h" #include @@ -16,34 +15,58 @@ inline infiniStatus_t translate(::infini::rt::runtime::Error error) { } } -inline ::infini::rt::Device::Type translate(infiniDevice_t device) { +inline ::infini::rt::Device::Type translate_to(infiniDevice_t device) { switch (device) { case INFINI_DEVICE_CPU: return ::infini::rt::Device::Type::kCpu; case INFINI_DEVICE_NVIDIA: return ::infini::rt::Device::Type::kNvidia; + case INFINI_DEVICE_CAMBRICON: + return ::infini::rt::Device::Type::kCambricon; + case INFINI_DEVICE_ASCEND: + return ::infini::rt::Device::Type::kAscend; + case INFINI_DEVICE_METAX: + return ::infini::rt::Device::Type::kMetax; + case INFINI_DEVICE_MOORE: + return ::infini::rt::Device::Type::kMoore; + case INFINI_DEVICE_ILUVATAR: + return ::infini::rt::Device::Type::kIluvatar; + case INFINI_DEVICE_HYGON: + return ::infini::rt::Device::Type::kHygon; default: return ::infini::rt::Device::Type::kCount; } } -inline infiniDevice_t translate(::infini::rt::Device::Type device) { +inline infiniDevice_t translate_from(::infini::rt::Device::Type device) { switch (device) { case ::infini::rt::Device::Type::kCpu: return INFINI_DEVICE_CPU; case ::infini::rt::Device::Type::kNvidia: return INFINI_DEVICE_NVIDIA; + case ::infini::rt::Device::Type::kCambricon: + return INFINI_DEVICE_CAMBRICON; + case ::infini::rt::Device::Type::kAscend: + return INFINI_DEVICE_ASCEND; + case ::infini::rt::Device::Type::kMetax: + return INFINI_DEVICE_METAX; + case ::infini::rt::Device::Type::kMoore: + return INFINI_DEVICE_MOORE; + case ::infini::rt::Device::Type::kIluvatar: + return INFINI_DEVICE_ILUVATAR; + case ::infini::rt::Device::Type::kHygon: + return INFINI_DEVICE_HYGON; default: return INFINI_DEVICE_TYPE_COUNT; } } -inline ::infini::rt::runtime::Stream translate(infinirtStream_t stream) { +inline ::infini::rt::runtime::Stream translate_to(infinirtStream_t stream) { return reinterpret_cast<::infini::rt::runtime::Stream>(stream); } -inline ::infini::rt::runtime::Stream *translate(infinirtStream_t *stream) { - return reinterpret_cast<::infini::rt::runtime::Stream *>(stream); +inline infinirtStream_t translate_from(::infini::rt::runtime::Stream stream) { + return reinterpret_cast(stream); } } // namespace infinicore::bridge::infini::rt diff --git a/src/infinicore/context/allocators/stream_ordered_allocator.cc b/src/infinicore/context/allocators/stream_ordered_allocator.cc index 00df7fb47..c6c54e47d 100644 --- a/src/infinicore/context/allocators/stream_ordered_allocator.cc +++ b/src/infinicore/context/allocators/stream_ordered_allocator.cc @@ -13,7 +13,10 @@ std::byte *StreamOrderedAllocator::allocate(size_t size) { } void *ptr = nullptr; if (device_.getType() != Device::Type::CPU) { - INFINICORE_CHECK_ERROR(bridge::infini::rt::translate(infini::rt::runtime::MallocAsync(&ptr, size, bridge::infini::rt::translate(context::getStream())))); + INFINICORE_CHECK_ERROR(bridge::infini::rt::translate(infini::rt::runtime::MallocAsync( + &ptr, + size, + bridge::infini::rt::translate_to(context::getStream())))); } else { INFINICORE_CHECK_ERROR(bridge::infini::rt::translate(infini::rt::runtime::Malloc(&ptr, size))); } @@ -25,7 +28,9 @@ void StreamOrderedAllocator::deallocate(std::byte *ptr) { return; } if (device_.getType() != Device::Type::CPU) { - INFINICORE_CHECK_ERROR(bridge::infini::rt::translate(infini::rt::runtime::FreeAsync(ptr, bridge::infini::rt::translate(context::getStream())))); + INFINICORE_CHECK_ERROR(bridge::infini::rt::translate(infini::rt::runtime::FreeAsync( + ptr, + bridge::infini::rt::translate_to(context::getStream())))); } else { INFINICORE_CHECK_ERROR(bridge::infini::rt::translate(infini::rt::runtime::Free(ptr))); } diff --git a/src/infinicore/context/context_impl.cc b/src/infinicore/context/context_impl.cc index 06c85955c..4de56effb 100644 --- a/src/infinicore/context/context_impl.cc +++ b/src/infinicore/context/context_impl.cc @@ -64,7 +64,7 @@ ContextImpl &ContextImpl::singleton() { ContextImpl::ContextImpl() { std::vector device_counter(static_cast(Device::Type::COUNT), 0); - infini::rt::set_runtime_device_type(bridge::infini::rt::translate(INFINI_DEVICE_CPU)); + infini::rt::set_runtime_device_type(bridge::infini::rt::translate_to(INFINI_DEVICE_CPU)); INFINICORE_CHECK_ERROR(bridge::infini::rt::translate(infini::rt::runtime::GetDeviceCount(&device_counter[static_cast(Device::Type::CPU)]))); runtime_table_[static_cast(Device::Type::CPU)].resize(device_counter[static_cast(Device::Type::CPU)]); @@ -73,7 +73,7 @@ ContextImpl::ContextImpl() { } if constexpr (infini::rt::DeviceEnabled::value) { - infini::rt::set_runtime_device_type(bridge::infini::rt::translate(INFINI_DEVICE_NVIDIA)); + infini::rt::set_runtime_device_type(bridge::infini::rt::translate_to(INFINI_DEVICE_NVIDIA)); INFINICORE_CHECK_ERROR(bridge::infini::rt::translate(infini::rt::runtime::GetDeviceCount(&device_counter[static_cast(Device::Type::NVIDIA)]))); runtime_table_[static_cast(Device::Type::NVIDIA)].resize(device_counter[static_cast(Device::Type::NVIDIA)]); if (device_counter[static_cast(Device::Type::NVIDIA)] > 0) { @@ -82,6 +82,16 @@ ContextImpl::ContextImpl() { } } + if constexpr (infini::rt::DeviceEnabled::value) { + infini::rt::set_runtime_device_type(bridge::infini::rt::translate_to(INFINI_DEVICE_ASCEND)); + INFINICORE_CHECK_ERROR(bridge::infini::rt::translate(infini::rt::runtime::GetDeviceCount(&device_counter[static_cast(Device::Type::ASCEND)]))); + runtime_table_[static_cast(Device::Type::ASCEND)].resize(device_counter[static_cast(Device::Type::ASCEND)]); + if (device_counter[static_cast(Device::Type::ASCEND)] > 0) { + runtime_table_[static_cast(Device::Type::ASCEND)][0] = std::unique_ptr(new Runtime(Device(Device::Type::ASCEND, 0))); + current_runtime_ = runtime_table_[static_cast(Device::Type::ASCEND)][0].get(); + } + } + if (current_runtime_ == nullptr && !runtime_table_[static_cast(Device::Type::CPU)].empty()) { current_runtime_ = runtime_table_[static_cast(Device::Type::CPU)][0].get(); } diff --git a/src/infinicore/context/runtime/runtime.cc b/src/infinicore/context/runtime/runtime.cc index 783b018c2..0d5cd6de8 100644 --- a/src/infinicore/context/runtime/runtime.cc +++ b/src/infinicore/context/runtime/runtime.cc @@ -11,7 +11,9 @@ namespace infinicore { Runtime::Runtime(Device device) : device_(device), graph_manager_(std::make_unique()) { activate(); - INFINICORE_CHECK_ERROR(bridge::infini::rt::translate(infini::rt::runtime::StreamCreate(bridge::infini::rt::translate(&stream_)))); + infini::rt::runtime::Stream stream = nullptr; + INFINICORE_CHECK_ERROR(bridge::infini::rt::translate(infini::rt::runtime::StreamCreate(&stream))); + stream_ = bridge::infini::rt::translate_from(stream); INFINICORE_CHECK_ERROR(infiniopCreateHandle(&infiniop_handle_)); if (device_.getType() == Device::Type::CPU) { device_memory_allocator_ = std::make_unique(device); @@ -27,11 +29,11 @@ Runtime::~Runtime() { } device_memory_allocator_.reset(); infiniopDestroyHandle(infiniop_handle_); - (void)infini::rt::runtime::StreamDestroy(bridge::infini::rt::translate(stream_)); + (void)infini::rt::runtime::StreamDestroy(bridge::infini::rt::translate_to(stream_)); } Runtime *Runtime::activate() { - auto rt_device = bridge::infini::rt::translate(static_cast(device_.getType())); + auto rt_device = bridge::infini::rt::translate_to(static_cast(device_.getType())); INFINICORE_ASSERT(rt_device != infini::rt::Device::Type::kCount); infini::rt::set_runtime_device_type(rt_device); INFINICORE_CHECK_ERROR(bridge::infini::rt::translate(infini::rt::runtime::SetDevice(static_cast(device_.getIndex())))); @@ -51,7 +53,7 @@ infiniopHandle_t Runtime::infiniopHandle() const { } void Runtime::syncStream() { - INFINICORE_CHECK_ERROR(bridge::infini::rt::translate(infini::rt::runtime::StreamSynchronize(bridge::infini::rt::translate(stream_)))); + INFINICORE_CHECK_ERROR(bridge::infini::rt::translate(infini::rt::runtime::StreamSynchronize(bridge::infini::rt::translate_to(stream_)))); } void Runtime::syncDevice() { @@ -108,7 +110,7 @@ std::shared_ptr Runtime::reinstantiateBlob(std::shared_ptr blob) void Runtime::memcpyH2D(void *dst, const void *src, size_t size, bool async) { if (async && device_.getType() != Device::Type::CPU) { - INFINICORE_CHECK_ERROR(bridge::infini::rt::translate(infini::rt::runtime::MemcpyAsync(dst, src, size, infini::rt::runtime::kMemcpyHostToDevice, bridge::infini::rt::translate(stream_)))); + INFINICORE_CHECK_ERROR(bridge::infini::rt::translate(infini::rt::runtime::MemcpyAsync(dst, src, size, infini::rt::runtime::kMemcpyHostToDevice, bridge::infini::rt::translate_to(stream_)))); } else { INFINICORE_CHECK_ERROR(bridge::infini::rt::translate(infini::rt::runtime::Memcpy(dst, src, size, infini::rt::runtime::kMemcpyHostToDevice))); } @@ -120,7 +122,7 @@ void Runtime::memcpyD2H(void *dst, const void *src, size_t size) { void Runtime::memcpyD2D(void *dst, const void *src, size_t size, bool async) { if (async && device_.getType() != Device::Type::CPU) { - INFINICORE_CHECK_ERROR(bridge::infini::rt::translate(infini::rt::runtime::MemcpyAsync(dst, src, size, infini::rt::runtime::kMemcpyDeviceToDevice, bridge::infini::rt::translate(stream_)))); + INFINICORE_CHECK_ERROR(bridge::infini::rt::translate(infini::rt::runtime::MemcpyAsync(dst, src, size, infini::rt::runtime::kMemcpyDeviceToDevice, bridge::infini::rt::translate_to(stream_)))); } else { INFINICORE_CHECK_ERROR(bridge::infini::rt::translate(infini::rt::runtime::Memcpy(dst, src, size, infini::rt::runtime::kMemcpyDeviceToDevice))); } @@ -132,7 +134,7 @@ void Runtime::setDeviceMemory(void *ptr, int value, size_t count) { void Runtime::setDeviceMemoryAsync(void *ptr, int value, size_t count, infinirtStream_t stream) { if (device_.getType() != Device::Type::CPU) { - INFINICORE_CHECK_ERROR(bridge::infini::rt::translate(infini::rt::runtime::MemsetAsync(ptr, value, count, bridge::infini::rt::translate(stream)))); + INFINICORE_CHECK_ERROR(bridge::infini::rt::translate(infini::rt::runtime::MemsetAsync(ptr, value, count, bridge::infini::rt::translate_to(stream)))); } else { INFINICORE_CHECK_ERROR(bridge::infini::rt::translate(infini::rt::runtime::Memset(ptr, value, count))); } @@ -155,7 +157,7 @@ void Runtime::recordEvent(infinirtEvent_t event, infinirtStream_t stream) { if (stream == nullptr) { stream = stream_; } - INFINICORE_CHECK_ERROR(bridge::infini::rt::translate(infini::rt::runtime::EventRecord(event, bridge::infini::rt::translate(stream)))); + INFINICORE_CHECK_ERROR(bridge::infini::rt::translate(infini::rt::runtime::EventRecord(event, bridge::infini::rt::translate_to(stream)))); } bool Runtime::queryEvent(infinirtEvent_t event) { @@ -181,7 +183,7 @@ void Runtime::streamWaitEvent(infinirtStream_t stream, infinirtEvent_t event) { if (stream == nullptr) { stream = stream_; } - INFINICORE_CHECK_ERROR(bridge::infini::rt::translate(infini::rt::runtime::StreamWaitEvent(bridge::infini::rt::translate(stream), event, 0))); + INFINICORE_CHECK_ERROR(bridge::infini::rt::translate(infini::rt::runtime::StreamWaitEvent(bridge::infini::rt::translate_to(stream), event, 0))); } bool Runtime::isGraphRecording() const { diff --git a/src/infinicore/graph/graph.cc b/src/infinicore/graph/graph.cc index 3511b10a1..9b28aae7f 100644 --- a/src/infinicore/graph/graph.cc +++ b/src/infinicore/graph/graph.cc @@ -1,14 +1,19 @@ #include "graph_manager.hpp" +#include "../../bridge/infini/rt.hpp" #include "../utils.hpp" #include "infinicore/context/context.hpp" #ifdef USE_INFINIRT_GRAPH -#include +#include #endif namespace infinicore::graph { +#ifdef USE_INFINIRT_GRAPH +namespace rt_runtime = ::infini::rt::runtime; +#endif + /* ========================= * GraphTensor * ========================= */ @@ -36,26 +41,25 @@ DispatchableGraphOperator::~DispatchableGraphOperator() { #ifdef USE_INFINIRT_GRAPH struct Graph::DeviceGraph { - infinirtGraph_t graph; - infinirtGraphExec_t exec; - infinirtGraphNode_t node; - std::vector log_buffer; - - DeviceGraph() { - log_buffer.resize(4 * 1024); - } + rt_runtime::Graph graph = nullptr; + rt_runtime::GraphExec exec = nullptr; + rt_runtime::Stream stream = nullptr; + ::infini::rt::Device::Type device_type = ::infini::rt::Device::Type::kCount; + int device_index = 0; ~DeviceGraph() { if (exec) { - infinirtGraphExecDestroy(exec); + (void)rt_runtime::GraphExecDestroy(exec); } if (graph) { - infinirtGraphDestroy(graph); + (void)rt_runtime::GraphDestroy(graph); } } void launch() { - INFINICORE_CHECK_ERROR(infinirtGraphLuanch(exec, context::getStream())); + ::infini::rt::set_runtime_device_type(device_type); + INFINICORE_CHECK_ERROR(bridge::infini::rt::translate(rt_runtime::SetDevice(device_index))); + INFINICORE_CHECK_ERROR(bridge::infini::rt::translate(rt_runtime::GraphLaunch(exec, stream))); } }; #else @@ -85,6 +89,22 @@ void Graph::instantiate() { #ifdef USE_INFINIRT_GRAPH // Reset device graph device_graph_ = std::make_unique(); + auto current_device = context::getDevice(); + device_graph_->device_type = bridge::infini::rt::translate_to(static_cast(current_device.getType())); + device_graph_->device_index = static_cast(current_device.getIndex()); + device_graph_->stream = bridge::infini::rt::translate_to(context::getStream()); + if (device_graph_->device_type == ::infini::rt::Device::Type::kCount) { + spdlog::warn("InfiniRT graph runtime does not support the current device. Falling back to eager execution."); + device_graph_.reset(); + return; + } + ::infini::rt::set_runtime_device_type(device_graph_->device_type); + auto set_device_status = bridge::infini::rt::translate(rt_runtime::SetDevice(device_graph_->device_index)); + if (set_device_status != INFINI_STATUS_SUCCESS) { + spdlog::warn("InfiniRT graph runtime failed to select the current device. Falling back to eager execution."); + device_graph_.reset(); + return; + } // warmup for (size_t iter = 0; iter < 5; ++iter) { @@ -92,35 +112,43 @@ void Graph::instantiate() { } infinicore::context::syncStream(); - if (infinirtStreamBeginCapture( - context::getStream(), - INFINIRT_STREAM_CAPTURE_MODE_RELAXED) - != INFINI_STATUS_SUCCESS) { + auto begin_status = bridge::infini::rt::translate(rt_runtime::StreamBeginCapture( + device_graph_->stream, + rt_runtime::StreamCaptureMode::kStreamCaptureModeRelaxed)); + if (begin_status != INFINI_STATUS_SUCCESS) { + spdlog::warn("Fail to begin device graph capture."); + device_graph_.reset(); return; } // Run and record this->run(); - if (infinirtStreamEndCapture( - context::getStream(), - &device_graph_.get()->graph) - != INFINI_STATUS_SUCCESS) { + auto end_status = bridge::infini::rt::translate(rt_runtime::StreamEndCapture( + device_graph_->stream, + &device_graph_->graph)); + if (end_status != INFINI_STATUS_SUCCESS) { + spdlog::warn("Fail to end device graph capture."); + device_graph_.reset(); return; } - if (infinirtGraphInstantiate( - &device_graph_.get()->exec, - device_graph_.get()->graph, - &device_graph_.get()->node, - device_graph_.get()->log_buffer.data(), - device_graph_.get()->log_buffer.size()) - != INFINI_STATUS_SUCCESS) { + auto instantiate_status = bridge::infini::rt::translate(rt_runtime::GraphInstantiate( + &device_graph_->exec, + device_graph_->graph)); + if (instantiate_status != INFINI_STATUS_SUCCESS) { static bool warned_once = false; if (!warned_once) { warned_once = true; - spdlog::warn("Fail to instantiate device graph: {}", std::string(device_graph_.get()->log_buffer.data())); + spdlog::warn("Fail to instantiate device graph."); } + device_graph_.reset(); + return; + } + static bool logged_once = false; + if (!logged_once) { + logged_once = true; + spdlog::info("Using InfiniRT C++ graph runtime API for graph capture and replay."); } #endif } diff --git a/src/infinicore/tensor/copy.cc b/src/infinicore/tensor/copy.cc index 1297d9f8c..9db8bebe8 100644 --- a/src/infinicore/tensor/copy.cc +++ b/src/infinicore/tensor/copy.cc @@ -43,11 +43,13 @@ void TensorImpl::copy_from(Tensor src) { } } else if (src->device().getType() == Device::Type::CPU) { context::setDevice(this->device()); + // Keep Ascend H2D synchronous because copy_from does not retain the host source. + const bool async = this->device().getType() != Device::Type::ASCEND; if (this->is_contiguous()) { - context::memcpyH2D(this->data(), src->data(), copy_size); + context::memcpyH2D(this->data(), src->data(), copy_size, async); } else { auto local_src = Tensor::empty(this->shape(), this->dtype(), this->device()); - context::memcpyH2D(local_src->data(), src->data(), copy_size); + context::memcpyH2D(local_src->data(), src->data(), copy_size, async); op::rearrange_(Tensor(const_cast(this)->shared_from_this()), local_src); } } diff --git a/src/infiniop/devices/handle.cc b/src/infiniop/devices/handle.cc index 9ded0587b..9057f7203 100644 --- a/src/infiniop/devices/handle.cc +++ b/src/infiniop/devices/handle.cc @@ -25,7 +25,7 @@ #endif __INFINI_C infiniStatus_t infiniopSetRuntimeDevice(infiniDevice_t device, int device_id) { - auto rt_device = infinicore::bridge::infini::rt::translate(device); + auto rt_device = infinicore::bridge::infini::rt::translate_to(device); if (rt_device == infini::rt::Device::Type::kCount) { return INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED; } @@ -40,7 +40,7 @@ __INFINI_C infiniStatus_t infiniopCreateHandle(infiniopHandle_t *handle_ptr) { return INFINI_STATUS_NULL_POINTER; } - infiniDevice_t device = infinicore::bridge::infini::rt::translate(infini::rt::runtime_device_type()); + infiniDevice_t device = infinicore::bridge::infini::rt::translate_from(infini::rt::runtime_device_type()); if (device == INFINI_DEVICE_TYPE_COUNT) { return INFINI_STATUS_DEVICE_TYPE_NOT_SUPPORTED; } diff --git a/xmake.lua b/xmake.lua index d98fe6e01..960ad5dcd 100644 --- a/xmake.lua +++ b/xmake.lua @@ -292,10 +292,10 @@ option_end() option("infinirt-root") set_default("") set_showmenu(true) - set_description("Path to an installed standalone InfiniRT prefix used by --infiniops") + set_description("Path to an installed InfiniRT prefix") option_end() -local function get_standalone_infinirt_root() +local function get_infinirt_root() local infinirt_root = get_config("infinirt-root") if not infinirt_root or infinirt_root == "" then infinirt_root = os.getenv("INFINI_RT_ROOT") @@ -327,6 +327,60 @@ end local infiniops_external_built = false +local function find_infinirt_library(infinirt_root, xmake_os) + local infinirt_library = path.join(infinirt_root, "lib", "libinfinirt.so") + if not xmake_os.isfile(infinirt_library) then + infinirt_library = path.join(infinirt_root, "lib64", "libinfinirt.so") + end + if not xmake_os.isfile(infinirt_library) then + raise("InfiniRT library not found under: " .. infinirt_root) + end + return infinirt_library +end + +local function add_external_infinirt() + local INFINI_ROOT = os.getenv("INFINI_ROOT") or (os.getenv(is_host("windows") and "HOMEPATH" or "HOME") .. "/.infini") + local infinirt_root = get_infinirt_root() + if infinirt_root and infinirt_root ~= "" then + add_includedirs(path.join(infinirt_root, "include"), { public = true }) + add_linkdirs(path.join(infinirt_root, "lib"), path.join(infinirt_root, "lib64")) + add_rpathdirs(path.join(infinirt_root, "lib"), path.join(infinirt_root, "lib64")) + else + add_includedirs(INFINI_ROOT .. "/include", { public = true }) + add_linkdirs(INFINI_ROOT .. "/lib") + add_rpathdirs(INFINI_ROOT .. "/lib") + end + if has_config("ascend-npu") then + local ascend_home = os.getenv("ASCEND_HOME") or os.getenv("ASCEND_TOOLKIT_HOME") or os.getenv("ASCEND_HOME_PATH") + if ascend_home and ascend_home ~= "" then + for _, include_dir in ipairs({ + path.join(ascend_home, "include"), + path.join(ascend_home, "include/aclnn"), + path.join(ascend_home, "aarch64-linux/include"), + path.join(ascend_home, "aarch64-linux/include/aclnn"), + }) do + if os.isdir(include_dir) then + add_includedirs(include_dir, { public = true }) + end + end + end + end + add_links("infinirt") +end + +local function patch_infiniops_private_infinirt(xmake_os, infiniops_lib, infinirt_library, private_infinirt) + local private_soname = path.filename(private_infinirt) + xmake_os.cp(infinirt_library, private_infinirt) + xmake_os.execv("patchelf", {"--set-soname", private_soname, private_infinirt}) + xmake_os.execv("patchelf", {"--replace-needed", infinirt_library, private_soname, infiniops_lib}) + xmake_os.execv("patchelf", {"--replace-needed", "libinfinirt.so", private_soname, infiniops_lib}) + + local needed = xmake_os.iorunv("patchelf", {"--print-needed", infiniops_lib}) + if not needed:find(private_soname, 1, true) then + xmake_os.execv("patchelf", {"--add-needed", private_soname, infiniops_lib}) + end +end + local function filter_infiniops_ops_for_backend(infiniops_ops) if not infiniops_ops or #infiniops_ops == 0 then return infiniops_ops @@ -376,7 +430,7 @@ local function build_infiniops_external(xmake_os) local infiniops_root = path.absolute(get_config("infiniops-root") or "submodules/InfiniOps", os.projectdir()) local infiniops_builddir = path.join(infiniops_root, "build") local INFINI_ROOT = os.getenv("INFINI_ROOT") or (os.getenv(is_host("windows") and "HOMEPATH" or "HOME") .. "/.infini") - local infinirt_root = get_standalone_infinirt_root() + local infinirt_root = get_infinirt_root() local cmake_config_args = { "-S", infiniops_root, "-B", infiniops_builddir, @@ -408,20 +462,10 @@ local function build_infiniops_external(xmake_os) xmake_os.execv("cmake", {"--build", infiniops_builddir, "--target", "infiniops"}) xmake_os.execv("cmake", {"--install", infiniops_builddir, "--prefix", INFINI_ROOT}) if infinirt_root and infinirt_root ~= "" then - local standalone_infinirt = path.join(infinirt_root, "lib", "libinfinirt.so") - if not xmake_os.isfile(standalone_infinirt) then - standalone_infinirt = path.join(infinirt_root, "lib64", "libinfinirt.so") - end - if not xmake_os.isfile(standalone_infinirt) then - raise("Standalone InfiniRT library not found under: " .. infinirt_root) - end + local infinirt_library = find_infinirt_library(infinirt_root, xmake_os) local infiniops_lib = path.join(INFINI_ROOT, "lib", "libinfiniops.so") - local private_soname = "libinfiniops_infinirt.so" - local private_infinirt = path.join(INFINI_ROOT, "lib", private_soname) - xmake_os.cp(standalone_infinirt, private_infinirt) - xmake_os.execv("patchelf", {"--set-soname", private_soname, private_infinirt}) - xmake_os.execv("patchelf", {"--replace-needed", standalone_infinirt, private_soname, infiniops_lib}) - xmake_os.execv("patchelf", {"--replace-needed", "libinfinirt.so", private_soname, infiniops_lib}) + local private_infinirt = path.join(INFINI_ROOT, "lib", "libinfiniops_infinirt.so") + patch_infiniops_private_infinirt(xmake_os, infiniops_lib, infinirt_library, private_infinirt) end infiniops_external_built = true end @@ -463,11 +507,7 @@ target_end() target("infiniop") set_kind("shared") - local INFINI_ROOT = os.getenv("INFINI_ROOT") or (os.getenv(is_host("windows") and "HOMEPATH" or "HOME") .. "/.infini") - add_includedirs(INFINI_ROOT.."/include", { public = true }) - add_linkdirs(INFINI_ROOT.."/lib") - add_links("infinirt") - add_rpathdirs(INFINI_ROOT.."/lib") + add_external_infinirt() local public_cuda_root = get_config("cuda") or os.getenv("CUDA_HOME") or os.getenv("CUDA_PATH") if public_cuda_root and public_cuda_root ~= "" then @@ -541,6 +581,7 @@ target("infiniop") add_installfiles("include/infiniop/*.h", {prefixdir = "include/infiniop"}) add_installfiles("include/infiniop.h", {prefixdir = "include"}) add_installfiles("include/infinicore.h", {prefixdir = "include"}) + add_installfiles("include/infinirt.h", {prefixdir = "include"}) target_end() target("infiniccl") @@ -624,6 +665,7 @@ target("infinicore_cpp_api") add_defines("CHAR_BIT=8", "INT_MIN=(-2147483647 - 1)", "INT_MAX=2147483647", "UINT_MAX=4294967295U") end add_includedirs(INFINI_ROOT.."/include", { public = true }) + add_external_infinirt() if has_config("nv-gpu") then local cuda_root = os.getenv("CUDA_HOME") or os.getenv("CUDA_PATH") or get_config("cuda") or "/usr/local/cuda" add_includedirs(cuda_root .. "/include") @@ -634,7 +676,7 @@ target("infinicore_cpp_api") raise("InfiniOps root not found: " .. infiniops_root) end get_infiniops_backend_cmake_arg() - local infinirt_root = get_standalone_infinirt_root() + local infinirt_root = get_infinirt_root() if infinirt_root and infinirt_root ~= "" then add_includedirs(infinirt_root .. "/include") add_linkdirs(infinirt_root .. "/lib", infinirt_root .. "/lib64") @@ -649,28 +691,18 @@ target("infinicore_cpp_api") end) after_install(function (target) local INFINI_ROOT = os.getenv("INFINI_ROOT") or (os.getenv(is_host("windows") and "HOMEPATH" or "HOME") .. "/.infini") - local infinirt_root = get_standalone_infinirt_root() + local infinirt_root = get_infinirt_root() if infinirt_root and infinirt_root ~= "" then - local standalone_infinirt = path.join(infinirt_root, "lib", "libinfinirt.so") - if not os.isfile(standalone_infinirt) then - standalone_infinirt = path.join(infinirt_root, "lib64", "libinfinirt.so") - end - if not os.isfile(standalone_infinirt) then - raise("Standalone InfiniRT library not found under: " .. infinirt_root) - end + local infinirt_library = find_infinirt_library(infinirt_root, os) local infiniops_lib = path.join(INFINI_ROOT, "lib", "libinfiniops.so") - local private_soname = "libinfiniops_infinirt.so" - local private_infinirt = path.join(INFINI_ROOT, "lib", private_soname) - os.cp(standalone_infinirt, private_infinirt) - os.execv("patchelf", {"--set-soname", private_soname, private_infinirt}) - os.execv("patchelf", {"--replace-needed", "libinfinirt.so", private_soname, infiniops_lib}) + local private_infinirt = path.join(INFINI_ROOT, "lib", "libinfiniops_infinirt.so") + patch_infiniops_private_infinirt(os, infiniops_lib, infinirt_library, private_infinirt) end end) end add_linkdirs(INFINI_ROOT.."/lib") - add_links("infiniop", "infinirt", "infiniccl") - add_rpathdirs(INFINI_ROOT.."/lib") + add_links("infiniop", "infiniccl") if get_config("flash-attn") and get_config("flash-attn") ~= "" then add_installfiles("(builddir)/$(plat)/$(arch)/$(mode)/flash-attn*.so", {prefixdir = "lib"}) @@ -899,14 +931,15 @@ target("_infinicore") set_kind("shared") local INFINI_ROOT = os.getenv("INFINI_ROOT") or (os.getenv(is_host("windows") and "HOMEPATH" or "HOME") .. "/.infini") add_includedirs(INFINI_ROOT.."/include", { public = true }) + add_external_infinirt() add_linkdirs(INFINI_ROOT.."/lib") - add_links("infiniop", "infinirt", "infiniccl") + add_links("infiniop", "infiniccl") add_files("src/infinicore/pybind11/**.cc") if has_config("infiniops") then - local infinirt_root = get_standalone_infinirt_root() + local infinirt_root = get_infinirt_root() if infinirt_root and infinirt_root ~= "" then add_includedirs(infinirt_root .. "/include") add_linkdirs(infinirt_root .. "/lib", infinirt_root .. "/lib64") @@ -921,21 +954,11 @@ target("_infinicore") infiniops_lib = path.join(infiniops_root, "build", "src", "libinfiniops.so") infiniops_lib_installed = false end - local infinirt_root = get_standalone_infinirt_root() + local infinirt_root = get_infinirt_root() if infinirt_root and infinirt_root ~= "" then - local standalone_infinirt = path.join(infinirt_root, "lib", "libinfinirt.so") - if not os.isfile(standalone_infinirt) then - standalone_infinirt = path.join(infinirt_root, "lib64", "libinfinirt.so") - end - if not os.isfile(standalone_infinirt) then - raise("Standalone InfiniRT library not found under: " .. infinirt_root) - end - local private_soname = "libinfiniops_infinirt.so" - local private_infinirt = path.join(INFINI_ROOT, "lib", private_soname) - os.cp(standalone_infinirt, private_infinirt) - os.execv("patchelf", {"--set-soname", private_soname, private_infinirt}) - os.execv("patchelf", {"--replace-needed", standalone_infinirt, private_soname, infiniops_lib}) - os.execv("patchelf", {"--replace-needed", "libinfinirt.so", private_soname, infiniops_lib}) + local infinirt_library = find_infinirt_library(infinirt_root, os) + local private_infinirt = path.join(INFINI_ROOT, "lib", "libinfiniops_infinirt.so") + patch_infiniops_private_infinirt(os, infiniops_lib, infinirt_library, private_infinirt) end os.mkdir(path.join(INFINI_ROOT, "lib")) if not infiniops_lib_installed then diff --git a/xmake/ali.lua b/xmake/ali.lua index 940650d67..550f7e0fc 100644 --- a/xmake/ali.lua +++ b/xmake/ali.lua @@ -104,7 +104,6 @@ target_end() target("infiniccl-ali") set_kind("static") - add_deps("infinirt") on_install(function (target) end) if has_config("ccl") then set_policy("build.cuda.devlink", true) diff --git a/xmake/ascend.lua b/xmake/ascend.lua index 6179cac13..f8b2fe9ac 100644 --- a/xmake/ascend.lua +++ b/xmake/ascend.lua @@ -1,16 +1,38 @@ add_defines("ENABLE_ASCEND_API") -local ASCEND_HOME = os.getenv("ASCEND_HOME") or os.getenv("ASCEND_TOOLKIT_HOME") +local ASCEND_HOME = os.getenv("ASCEND_HOME") or os.getenv("ASCEND_TOOLKIT_HOME") or os.getenv("ASCEND_HOME_PATH") local SOC_VERSION = os.getenv("SOC_VERSION") -- Add include dirs -add_includedirs(ASCEND_HOME .. "/include") -add_includedirs(ASCEND_HOME .. "/include/aclnn") -add_linkdirs(ASCEND_HOME .. "/lib64") +for _, include_dir in ipairs({ + path.join(ASCEND_HOME, "include"), + path.join(ASCEND_HOME, "include/aclnn"), + path.join(ASCEND_HOME, "aarch64-linux/include"), + path.join(ASCEND_HOME, "aarch64-linux/include/aclnn"), +}) do + if os.isdir(include_dir) then + add_includedirs(include_dir) + end +end +for _, lib_dir in ipairs({ + path.join(ASCEND_HOME, "lib64"), + path.join(ASCEND_HOME, "aarch64-linux/lib64"), +}) do + if os.isdir(lib_dir) then + add_linkdirs(lib_dir) + end +end add_links("libascendcl.so") add_links("libnnopbase.so") add_links("libopapi.so") add_links("libruntime.so") -add_linkdirs(ASCEND_HOME .. "/../../driver/lib64/driver") +for _, driver_dir in ipairs({ + path.join(ASCEND_HOME, "../driver/lib64/driver"), + path.join(ASCEND_HOME, "../../driver/lib64/driver"), +}) do + if os.isdir(driver_dir) then + add_linkdirs(driver_dir) + end +end add_links("libascend_hal.so") local builddir = string.format( "%s/build/%s/%s/%s", @@ -69,7 +91,6 @@ target_end() target("infiniccl-ascend") set_kind("static") - add_deps("infinirt") add_deps("infini-utils") set_warnings("all", "error") set_languages("cxx17") diff --git a/xmake/bang.lua b/xmake/bang.lua index ffa85ef6d..0be267c94 100644 --- a/xmake/bang.lua +++ b/xmake/bang.lua @@ -65,7 +65,6 @@ target_end() target("infiniccl-cambricon") set_kind("static") - add_deps("infinirt") add_deps("infini-utils") set_warnings("all", "error") set_languages("cxx17") diff --git a/xmake/hygon.lua b/xmake/hygon.lua index ed7da7b85..c7a2142aa 100644 --- a/xmake/hygon.lua +++ b/xmake/hygon.lua @@ -193,7 +193,6 @@ target_end() target("infiniccl-hygon") set_kind("static") - add_deps("infinirt") on_install(function (target) end) if has_config("ccl") then diff --git a/xmake/iluvatar.lua b/xmake/iluvatar.lua index 046e6716e..fea75a5d8 100644 --- a/xmake/iluvatar.lua +++ b/xmake/iluvatar.lua @@ -102,7 +102,6 @@ target_end() target("infiniccl-iluvatar") set_kind("static") - add_deps("infinirt") on_install(function (target) end) if has_config("ccl") then diff --git a/xmake/kunlun.lua b/xmake/kunlun.lua index 84ba14082..4f3a40db2 100644 --- a/xmake/kunlun.lua +++ b/xmake/kunlun.lua @@ -108,7 +108,6 @@ target_end() target("infiniccl-kunlun") set_kind("static") - add_deps("infinirt") add_deps("infini-utils") set_warnings("all", "error") set_languages("cxx17") diff --git a/xmake/metax.lua b/xmake/metax.lua index 85407ed1b..3e700fff2 100644 --- a/xmake/metax.lua +++ b/xmake/metax.lua @@ -158,7 +158,6 @@ target_end() target("infiniccl-metax") set_kind("static") - add_deps("infinirt") on_install(function (target) end) set_warnings("all", "error") if not is_plat("windows") then diff --git a/xmake/moore.lua b/xmake/moore.lua index d34dd24f7..6e8800be8 100644 --- a/xmake/moore.lua +++ b/xmake/moore.lua @@ -81,7 +81,6 @@ target_end() target("infiniccl-moore") set_kind("static") - add_deps("infinirt") on_install(function (target) end) set_warnings("all", "error") if not is_plat("windows") then diff --git a/xmake/qy.lua b/xmake/qy.lua index 35d53d6ef..82cf92d6b 100644 --- a/xmake/qy.lua +++ b/xmake/qy.lua @@ -174,7 +174,6 @@ target_end() target("infiniccl-qy") set_kind("static") - add_deps("infinirt") on_install(function (target) end) if has_config("ccl") then add_rules("qy.cuda", {override = true})