numrs/
startup.rs

1/// Print a concise startup banner / log with available public APIs and detected backend
2pub fn print_startup_log() {
3    // Initialize dispatch table (valida backends y selecciona mejores implementaciones)
4    let dispatch_table = crate::backend::get_dispatch_table();
5    let validation = crate::backend::validate_backends();
6
7    // Use compile-time package name/version for clarity
8    let name = env!("CARGO_PKG_NAME");
9    let version = env!("CARGO_PKG_VERSION");
10
11    // What public functions and macro surfaces we advertise
12    let funcs = [
13        "add",
14        "mul",
15        "sum",
16        "Array::new",
17        "add_ct! / mul_ct! / sum_ct!",
18    ];
19
20    // Available backends in this prototype
21    let backends = ["cpu", "webgpu", "cuda", "metal", "blas"];
22
23    // Determine selected backend from dispatch validation
24    let selected = if validation.blas_validated {
25        "blas"
26    } else if validation.webgpu_validated {
27        "webgpu"
28    } else if validation.gpu_validated {
29        "cuda/metal"
30    } else if validation.simd_validated {
31        "cpu-simd"
32    } else {
33        "cpu-scalar"
34    };
35
36    // Emit a compact log banner — use stderr so it is visible when loaded by other runtimes
37    eprintln!(
38        "[{} {}] available APIs: {}",
39        name,
40        version,
41        funcs.join(", ")
42    );
43    eprintln!(
44        "[{} {}] supported backends: {}",
45        name,
46        version,
47        backends.join(", ")
48    );
49    eprintln!("[{} {}] selected backend: {}", name, version, selected);
50
51    // Show per-API preferred backend mapping from dispatch table
52    eprintln!(
53        "[{} {}] op -> backend mapping: add -> {} ; mul -> {} ; sum -> {} ; matmul -> {}",
54        name,
55        version,
56        dispatch_table.elementwise_backend,
57        dispatch_table.elementwise_backend, // mul uses same as add
58        dispatch_table.reduction_backend,
59        dispatch_table.matmul_backend
60    );
61
62    // Print runtime-detected capabilities
63    let caps = crate::backend::RuntimeCapabilities {
64        has_simd: validation.simd_validated,
65        has_gpu: validation.gpu_validated || validation.webgpu_validated,
66        has_blas: validation.blas_validated,
67        has_threads: num_cpus::get() > 1,
68        has_wasm_simd: false,
69        has_webgpu: validation.webgpu_validated,
70    };
71    eprintln!("[{} {}] runtime caps: has_simd={} has_gpu={} has_blas={} has_threads={} has_wasm_simd={} has_webgpu={}",
72        name, version, caps.has_simd, caps.has_gpu, caps.has_blas, caps.has_threads, caps.has_wasm_simd, caps.has_webgpu);
73
74    // Final dispatch table info
75    eprintln!("[{} {}] === DISPATCH TABLE (ZERO-COST) ===", name, version);
76    eprintln!(
77        "[{} {}] elementwise: {} | reduction: {} | matmul: {} | dot: {}",
78        name,
79        version,
80        dispatch_table.elementwise_backend,
81        dispatch_table.reduction_backend,
82        dispatch_table.matmul_backend,
83        dispatch_table.dot_backend
84    );
85    eprintln!(
86        "[{} {}] validation: blas={} metal={} webgpu={} simd={}",
87        name,
88        version,
89        validation.blas_validated,
90        validation.metal_validated,
91        validation.webgpu_validated,
92        validation.simd_validated
93    );
94}