-module(viva_tensor@benchmark). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/viva_tensor/benchmark.gleam"). -export([main/0]). -file("src/viva_tensor/benchmark.gleam", 249). -spec format_size(integer()) -> binary(). format_size(N) -> case N of _ when N >= 1000000 -> <<(erlang:integer_to_binary(N div 1000000))/binary, "M"/utf8>>; _ when N >= 1000 -> <<(erlang:integer_to_binary(N div 1000))/binary, "K"/utf8>>; _ -> erlang:integer_to_binary(N) end. -file("src/viva_tensor/benchmark.gleam", 257). -spec pad_right(binary(), integer()) -> binary(). pad_right(S, Width) -> Len = string:length(S), case Len < Width of true -> <>, Width - Len))/binary>>; false -> S end. -file("src/viva_tensor/benchmark.gleam", 265). -spec float_to_string_0(float()) -> binary(). float_to_string_0(F) -> erlang:integer_to_binary(erlang:round(F)). -file("src/viva_tensor/benchmark.gleam", 269). -spec float_to_string_1(float()) -> binary(). float_to_string_1(F) -> I = erlang:round(F * 10.0), Whole = I div 10, Frac = gleam@int:absolute_value(I) rem 10, <<<<(erlang:integer_to_binary(Whole))/binary, "."/utf8>>/binary, (erlang:integer_to_binary(Frac))/binary>>. -file("src/viva_tensor/benchmark.gleam", 119). -spec bench_lns(integer(), integer()) -> nil. bench_lns(Size, Iterations) -> T1@1 = case viva_tensor@core@ffi:nt_fill([Size], 2.0) of {ok, T1} -> T1; _assert_fail -> erlang:error(#{gleam_error => let_assert, message => <<"Pattern match failed, no pattern matched the value."/utf8>>, file => <>, module => <<"viva_tensor/benchmark"/utf8>>, function => <<"bench_lns"/utf8>>, line => 121, value => _assert_fail, start => 3491, 'end' => 3535, pattern_start => 3502, pattern_end => 3508}) end, T2@1 = case viva_tensor@core@ffi:nt_fill([Size], 3.0) of {ok, T2} -> T2; _assert_fail@1 -> erlang:error(#{gleam_error => let_assert, message => <<"Pattern match failed, no pattern matched the value."/utf8>>, file => <>, module => <<"viva_tensor/benchmark"/utf8>>, function => <<"bench_lns"/utf8>>, line => 122, value => _assert_fail@1, start => 3538, 'end' => 3582, pattern_start => 3549, pattern_end => 3555}) end, Lns_a@1 = case viva_tensor@core@ffi:lns_from_f64(T1@1) of {ok, Lns_a} -> Lns_a; _assert_fail@2 -> erlang:error(#{gleam_error => let_assert, message => <<"Pattern match failed, no pattern matched the value."/utf8>>, file => <>, module => <<"viva_tensor/benchmark"/utf8>>, function => <<"bench_lns"/utf8>>, line => 123, value => _assert_fail@2, start => 3585, 'end' => 3628, pattern_start => 3596, pattern_end => 3605}) end, Lns_b@1 = case viva_tensor@core@ffi:lns_from_f64(T2@1) of {ok, Lns_b} -> Lns_b; _assert_fail@3 -> erlang:error(#{gleam_error => let_assert, message => <<"Pattern match failed, no pattern matched the value."/utf8>>, file => <>, module => <<"viva_tensor/benchmark"/utf8>>, function => <<"bench_lns"/utf8>>, line => 124, value => _assert_fail@3, start => 3631, 'end' => 3674, pattern_start => 3642, pattern_end => 3651}) end, case viva_tensor@core@ffi:lns_mul(Lns_a@1, Lns_b@1) of {ok, _} -> nil; _assert_fail@4 -> erlang:error(#{gleam_error => let_assert, message => <<"Pattern match failed, no pattern matched the value."/utf8>>, file => <>, module => <<"viva_tensor/benchmark"/utf8>>, function => <<"bench_lns"/utf8>>, line => 127, value => _assert_fail@4, start => 3690, 'end' => 3734, pattern_start => 3701, pattern_end => 3706}) end, Start = viva_tensor@core@ffi:now_microseconds(), _pipe = gleam@list:range(1, Iterations), gleam@list:each( _pipe, fun(_) -> case viva_tensor@core@ffi:lns_mul(Lns_a@1, Lns_b@1) of {ok, _} -> nil; _assert_fail@5 -> erlang:error(#{gleam_error => let_assert, message => <<"Pattern match failed, no pattern matched the value."/utf8>>, file => <>, module => <<"viva_tensor/benchmark"/utf8>>, function => <<"bench_lns"/utf8>>, line => 134, value => _assert_fail@5, start => 3852, 'end' => 3896, pattern_start => 3863, pattern_end => 3868}) end, nil end ), End = viva_tensor@core@ffi:now_microseconds(), Avg_us = case erlang:float(Iterations) of +0.0 -> +0.0; -0.0 -> -0.0; Gleam@denominator -> erlang:float(End - Start) / Gleam@denominator end, Ops = erlang:float(Size), Gops = (case Avg_us of +0.0 -> +0.0; -0.0 -> -0.0; Gleam@denominator@1 -> Ops / Gleam@denominator@1 end) / 1000.0, Size_str = format_size(Size), Time_str = <<(float_to_string_1(Avg_us))/binary, " us"/utf8>>, Gops_str = <<(float_to_string_1(Gops))/binary, " GIOP (IADD)"/utf8>>, gleam_stdlib:println( <<<<<<<<" LNS mul "/utf8, (pad_right(Size_str, 8))/binary>>/binary, Time_str/binary>>/binary, " "/utf8>>/binary, Gops_str/binary>> ). -file("src/viva_tensor/benchmark.gleam", 154). -spec bench_horde(integer(), integer()) -> nil. bench_horde(Entity_count, Iterations) -> Horde@1 = case viva_tensor@core@ffi:horde_create(Entity_count, 2) of {ok, Horde} -> Horde; _assert_fail -> erlang:error(#{gleam_error => let_assert, message => <<"Pattern match failed, no pattern matched the value."/utf8>>, file => <>, module => <<"viva_tensor/benchmark"/utf8>>, function => <<"bench_horde"/utf8>>, line => 156, value => _assert_fail, start => 4467, 'end' => 4523, pattern_start => 4478, pattern_end => 4487}) end, Positions = begin _pipe = gleam@list:range(0, Entity_count - 1), gleam@list:flat_map( _pipe, fun(I) -> [erlang:float(I), erlang:float(I)] end ) end, Velocities = begin _pipe@1 = gleam@list:range(0, Entity_count - 1), gleam@list:flat_map(_pipe@1, fun(_) -> [1.0, 0.5] end) end, case viva_tensor@core@ffi:horde_set_positions(Horde@1, Positions) of {ok, _} -> nil; _assert_fail@1 -> erlang:error(#{gleam_error => let_assert, message => <<"Pattern match failed, no pattern matched the value."/utf8>>, file => <>, module => <<"viva_tensor/benchmark"/utf8>>, function => <<"bench_horde"/utf8>>, line => 167, value => _assert_fail@1, start => 4790, 'end' => 4850, pattern_start => 4801, pattern_end => 4806}) end, case viva_tensor@core@ffi:horde_set_velocities(Horde@1, Velocities) of {ok, _} -> nil; _assert_fail@2 -> erlang:error(#{gleam_error => let_assert, message => <<"Pattern match failed, no pattern matched the value."/utf8>>, file => <>, module => <<"viva_tensor/benchmark"/utf8>>, function => <<"bench_horde"/utf8>>, line => 168, value => _assert_fail@2, start => 4853, 'end' => 4915, pattern_start => 4864, pattern_end => 4869}) end, case viva_tensor@core@ffi:horde_integrate(Horde@1, 0.01667) of {ok, _} -> nil; _assert_fail@3 -> erlang:error(#{gleam_error => let_assert, message => <<"Pattern match failed, no pattern matched the value."/utf8>>, file => <>, module => <<"viva_tensor/benchmark"/utf8>>, function => <<"bench_horde"/utf8>>, line => 171, value => _assert_fail@3, start => 4931, 'end' => 4985, pattern_start => 4942, pattern_end => 4947}) end, case viva_tensor@core@ffi:horde_dampen(Horde@1, 0.99) of {ok, _} -> nil; _assert_fail@4 -> erlang:error(#{gleam_error => let_assert, message => <<"Pattern match failed, no pattern matched the value."/utf8>>, file => <>, module => <<"viva_tensor/benchmark"/utf8>>, function => <<"bench_horde"/utf8>>, line => 172, value => _assert_fail@4, start => 4988, 'end' => 5036, pattern_start => 4999, pattern_end => 5004}) end, Start = viva_tensor@core@ffi:now_microseconds(), _pipe@2 = gleam@list:range(1, Iterations), gleam@list:each( _pipe@2, fun(_) -> case viva_tensor@core@ffi:horde_integrate(Horde@1, 0.01667) of {ok, _} -> nil; _assert_fail@5 -> erlang:error(#{gleam_error => let_assert, message => <<"Pattern match failed, no pattern matched the value."/utf8>>, file => <>, module => <<"viva_tensor/benchmark"/utf8>>, function => <<"bench_horde"/utf8>>, line => 179, value => _assert_fail@5, start => 5185, 'end' => 5239, pattern_start => 5196, pattern_end => 5201}) end, case viva_tensor@core@ffi:horde_dampen(Horde@1, 0.99) of {ok, _} -> nil; _assert_fail@6 -> erlang:error(#{gleam_error => let_assert, message => <<"Pattern match failed, no pattern matched the value."/utf8>>, file => <>, module => <<"viva_tensor/benchmark"/utf8>>, function => <<"bench_horde"/utf8>>, line => 180, value => _assert_fail@6, start => 5244, 'end' => 5292, pattern_start => 5255, pattern_end => 5260}) end, nil end ), End = viva_tensor@core@ffi:now_microseconds(), Avg_us = case erlang:float(Iterations) of +0.0 -> +0.0; -0.0 -> -0.0; Gleam@denominator -> erlang:float(End - Start) / Gleam@denominator end, Fps_equiv = case Avg_us of +0.0 -> +0.0; -0.0 -> -0.0; Gleam@denominator@1 -> 1000000.0 / Gleam@denominator@1 end, Size_str = format_size(Entity_count), Time_str = <<(float_to_string_1(Avg_us))/binary, " us"/utf8>>, Fps_str = <<(float_to_string_0(Fps_equiv))/binary, " fps"/utf8>>, gleam_stdlib:println( <<<<<<<<" Horde "/utf8, (pad_right(Size_str, 10))/binary>>/binary, Time_str/binary>>/binary, " "/utf8>>/binary, Fps_str/binary>> ). -file("src/viva_tensor/benchmark.gleam", 199). -spec bench_hdc(integer(), integer()) -> nil. bench_hdc(Dim, Iterations) -> Vec_a@1 = case viva_tensor@core@ffi:hdc_random(Dim, 42) of {ok, Vec_a} -> Vec_a; _assert_fail -> erlang:error(#{gleam_error => let_assert, message => <<"Pattern match failed, no pattern matched the value."/utf8>>, file => <>, module => <<"viva_tensor/benchmark"/utf8>>, function => <<"bench_hdc"/utf8>>, line => 201, value => _assert_fail, start => 5833, 'end' => 5879, pattern_start => 5844, pattern_end => 5853}) end, Vec_b@1 = case viva_tensor@core@ffi:hdc_random(Dim, 43) of {ok, Vec_b} -> Vec_b; _assert_fail@1 -> erlang:error(#{gleam_error => let_assert, message => <<"Pattern match failed, no pattern matched the value."/utf8>>, file => <>, module => <<"viva_tensor/benchmark"/utf8>>, function => <<"bench_hdc"/utf8>>, line => 202, value => _assert_fail@1, start => 5882, 'end' => 5928, pattern_start => 5893, pattern_end => 5902}) end, case viva_tensor@core@ffi:hdc_bind(Vec_a@1, Vec_b@1) of {ok, _} -> nil; _assert_fail@2 -> erlang:error(#{gleam_error => let_assert, message => <<"Pattern match failed, no pattern matched the value."/utf8>>, file => <>, module => <<"viva_tensor/benchmark"/utf8>>, function => <<"bench_hdc"/utf8>>, line => 205, value => _assert_fail@2, start => 5944, 'end' => 5989, pattern_start => 5955, pattern_end => 5960}) end, case viva_tensor@core@ffi:hdc_similarity(Vec_a@1, Vec_b@1) of {ok, _} -> nil; _assert_fail@3 -> erlang:error(#{gleam_error => let_assert, message => <<"Pattern match failed, no pattern matched the value."/utf8>>, file => <>, module => <<"viva_tensor/benchmark"/utf8>>, function => <<"bench_hdc"/utf8>>, line => 206, value => _assert_fail@3, start => 5992, 'end' => 6043, pattern_start => 6003, pattern_end => 6008}) end, Start1 = viva_tensor@core@ffi:now_microseconds(), _pipe = gleam@list:range(1, Iterations), gleam@list:each( _pipe, fun(_) -> case viva_tensor@core@ffi:hdc_bind(Vec_a@1, Vec_b@1) of {ok, _} -> nil; _assert_fail@4 -> erlang:error(#{gleam_error => let_assert, message => <<"Pattern match failed, no pattern matched the value."/utf8>>, file => <>, module => <<"viva_tensor/benchmark"/utf8>>, function => <<"bench_hdc"/utf8>>, line => 212, value => _assert_fail@4, start => 6162, 'end' => 6207, pattern_start => 6173, pattern_end => 6178}) end, nil end ), End1 = viva_tensor@core@ffi:now_microseconds(), Bind_us = case erlang:float(Iterations) of +0.0 -> +0.0; -0.0 -> -0.0; Gleam@denominator -> erlang:float(End1 - Start1) / Gleam@denominator end, Start2 = viva_tensor@core@ffi:now_microseconds(), _pipe@1 = gleam@list:range(1, Iterations), gleam@list:each( _pipe@1, fun(_) -> case viva_tensor@core@ffi:hdc_similarity(Vec_a@1, Vec_b@1) of {ok, _} -> nil; _assert_fail@5 -> erlang:error(#{gleam_error => let_assert, message => <<"Pattern match failed, no pattern matched the value."/utf8>>, file => <>, module => <<"viva_tensor/benchmark"/utf8>>, function => <<"bench_hdc"/utf8>>, line => 222, value => _assert_fail@5, start => 6449, 'end' => 6500, pattern_start => 6460, pattern_end => 6465}) end, nil end ), End2 = viva_tensor@core@ffi:now_microseconds(), Sim_us = case erlang:float(Iterations) of +0.0 -> +0.0; -0.0 -> -0.0; Gleam@denominator@1 -> erlang:float(End2 - Start2) / Gleam@denominator@1 end, Bind_ops = case Bind_us of +0.0 -> +0.0; -0.0 -> -0.0; Gleam@denominator@2 -> 1000000.0 / Gleam@denominator@2 end, Sim_ops = case Sim_us of +0.0 -> +0.0; -0.0 -> -0.0; Gleam@denominator@3 -> 1000000.0 / Gleam@denominator@3 end, gleam_stdlib:println( <<<<<<<<" HDC bind: "/utf8, (float_to_string_1(Bind_us))/binary>>/binary, " us "/utf8>>/binary, (float_to_string_0(Bind_ops))/binary>>/binary, " ops/sec"/utf8>> ), gleam_stdlib:println( <<<<<<<<" HDC similarity: "/utf8, (float_to_string_1(Sim_us))/binary>>/binary, " us "/utf8>>/binary, (float_to_string_0(Sim_ops))/binary>>/binary, " ops/sec"/utf8>> ). -file("src/viva_tensor/benchmark.gleam", 276). -spec float_to_string_2(float()) -> binary(). float_to_string_2(F) -> I = erlang:round(F * 100.0), Whole = I div 100, Frac = gleam@int:absolute_value(I) rem 100, Frac_str = case Frac < 10 of true -> <<"0"/utf8, (erlang:integer_to_binary(Frac))/binary>>; false -> erlang:integer_to_binary(Frac) end, <<<<(erlang:integer_to_binary(Whole))/binary, "."/utf8>>/binary, Frac_str/binary>>. -file("src/viva_tensor/benchmark.gleam", 85). -spec bench_matmul(integer(), integer()) -> nil. bench_matmul(N, Iterations) -> Shape = [N, N], A@1 = case viva_tensor@core@ffi:nt_ones(Shape) of {ok, A} -> A; _assert_fail -> erlang:error(#{gleam_error => let_assert, message => <<"Pattern match failed, no pattern matched the value."/utf8>>, file => <>, module => <<"viva_tensor/benchmark"/utf8>>, function => <<"bench_matmul"/utf8>>, line => 88, value => _assert_fail, start => 2490, 'end' => 2527, pattern_start => 2501, pattern_end => 2506}) end, B@1 = case viva_tensor@core@ffi:nt_ones(Shape) of {ok, B} -> B; _assert_fail@1 -> erlang:error(#{gleam_error => let_assert, message => <<"Pattern match failed, no pattern matched the value."/utf8>>, file => <>, module => <<"viva_tensor/benchmark"/utf8>>, function => <<"bench_matmul"/utf8>>, line => 89, value => _assert_fail@1, start => 2530, 'end' => 2567, pattern_start => 2541, pattern_end => 2546}) end, case viva_tensor@core@ffi:nt_matmul(A@1, B@1, N, N, N) of {ok, _} -> nil; _assert_fail@2 -> erlang:error(#{gleam_error => let_assert, message => <<"Pattern match failed, no pattern matched the value."/utf8>>, file => <>, module => <<"viva_tensor/benchmark"/utf8>>, function => <<"bench_matmul"/utf8>>, line => 92, value => _assert_fail@2, start => 2583, 'end' => 2630, pattern_start => 2594, pattern_end => 2599}) end, case viva_tensor@core@ffi:nt_matmul(A@1, B@1, N, N, N) of {ok, _} -> nil; _assert_fail@3 -> erlang:error(#{gleam_error => let_assert, message => <<"Pattern match failed, no pattern matched the value."/utf8>>, file => <>, module => <<"viva_tensor/benchmark"/utf8>>, function => <<"bench_matmul"/utf8>>, line => 93, value => _assert_fail@3, start => 2633, 'end' => 2680, pattern_start => 2644, pattern_end => 2649}) end, case viva_tensor@core@ffi:nt_matmul(A@1, B@1, N, N, N) of {ok, _} -> nil; _assert_fail@4 -> erlang:error(#{gleam_error => let_assert, message => <<"Pattern match failed, no pattern matched the value."/utf8>>, file => <>, module => <<"viva_tensor/benchmark"/utf8>>, function => <<"bench_matmul"/utf8>>, line => 94, value => _assert_fail@4, start => 2683, 'end' => 2730, pattern_start => 2694, pattern_end => 2699}) end, Start = viva_tensor@core@ffi:now_microseconds(), _pipe = gleam@list:range(1, Iterations), gleam@list:each( _pipe, fun(_) -> case viva_tensor@core@ffi:nt_matmul(A@1, B@1, N, N, N) of {ok, _} -> nil; _assert_fail@5 -> erlang:error(#{gleam_error => let_assert, message => <<"Pattern match failed, no pattern matched the value."/utf8>>, file => <>, module => <<"viva_tensor/benchmark"/utf8>>, function => <<"bench_matmul"/utf8>>, line => 101, value => _assert_fail@5, start => 2840, 'end' => 2887, pattern_start => 2851, pattern_end => 2856}) end, nil end ), End = viva_tensor@core@ffi:now_microseconds(), Avg_us = case erlang:float(Iterations) of +0.0 -> +0.0; -0.0 -> -0.0; Gleam@denominator -> erlang:float(End - Start) / Gleam@denominator end, Flops = 2.0 * erlang:float((N * N) * N), Gflops = (case Avg_us of +0.0 -> +0.0; -0.0 -> -0.0; Gleam@denominator@1 -> Flops / Gleam@denominator@1 end) / 1000.0, Size_str = <<<<(erlang:integer_to_binary(N))/binary, "x"/utf8>>/binary, (erlang:integer_to_binary(N))/binary>>, Time_str = <<(float_to_string_2(Avg_us / 1000.0))/binary, " ms"/utf8>>, Gflops_str = <<(float_to_string_1(Gflops))/binary, " GFLOPS"/utf8>>, gleam_stdlib:println( <<<<<<<<" "/utf8, (pad_right(Size_str, 12))/binary>>/binary, Time_str/binary>>/binary, " "/utf8>>/binary, Gflops_str/binary>> ). -file("src/viva_tensor/benchmark.gleam", 13). -spec main() -> nil. main() -> gleam_stdlib:println( begin _pipe = <<"="/utf8>>, gleam@string:repeat(_pipe, 60) end ), gleam_stdlib:println( <<" VIVA TENSOR BENCHMARK SUITE - Mad Scientist Edition"/utf8>> ), gleam_stdlib:println( begin _pipe@1 = <<"="/utf8>>, gleam@string:repeat(_pipe@1, 60) end ), gleam_stdlib:println(<<""/utf8>>), Backend = viva_tensor@core@ffi:zig_backend_info(), gleam_stdlib:println(<<"Backend: "/utf8, Backend/binary>>), gleam_stdlib:println(<<""/utf8>>), gleam_stdlib:println(<<">>> MATMUL BENCHMARKS (Goto GEMM, f64)"/utf8>>), gleam_stdlib:println( begin _pipe@2 = <<"-"/utf8>>, gleam@string:repeat(_pipe@2, 60) end ), Sizes = [100, 200, 500, 1000, 1500, 2000], gleam@list:each( Sizes, fun(N) -> Iterations = case N of 100 -> 100; 200 -> 50; 500 -> 20; 1000 -> 5; 1500 -> 3; _ -> 2 end, bench_matmul(N, Iterations) end ), gleam_stdlib:println(<<""/utf8>>), gleam_stdlib:println(<<">>> LNS BENCHMARKS (IADD mul, f32)"/utf8>>), gleam_stdlib:println( begin _pipe@3 = <<"-"/utf8>>, gleam@string:repeat(_pipe@3, 60) end ), bench_lns(10000, 1000), bench_lns(100000, 100), bench_lns(1000000, 10), gleam_stdlib:println(<<""/utf8>>), gleam_stdlib:println( <<">>> HORDE BENCHMARKS (SoA Physics, 60fps target)"/utf8>> ), gleam_stdlib:println( begin _pipe@4 = <<"-"/utf8>>, gleam@string:repeat(_pipe@4, 60) end ), bench_horde(1000, 1000), bench_horde(10000, 100), bench_horde(100000, 10), gleam_stdlib:println(<<""/utf8>>), gleam_stdlib:println(<<">>> HDC BENCHMARKS (10K-bit vectors)"/utf8>>), gleam_stdlib:println( begin _pipe@5 = <<"-"/utf8>>, gleam@string:repeat(_pipe@5, 60) end ), bench_hdc(10048, 10000), gleam_stdlib:println(<<""/utf8>>), gleam_stdlib:println( begin _pipe@6 = <<"="/utf8>>, gleam@string:repeat(_pipe@6, 60) end ), gleam_stdlib:println(<<" BENCHMARK COMPLETE"/utf8>>), gleam_stdlib:println( begin _pipe@7 = <<"="/utf8>>, gleam@string:repeat(_pipe@7, 60) end ).