Current section

Files

Jump to
viva_tensor src viva_tensor@optim@backend.erl
Raw

src/viva_tensor@optim@backend.erl

-module(viva_tensor@optim@backend).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/viva_tensor/optim/backend.gleam").
-export([default_config/0, performance_config/0, memory_config/0, gpu_config/0, should_use_strided/3, ensure_optimal/3, for_matmul/1, for_reduction/1, for_indexing/1]).
-export_type([operation_type/0, tensor_config/0]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
?MODULEDOC(false).
-type operation_type() :: sequential | random_access | matrix_op.
-type tensor_config() :: {tensor_config,
integer(),
integer(),
boolean(),
boolean()}.
-file("src/viva_tensor/optim/backend.gleam", 45).
?DOC(false).
-spec default_config() -> tensor_config().
default_config() ->
{tensor_config, 500, 64, false, false}.
-file("src/viva_tensor/optim/backend.gleam", 55).
?DOC(false).
-spec performance_config() -> tensor_config().
performance_config() ->
{tensor_config, 100, 32, false, false}.
-file("src/viva_tensor/optim/backend.gleam", 65).
?DOC(false).
-spec memory_config() -> tensor_config().
memory_config() ->
{tensor_config, 5000, 256, false, false}.
-file("src/viva_tensor/optim/backend.gleam", 75).
?DOC(false).
-spec gpu_config() -> tensor_config().
gpu_config() ->
{tensor_config, 64, 16, false, false}.
-file("src/viva_tensor/optim/backend.gleam", 121).
?DOC(false).
-spec get_tensor_shape(viva_tensor@tensor:tensor()) -> list(integer()).
get_tensor_shape(T) ->
case T of
{tensor, _, Shape} ->
Shape;
{strided_tensor, _, Shape@1, _, _} ->
Shape@1;
{native_tensor, _, Shape@2} ->
Shape@2
end.
-file("src/viva_tensor/optim/backend.gleam", 89).
?DOC(false).
-spec should_use_strided(
viva_tensor@tensor:tensor(),
operation_type(),
tensor_config()
) -> boolean().
should_use_strided(T, Op, Config) ->
case {erlang:element(4, Config), erlang:element(5, Config)} of
{true, _} ->
true;
{_, true} ->
false;
{false, false} ->
Tensor_size = viva_tensor@tensor:size(T),
case Op of
sequential ->
false;
random_access ->
Tensor_size >= erlang:element(2, Config);
matrix_op ->
Shape = get_tensor_shape(T),
case Shape of
[Rows, Cols] ->
(Rows * Cols) >= erlang:element(3, Config);
_ ->
Tensor_size >= erlang:element(3, Config)
end
end
end.
-file("src/viva_tensor/optim/backend.gleam", 130).
?DOC(false).
-spec ensure_optimal(
viva_tensor@tensor:tensor(),
operation_type(),
tensor_config()
) -> viva_tensor@tensor:tensor().
ensure_optimal(T, Op, Config) ->
Use_strided = should_use_strided(T, Op, Config),
case {T, Use_strided} of
{{native_tensor, _, _}, _} ->
T;
{{strided_tensor, _, _, _, _}, true} ->
T;
{{tensor, _, _}, false} ->
T;
{{tensor, _, _}, true} ->
viva_tensor@tensor:to_strided(T);
{{strided_tensor, _, _, _, _}, false} ->
viva_tensor@tensor:to_contiguous(T)
end.
-file("src/viva_tensor/optim/backend.gleam", 156).
?DOC(false).
-spec for_matmul(viva_tensor@tensor:tensor()) -> viva_tensor@tensor:tensor().
for_matmul(T) ->
ensure_optimal(T, matrix_op, default_config()).
-file("src/viva_tensor/optim/backend.gleam", 161).
?DOC(false).
-spec for_reduction(viva_tensor@tensor:tensor()) -> viva_tensor@tensor:tensor().
for_reduction(T) ->
ensure_optimal(T, sequential, default_config()).
-file("src/viva_tensor/optim/backend.gleam", 166).
?DOC(false).
-spec for_indexing(viva_tensor@tensor:tensor()) -> viva_tensor@tensor:tensor().
for_indexing(T) ->
ensure_optimal(T, random_access, default_config()).