sparkle/native/ext/bindings.cpp
fiser_jun 4745f264b2
2026-08-04 14:34:00 +08:00

154 lines
5.1 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "compute/fused_moe.h"
#include "io/blob_load.h"
#include "io/bg_reader.h"
#include "prefetch/prefetch.h"
#include "pool/owned_pool.h"
#include "pool/side_region.h"
#include "pool/demand.h"
using namespace nb::literals;
NB_MODULE(native_moe_ext, m) {
nb::module_::import_("mlx.core");
m.doc() = "Native MLX MoE extension.";
// ---- 融合 MoE 计算核native_fused.cpp----
m.def(
"fused_moe",
&fused_moe,
"x"_a,
"expert_ids"_a,
"scores"_a,
"compute_dir"_a,
"layer"_a,
"hidden"_a,
"inter"_a,
"group"_a,
"bits"_a,
"num_experts"_a,
"synthetic"_a,
nb::kw_only(),
"stream"_a = nb::none());
m.def(
"fused_moe_staged",
&fused_moe_staged,
"x"_a,
"scores"_a,
"gate_w"_a,
"gate_s"_a,
"gate_b"_a,
"up_w"_a,
"up_s"_a,
"up_b"_a,
"down_w"_a,
"down_s"_a,
"down_b"_a,
"hidden"_a,
"inter"_a,
"group"_a,
"bits"_a,
nb::kw_only(),
"stream"_a = nb::none());
// ---- [1] blob 直读 ----
m.def(
"blob_load",
&blob_load,
"path"_a,
"expert_ids"_a,
"stride"_a,
nb::kw_only(),
"stream"_a = nb::none());
// ---- [2] 轻量预取(无 staging仅预热 page cache) ----
m.def(
"prefetch_on_complete",
&prefetch_on_complete,
"expert_ids"_a,
"path"_a,
"stride"_a,
"do_read"_a = true,
nb::kw_only(),
"stream"_a = nb::none());
// ---- [3] staging miss→hit + 完成回调时刻探针(诊断)----
m.def(
"prefetch_into_staging",
&prefetch_into_staging,
"staging"_a,
"expert_ids"_a,
"layer"_a,
"gen"_a,
"path"_a,
"stride"_a,
"resident"_a,
"cap"_a,
"parallel"_a,
nb::kw_only(),
"stream"_a = nb::none());
m.def("prefetch_staging_take", &prefetch_staging_take, "layer"_a);
m.def("staging_hprof_enable", &staging_hprof_enable, "on"_a);
m.def("staging_hprof_now", &staging_hprof_now);
m.def("staging_hprof_get", &staging_hprof_get);
// ---- [4] 段散写侧区缓存zero-copy dual-source 默认路径)----
m.def("prefetch_pool_sideregion", &prefetch_pool_sideregion,
"pool_list"_a, "seg_nbytes"_a, "expert_ids"_a, "layer"_a, "path"_a, "stride"_a,
"resident"_a, "spec_slots"_a, "base_row"_a, "gen"_a = 0, nb::kw_only(),
"stream"_a = nb::none());
m.def("sideregion_contents", &sideregion_contents, "layer"_a, "gen"_a = 0);
m.def("sideregion_kv", &sideregion_kv, "layer"_a, "gen"_a = 0);
m.def("sideregion_reset", &sideregion_reset);
m.def("sideregion_drain", &sideregion_drain,
nb::call_guard<nb::gil_scoped_release>()); // 等待时释放 GIL
// ---- [5] Route 3 owned 池底座C++ 拥有 buffer + 直写,删 MLX scatter----
m.def("pool_owned_zeros", &pool_owned_zeros, "shape"_a, "dtype"_a);
m.def("pool_write_rows", &pool_write_rows, "pool_list"_a, "srcs_flat"_a, "slots"_a);
m.def("pool_write_stacked", &pool_write_stacked, "pool_list"_a, "stacked_list"_a, "slots"_a);
m.def("array_data_ptr", &array_data_ptr, "a"_a);
// ---- [6] 方案B 真实区槽状态 C++ 接管 + demand_dual ----
m.def("real_init", &real_init, "layer"_a, "cap"_a);
m.def("real_region_contents", &real_region_contents, "layer"_a);
m.def("real_region_count", &real_region_count, "layer"_a);
m.def("real_reset", &real_reset);
m.def("real_pin", &real_pin, "layer"_a, "experts"_a);
m.def("real_pinned_count", &real_pinned_count, "layer"_a);
m.def("real_freq_dump", &real_freq_dump);
m.def("demand_dual", &demand_dual, "inds"_a, "pool_list"_a, "seg_nbytes"_a, "layer"_a,
"side_gen"_a, "path"_a, "stride"_a, "cap"_a, "lfu"_a, "decay_interval"_a, nb::kw_only(),
"stream"_a = nb::none());
m.def("demand_last_stats", &demand_last_stats);
m.def("demand_timings", &demand_timings);
m.def("demand_timing_enable", &demand_timing_enable, "on"_a);
m.def("real_debug_place", &real_debug_place, "layer"_a, "experts_flat"_a, "cap"_a, "lfu"_a,
"decay_interval"_a);
// ---- [7] 自由后台读线程 ----
m.def("bg_reader_start", &bg_reader_start, "workers"_a = 1, "low_cap"_a = 0);
m.def("bg_reader_submit", &bg_reader_submit,
"dst"_a, "experts"_a, "rows"_a, "path"_a, "stride"_a, "ticket"_a, "prio"_a = 0);
m.def("bg_reader_ready", &bg_reader_ready, "ticket"_a);
m.def("bg_reader_wait", &bg_reader_wait, "ticket"_a,
nb::call_guard<nb::gil_scoped_release>()); // 阻塞等时释放 GIL
m.def("bg_reader_stop", &bg_reader_stop);
m.def("bg_pread_into_pool", &bg_pread_into_pool,
"dst"_a, "seg_off"_a, "seg_nb"_a, "slot"_a, "expert"_a,
"path"_a, "stride"_a, "ticket"_a, "prio"_a = 0, "nocache"_a = true);
// ---- 融合 MoE 计算核slots 版native_fused.cpp----
m.def(
"fused_moe_slots",
&fused_moe_slots,
"x"_a,
"local_slots"_a,
"scores"_a,
"gate_w"_a,
"gate_s"_a,
"gate_b"_a,
"up_w"_a,
"up_s"_a,
"up_b"_a,
"down_w"_a,
"down_s"_a,
"down_b"_a,
"hidden"_a,
"inter"_a,
"group"_a,
"bits"_a,
nb::kw_only(),
"stream"_a = nb::none());
}