Packages
Tensor library for Gleam/BEAM with a pure Gleam API, zero-copy views, and optional native acceleration
Retired package: Release invalid
Current section
Files
Jump to
Current section
Files
src/viva_tensor@cuda.erl
-module(viva_tensor@cuda).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/viva_tensor/cuda.gleam").
-export([new/2, to_list/1, shape/1, matmul/5, fp16_available/0, new16/2, to_list16/1, shape16/1, matmul16/5]).
-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(
" CudaTensor - Persistent GPU Memory\n"
"\n"
" Tensors that live on the GPU. Ideal for weights and heavy compute.\n"
"\n"
" - **FP32 (CudaTensor)**: Standard precision. 40+ TFLOPS on RTX 4090.\n"
" - **FP16 (CudaTensor16)**: Low precision, high throughput using Tensor Cores. 330+ TFLOPS!\n"
"\n"
" Data is uploaded once and stays on device.\n"
" Operations are launched asynchronously (mostly).\n"
).
-file("src/viva_tensor/cuda.gleam", 22).
?DOC(" Upload data to GPU (FP32)\n").
-spec new(list(float()), list(integer())) -> {ok,
viva_tensor@core@ffi:cuda_tensor_ref()} |
{error, binary()}.
new(Data, Shape) ->
viva_tensor_zig:ct_from_list(Data, Shape).
-file("src/viva_tensor/cuda.gleam", 27).
?DOC(" Download data from GPU (FP32)\n").
-spec to_list(viva_tensor@core@ffi:cuda_tensor_ref()) -> {ok, list(float())} |
{error, binary()}.
to_list(Tensor) ->
viva_tensor_zig:ct_to_list(Tensor).
-file("src/viva_tensor/cuda.gleam", 32).
?DOC(" Get shape of tensor\n").
-spec shape(viva_tensor@core@ffi:cuda_tensor_ref()) -> {ok, list(integer())} |
{error, binary()}.
shape(Tensor) ->
viva_tensor_zig:ct_shape(Tensor).
-file("src/viva_tensor/cuda.gleam", 38).
?DOC(
" Matrix Multiplication (FP32)\n"
" C = A @ B\n"
).
-spec matmul(
viva_tensor@core@ffi:cuda_tensor_ref(),
viva_tensor@core@ffi:cuda_tensor_ref(),
integer(),
integer(),
integer()
) -> {ok, viva_tensor@core@ffi:cuda_tensor_ref()} | {error, binary()}.
matmul(A, B, M, N, K) ->
viva_tensor_zig:ct_matmul(A, B, M, N, K).
-file("src/viva_tensor/cuda.gleam", 57).
?DOC(" Check if FP16 Tensor Cores are available\n").
-spec fp16_available() -> boolean().
fp16_available() ->
viva_tensor_zig:ct16_available().
-file("src/viva_tensor/cuda.gleam", 62).
?DOC(" Upload data to GPU (converts f64 -> f16)\n").
-spec new16(list(float()), list(integer())) -> {ok,
viva_tensor@core@ffi:cuda_tensor16_ref()} |
{error, binary()}.
new16(Data, Shape) ->
viva_tensor_zig:ct16_from_list(Data, Shape).
-file("src/viva_tensor/cuda.gleam", 70).
?DOC(" Download data from GPU (converts f16 -> f64)\n").
-spec to_list16(viva_tensor@core@ffi:cuda_tensor16_ref()) -> {ok, list(float())} |
{error, binary()}.
to_list16(Tensor) ->
viva_tensor_zig:ct16_to_list(Tensor).
-file("src/viva_tensor/cuda.gleam", 75).
?DOC(" Get shape of FP16 tensor\n").
-spec shape16(viva_tensor@core@ffi:cuda_tensor16_ref()) -> {ok, list(integer())} |
{error, binary()}.
shape16(Tensor) ->
viva_tensor_zig:ct16_shape(Tensor).
-file("src/viva_tensor/cuda.gleam", 84).
?DOC(
" Matrix Multiplication (FP16 Tensor Cores)\n"
" C = A @ B\n"
"\n"
" Uses HMMA (Half-precision Matrix Multiply Accumulate) instructions.\n"
" Expect massive speedups (up to 330 TFLOPS) if dimensions align with 16x16.\n"
).
-spec matmul16(
viva_tensor@core@ffi:cuda_tensor16_ref(),
viva_tensor@core@ffi:cuda_tensor16_ref(),
integer(),
integer(),
integer()
) -> {ok, viva_tensor@core@ffi:cuda_tensor16_ref()} | {error, binary()}.
matmul16(A, B, M, N, K) ->
viva_tensor_zig:ct16_matmul(A, B, M, N, K).