pub struct GpuRunner {
pub gpu_data: GpuData,
/* private fields */
}Expand description
Gpu runner for easier gpu usage
Fields§
§gpu_data: GpuDataImplementations§
Source§impl GpuRunner
impl GpuRunner
Sourcepub async fn backward_bias(&mut self) -> Vec<Tensor<f32>>
pub async fn backward_bias(&mut self) -> Vec<Tensor<f32>>
Backpropagation for bias without activation No need to care about output shape while creating sample It is managed by GpuRunner
§Example
use flashlight_tensor::prelude::*;
#[tokio::main]
async fn main(){
if std::env::var("CI").is_ok() {
eprintln!("Skipping GPU test in CI");
return;
}
let grad_output: Tensor<f32> = Tensor::fill(0.69, &[3, 2]);
let linear_cache: Tensor<f32> = Tensor::fill(0.2137, &[3, 2]);
let bias: Tensor<f32> = Tensor::fill(0.12412, &[3, 1]);
let learning_rate = 0.01;
let sample = Sample::from_data(vec!{bias, grad_output, linear_cache}, vec!{learning_rate}, &[]);
let mut runner = GpuRunner::init(1, MemoryMetric::GB);
runner.append(sample);
let full_gpu_output: Vec<Tensor<f32>> = runner.backward_bias().await;
}Source§impl GpuRunner
impl GpuRunner
Sourcepub async fn backward_grad(&mut self) -> Vec<Tensor<f32>>
pub async fn backward_grad(&mut self) -> Vec<Tensor<f32>>
Backpropagation for gradient without activation No need to care about output shape while creating sample It is managed by GpuRunner
§Example
use flashlight_tensor::prelude::*;
#[tokio::main]
async fn main(){
if std::env::var("CI").is_ok() {
eprintln!("Skipping GPU test in CI");
return;
}
let grad_output: Tensor<f32> = Tensor::fill(0.69, &[3, 2]);
let weights: Tensor<f32> = Tensor::fill(0.12412, &[3, 3]);
let sample = Sample::from_data(vec!{weights, grad_output}, vec!{}, &[]);
let mut runner = GpuRunner::init(1, MemoryMetric::GB);
runner.append(sample);
let full_gpu_output: Vec<Tensor<f32>> = runner.backward_grad().await;
}Source§impl GpuRunner
impl GpuRunner
Sourcepub async fn backward_weight(&mut self) -> Vec<Tensor<f32>>
pub async fn backward_weight(&mut self) -> Vec<Tensor<f32>>
Backpropagation for weights without activation No need to care about output shape while creating sample It is managed by GpuRunner
§Example
use flashlight_tensor::prelude::*;
#[tokio::main]
async fn main(){
if std::env::var("CI").is_ok() {
eprintln!("Skipping GPU test in CI");
return;
}
let grad_output: Tensor<f32> = Tensor::fill(0.69, &[3, 2]);
let linear_cache: Tensor<f32> = Tensor::fill(0.2137, &[3, 2]);
let weights: Tensor<f32> = Tensor::fill(0.12412, &[3, 3]);
let learning_rate = 0.01;
let sample = Sample::from_data(vec!{weights, grad_output, linear_cache}, vec!{learning_rate}, &[]);
let mut runner = GpuRunner::init(1, MemoryMetric::GB);
runner.append(sample);
let full_gpu_output: Vec<Tensor<f32>> = runner.backward_weight().await;
}Source§impl GpuRunner
impl GpuRunner
Sourcepub async fn forward_no_activ(&mut self) -> Vec<Tensor<f32>>
pub async fn forward_no_activ(&mut self) -> Vec<Tensor<f32>>
Forward propagation without activation No need to care about output shape while creating sample It is managed by GpuRunner
§Example
use flashlight_tensor::prelude::*;
#[tokio::main]
async fn main(){
if std::env::var("CI").is_ok() {
eprintln!("Skipping GPU test in CI");
return;
}
let inputs: Tensor<f32> = Tensor::from_data(&[1.0, 2.0, 0.5, 0.1, 0.3, 0.6], &[2, 3]).unwrap();
let weights: Tensor<f32> = Tensor::from_data(&[2.0, 3.0, -4.0, 5.0], &[2,2]).unwrap();
let biases: Tensor<f32> = Tensor::from_data(&[3.0, 4.0], &[2,1]).unwrap();
let sample = Sample::from_data(vec!{weights, inputs, biases}, vec!{}, &[]);
let mut runner = GpuRunner::init(1, MemoryMetric::GB);
runner.append(sample);
let full_gpu_output: Vec<Tensor<f32>> = runner.forward_no_activ().await;
}Sourcepub async fn forward_relu(&mut self) -> Vec<Tensor<f32>>
pub async fn forward_relu(&mut self) -> Vec<Tensor<f32>>
Forward propagation with relu activation No need to care about output shape while creating sample It is managed by GpuRunner
§Example
use flashlight_tensor::prelude::*;
#[tokio::main]
async fn main(){
if std::env::var("CI").is_ok() {
eprintln!("Skipping GPU test in CI");
return;
}
let inputs: Tensor<f32> = Tensor::from_data(&[1.0, 2.0, 0.5, 0.1, 0.3, 0.6], &[2, 3]).unwrap();
let weights: Tensor<f32> = Tensor::from_data(&[2.0, 3.0, -4.0, 5.0], &[2,2]).unwrap();
let biases: Tensor<f32> = Tensor::from_data(&[3.0, 4.0], &[2,1]).unwrap();
let sample = Sample::from_data(vec!{weights, inputs, biases}, vec!{}, &[]);
let mut runner = GpuRunner::init(1, MemoryMetric::GB);
runner.append(sample);
let full_gpu_output: Vec<Tensor<f32>> = runner.forward_relu().await;
}Sourcepub async fn forward_sigmoid(&mut self) -> Vec<Tensor<f32>>
pub async fn forward_sigmoid(&mut self) -> Vec<Tensor<f32>>
Forward propagation with sigmoid activation No need to care about output shape while creating sample It is managed by GpuRunner
§Example
use flashlight_tensor::prelude::*;
#[tokio::main]
async fn main(){
if std::env::var("CI").is_ok() {
eprintln!("Skipping GPU test in CI");
return;
}
let inputs: Tensor<f32> = Tensor::from_data(&[1.0, 2.0, 0.5, 0.1, 0.3, 0.6], &[2, 3]).unwrap();
let weights: Tensor<f32> = Tensor::from_data(&[2.0, 3.0, -4.0, 5.0], &[2,2]).unwrap();
let biases: Tensor<f32> = Tensor::from_data(&[3.0, 4.0], &[2,1]).unwrap();
let sample = Sample::from_data(vec!{weights, inputs, biases}, vec!{}, &[]);
let mut runner = GpuRunner::init(1, MemoryMetric::GB);
runner.append(sample);
let full_gpu_output: Vec<Tensor<f32>> = runner.forward_sigmoid().await;
}Source§impl GpuRunner
impl GpuRunner
Sourcepub async fn relu(&mut self) -> Vec<Tensor<f32>>
pub async fn relu(&mut self) -> Vec<Tensor<f32>>
Perform a relu operation on tensor using GpuRunner No need to care about output shape while creating sample It is managed by GpuRunner
§Example
use flashlight_tensor::prelude::*;
#[tokio::main]
async fn main(){
if std::env::var("CI").is_ok() {
eprintln!("Skipping GPU test in CI");
return;
}
let mut runner: GpuRunner = GpuRunner::init(1, MemoryMetric::GB);
let sample = Sample::from_data(vec!{Tensor::fill(1.0, &[2, 2])}, vec!{1.0}, &[]);
runner.append(sample);
let output_data: Vec<Tensor<f32>> = runner.relu().await;
}Sourcepub async fn relu_der(&mut self) -> Vec<Tensor<f32>>
pub async fn relu_der(&mut self) -> Vec<Tensor<f32>>
Perform a relu derivative operation on tensor using GpuRunner No need to care about output shape while creating sample It is managed by GpuRunner
§Example
use flashlight_tensor::prelude::*;
#[tokio::main]
async fn main(){
if std::env::var("CI").is_ok() {
eprintln!("Skipping GPU test in CI");
return;
}
let mut runner: GpuRunner = GpuRunner::init(1, MemoryMetric::GB);
let sample = Sample::from_data(vec!{Tensor::fill(1.0, &[2, 2])}, vec!{1.0}, &[]);
runner.append(sample);
let output_data: Vec<Tensor<f32>> = runner.relu_der().await;
}Sourcepub async fn sigmoid(&mut self) -> Vec<Tensor<f32>>
pub async fn sigmoid(&mut self) -> Vec<Tensor<f32>>
Perform a sigmoid operation on tensor using GpuRunner No need to care about output shape while creating sample It is managed by GpuRunner
§Example
use flashlight_tensor::prelude::*;
#[tokio::main]
async fn main(){
if std::env::var("CI").is_ok() {
eprintln!("Skipping GPU test in CI");
return;
}
let mut runner: GpuRunner = GpuRunner::init(1, MemoryMetric::GB);
let sample = Sample::from_data(vec!{Tensor::fill(1.0, &[2, 2])}, vec!{1.0}, &[]);
runner.append(sample);
let output_data: Vec<Tensor<f32>> = runner.sigmoid().await;
}Sourcepub async fn sigmoid_der(&mut self) -> Vec<Tensor<f32>>
pub async fn sigmoid_der(&mut self) -> Vec<Tensor<f32>>
Perform a sigmoid derivative operation on tensor using GpuRunner No need to care about output shape while creating sample It is managed by GpuRunner
§Example
use flashlight_tensor::prelude::*;
#[tokio::main]
async fn main(){
if std::env::var("CI").is_ok() {
eprintln!("Skipping GPU test in CI");
return;
}
let mut runner: GpuRunner = GpuRunner::init(1, MemoryMetric::GB);
let sample = Sample::from_data(vec!{Tensor::fill(1.0, &[2, 2])}, vec!{1.0}, &[]);
runner.append(sample);
let output_data: Vec<Tensor<f32>> = runner.sigmoid().await;
}Source§impl GpuRunner
impl GpuRunner
Sourcepub async fn backward_relu(&mut self) -> Vec<Tensor<f32>>
pub async fn backward_relu(&mut self) -> Vec<Tensor<f32>>
Perform a relu operation on tensor using GpuRunner No need to care about output shape while creating sample It is managed by GpuRunner
§Example
use flashlight_tensor::prelude::*;
#[tokio::main]
async fn main(){
if std::env::var("CI").is_ok() {
eprintln!("Skipping GPU test in CI");
return;
}
let mut runner: GpuRunner = GpuRunner::init(1, MemoryMetric::GB);
let sample = Sample::from_data(vec!{Tensor::fill(1.0, &[2, 1]), Tensor::fill(1.0, &[1, 2])}, vec!{}, &[]);
runner.append(sample);
let output_data: Vec<Tensor<f32>> = runner.backward_relu().await;
}Sourcepub async fn backward_sigmoid(&mut self) -> Vec<Tensor<f32>>
pub async fn backward_sigmoid(&mut self) -> Vec<Tensor<f32>>
Perform a relu operation on tensor using GpuRunner No need to care about output shape while creating sample It is managed by GpuRunner
§Example
use flashlight_tensor::prelude::*;
#[tokio::main]
async fn main(){
if std::env::var("CI").is_ok() {
eprintln!("Skipping GPU test in CI");
return;
}
let mut runner: GpuRunner = GpuRunner::init(1, MemoryMetric::GB);
let sample = Sample::from_data(vec!{Tensor::fill(1.0, &[2, 1]), Tensor::fill(1.0, &[1, 2])}, vec!{}, &[]);
runner.append(sample);
let output_data: Vec<Tensor<f32>> = runner.backward_sigmoid().await;
}Source§impl GpuRunner
impl GpuRunner
Sourcepub async fn add(&mut self) -> Vec<Tensor<f32>>
pub async fn add(&mut self) -> Vec<Tensor<f32>>
Perform an addition operation on tensor using GpuRunner No need to care about output shape while creating sample It is managed by GpuRunner
§Example
use flashlight_tensor::prelude::*;
#[tokio::main]
async fn main(){
if std::env::var("CI").is_ok() {
eprintln!("Skipping GPU test in CI");
return;
}
let mut runner: GpuRunner = GpuRunner::init(1, MemoryMetric::GB);
let sample = Sample::from_data(vec!{Tensor::fill(1.0, &[2, 2])}, vec!{1.0}, &[]);
runner.append(sample);
let output_data: Vec<Tensor<f32>> = runner.add().await;
}Sourcepub async fn tens_add(&mut self) -> Vec<Tensor<f32>>
pub async fn tens_add(&mut self) -> Vec<Tensor<f32>>
Perform a tensor addition operation on tensors using GpuRunner No need to care about output shape while creating sample It is managed by GpuRunner
§Example
use flashlight_tensor::prelude::*;
#[tokio::main]
async fn main(){
if std::env::var("CI").is_ok() {
eprintln!("Skipping GPU test in CI");
return;
}
let mut runner: GpuRunner = GpuRunner::init(1, MemoryMetric::GB);
let sample = Sample::from_data(vec!{Tensor::fill(1.0, &[2, 2]), Tensor::fill(1.0, &[2, 2])}, vec!{}, &[]);
runner.append(sample);
let output_data: Vec<Tensor<f32>> = runner.tens_add().await;
}Source§impl GpuRunner
impl GpuRunner
Sourcepub async fn div(&mut self) -> Vec<Tensor<f32>>
pub async fn div(&mut self) -> Vec<Tensor<f32>>
Perform a division operation on tensor using GpuRunner No need to care about output shape while creating sample It is managed by GpuRunner
§Example
use flashlight_tensor::prelude::*;
#[tokio::main]
async fn main(){
if std::env::var("CI").is_ok() {
eprintln!("Skipping GPU test in CI");
return;
}
let mut runner: GpuRunner = GpuRunner::init(1, MemoryMetric::GB);
let sample = Sample::from_data(vec!{Tensor::fill(1.0, &[2, 2])}, vec!{1.0}, &[]);
runner.append(sample);
let output_data: Vec<Tensor<f32>> = runner.div().await;
}Sourcepub async fn tens_div(&mut self) -> Vec<Tensor<f32>>
pub async fn tens_div(&mut self) -> Vec<Tensor<f32>>
Perform a tensor division operation on tensors using GpuRunner No need to care about output shape while creating sample It is managed by GpuRunner
§Example
use flashlight_tensor::prelude::*;
#[tokio::main]
async fn main(){
if std::env::var("CI").is_ok() {
eprintln!("Skipping GPU test in CI");
return;
}
let mut runner: GpuRunner = GpuRunner::init(1, MemoryMetric::GB);
let sample = Sample::from_data(vec!{Tensor::fill(1.0, &[2, 2]), Tensor::fill(1.0, &[2, 2])}, vec!{}, &[]);
runner.append(sample);
let output_data: Vec<Tensor<f32>> = runner.tens_div().await;
}Source§impl GpuRunner
impl GpuRunner
Sourcepub async fn log(&mut self) -> Vec<Tensor<f32>>
pub async fn log(&mut self) -> Vec<Tensor<f32>>
Perform a logarighmic operation on tensors using GpuRunner No need to care about output shape while creating sample It is managed by GpuRunner
§Example
use flashlight_tensor::prelude::*;
#[tokio::main]
async fn main(){
if std::env::var("CI").is_ok() {
eprintln!("Skipping GPU test in CI");
return;
}
let mut runner: GpuRunner = GpuRunner::init(1, MemoryMetric::GB);
let sample = Sample::from_data(vec!{Tensor::fill(2.0, &[2, 2])}, vec!{2.0}, &[]);
runner.append(sample);
let output_data: Vec<Tensor<f32>> = runner.log().await;
}Sourcepub async fn nlog(&mut self) -> Vec<Tensor<f32>>
pub async fn nlog(&mut self) -> Vec<Tensor<f32>>
Perform a natural log (log10) operation on tensors using GpuRunner No need to care about output shape while creating sample It is managed by GpuRunner
§Example
use flashlight_tensor::prelude::*;
#[tokio::main]
async fn main(){
if std::env::var("CI").is_ok() {
eprintln!("Skipping GPU test in CI");
return;
}
let mut runner: GpuRunner = GpuRunner::init(1, MemoryMetric::GB);
let sample = Sample::from_data(vec!{Tensor::fill(10.0, &[2, 2])}, vec!{}, &[]);
runner.append(sample);
let output_data: Vec<Tensor<f32>> = runner.nlog().await;
}Source§impl GpuRunner
impl GpuRunner
Sourcepub async fn matmul(&mut self) -> Vec<Tensor<f32>>
pub async fn matmul(&mut self) -> Vec<Tensor<f32>>
Perform a matmul operation on tensors using GpuRunner No need to care about output shape while creating sample It is managed by GpuRunner
§Example
use flashlight_tensor::prelude::*;
#[tokio::main]
async fn main(){
if std::env::var("CI").is_ok() {
eprintln!("Skipping GPU test in CI");
return;
}
let mut runner: GpuRunner = GpuRunner::init(1, MemoryMetric::GB);
let sample = Sample::from_data(vec!{Tensor::fill(1.0, &[2, 2]), Tensor::fill(1.0, &[2, 2])}, vec!{}, &[]);
runner.append(sample);
//return shape [tens1[0], tens2[1]]
let output_data: Vec<Tensor<f32>> = runner.matmul().await;
}Sourcepub async fn matrix_col_prod(&mut self) -> Vec<Tensor<f32>>
pub async fn matrix_col_prod(&mut self) -> Vec<Tensor<f32>>
Perform a matrix column product operation on tensors using GpuRunner No need to care about output shape while creating sample It is managed by GpuRunner
§Example
use flashlight_tensor::prelude::*;
#[tokio::main]
async fn main(){
if std::env::var("CI").is_ok() {
eprintln!("Skipping GPU test in CI");
return;
}
let mut runner: GpuRunner = GpuRunner::init(1, MemoryMetric::GB);
let sample = Sample::from_data(vec!{Tensor::fill(1.0, &[2, 2])}, vec!{}, &[]);
runner.append(sample);
//return shape [tens[0], 1]
let output_data: Vec<Tensor<f32>> = runner.matrix_col_prod().await;
}Sourcepub async fn matrix_col_sum(&mut self) -> Vec<Tensor<f32>>
pub async fn matrix_col_sum(&mut self) -> Vec<Tensor<f32>>
Perform a matrix column sum operation on tensors using GpuRunner No need to care about output shape while creating sample It is managed by GpuRunner
§Example
use flashlight_tensor::prelude::*;
#[tokio::main]
async fn main(){
if std::env::var("CI").is_ok() {
eprintln!("Skipping GPU test in CI");
return;
}
let mut runner: GpuRunner = GpuRunner::init(1, MemoryMetric::GB);
let sample = Sample::from_data(vec!{Tensor::fill(1.0, &[2, 2])}, vec!{}, &[]);
runner.append(sample);
//return shape [tens[0], 1]
let output_data: Vec<Tensor<f32>> = runner.matrix_col_sum().await;
}Sourcepub async fn matrix_row_prod(&mut self) -> Vec<Tensor<f32>>
pub async fn matrix_row_prod(&mut self) -> Vec<Tensor<f32>>
Perform a matrix row product operation on tensors using GpuRunner No need to care about output shape while creating sample It is managed by GpuRunner
§Example
use flashlight_tensor::prelude::*;
#[tokio::main]
async fn main(){
if std::env::var("CI").is_ok() {
eprintln!("Skipping GPU test in CI");
return;
}
let mut runner: GpuRunner = GpuRunner::init(1, MemoryMetric::GB);
let sample = Sample::from_data(vec!{Tensor::fill(1.0, &[2, 2])}, vec!{}, &[]);
runner.append(sample);
//return shape [1, tens[1]]
let output_data: Vec<Tensor<f32>> = runner.matrix_row_prod().await;
}Sourcepub async fn matrix_row_sum(&mut self) -> Vec<Tensor<f32>>
pub async fn matrix_row_sum(&mut self) -> Vec<Tensor<f32>>
Perform a matrix row sum operation on tensors using GpuRunner No need to care about output shape while creating sample It is managed by GpuRunner
§Example
use flashlight_tensor::prelude::*;
#[tokio::main]
async fn main(){
if std::env::var("CI").is_ok() {
eprintln!("Skipping GPU test in CI");
return;
}
let mut runner: GpuRunner = GpuRunner::init(1, MemoryMetric::GB);
let sample = Sample::from_data(vec!{Tensor::fill(1.0, &[2, 2])}, vec!{}, &[]);
runner.append(sample);
//return shape [1, tens[1]]
let output_data: Vec<Tensor<f32>> = runner.matrix_row_sum().await;
}Source§impl GpuRunner
impl GpuRunner
Sourcepub async fn mul(&mut self) -> Vec<Tensor<f32>>
pub async fn mul(&mut self) -> Vec<Tensor<f32>>
Perform a multiplication operation on tensor using GpuRunner No need to care about output shape while creating sample It is managed by GpuRunner
§Example
use flashlight_tensor::prelude::*;
#[tokio::main]
async fn main(){
if std::env::var("CI").is_ok() {
eprintln!("Skipping GPU test in CI");
return;
}
let mut runner: GpuRunner = GpuRunner::init(1, MemoryMetric::GB);
let sample = Sample::from_data(vec!{Tensor::fill(1.0, &[2, 2])}, vec!{1.0}, &[]);
runner.append(sample);
let output_data: Vec<Tensor<f32>> = runner.mul().await;
}Sourcepub async fn tens_mul(&mut self) -> Vec<Tensor<f32>>
pub async fn tens_mul(&mut self) -> Vec<Tensor<f32>>
Perform a tensor multiplication operation on tensor using GpuRunner No need to care about output shape while creating sample It is managed by GpuRunner
§Example
use flashlight_tensor::prelude::*;
#[tokio::main]
async fn main(){
if std::env::var("CI").is_ok() {
eprintln!("Skipping GPU test in CI");
return;
}
let mut runner: GpuRunner = GpuRunner::init(1, MemoryMetric::GB);
let sample = Sample::from_data(vec!{Tensor::fill(1.0, &[2, 2]), Tensor::fill(1.0, &[2, 2])}, vec!{}, &[]);
runner.append(sample);
let output_data: Vec<Tensor<f32>> = runner.tens_mul().await;
}Source§impl GpuRunner
impl GpuRunner
Sourcepub async fn sub(&mut self) -> Vec<Tensor<f32>>
pub async fn sub(&mut self) -> Vec<Tensor<f32>>
Perform a subtraction operation on tensor using GpuRunner No need to care about output shape while creating sample It is managed by GpuRunner
§Example
use flashlight_tensor::prelude::*;
#[tokio::main]
async fn main(){
if std::env::var("CI").is_ok() {
eprintln!("Skipping GPU test in CI");
return;
}
let mut runner: GpuRunner = GpuRunner::init(1, MemoryMetric::GB);
let sample = Sample::from_data(vec!{Tensor::fill(1.0, &[2, 2])}, vec!{1.0}, &[]);
runner.append(sample);
let output_data: Vec<Tensor<f32>> = runner.sub().await;
}Sourcepub async fn tens_sub(&mut self) -> Vec<Tensor<f32>>
pub async fn tens_sub(&mut self) -> Vec<Tensor<f32>>
Perform a subtraction operation on tensor using GpuRunner No need to care about output shape while creating sample It is managed by GpuRunner
§Example
use flashlight_tensor::prelude::*;
#[tokio::main]
async fn main(){
if std::env::var("CI").is_ok() {
eprintln!("Skipping GPU test in CI");
return;
}
let mut runner: GpuRunner = GpuRunner::init(1, MemoryMetric::GB);
let sample = Sample::from_data(vec!{Tensor::fill(1.0, &[2, 2])}, vec!{1.0}, &[]);
runner.append(sample);
let output_data: Vec<Tensor<f32>> = runner.tens_sub().await;
}Source§impl GpuRunner
impl GpuRunner
Sourcepub async fn tens_broadcast_add(&mut self) -> Vec<Tensor<f32>>
pub async fn tens_broadcast_add(&mut self) -> Vec<Tensor<f32>>
Perform a broadcast addition operation on tensor using GpuRunner No need to care about output shape while creating sample It is managed by GpuRunner
§Example
use flashlight_tensor::prelude::*;
#[tokio::main]
async fn main(){
if std::env::var("CI").is_ok() {
eprintln!("Skipping GPU test in CI");
return;
}
let mut runner: GpuRunner = GpuRunner::init(1, MemoryMetric::GB);
let sample = Sample::from_data(vec!{Tensor::fill(1.0, &[2, 1]), Tensor::fill(1.0, &[1, 2])}, vec!{}, &[]);
runner.append(sample);
//output shape: [2, 2]
let output_data: Vec<Tensor<f32>> = runner.tens_broadcast_add().await;
}Sourcepub async fn tens_broadcast_sub(&mut self) -> Vec<Tensor<f32>>
pub async fn tens_broadcast_sub(&mut self) -> Vec<Tensor<f32>>
Perform a broadcast subtraction operation on tensor using GpuRunner No need to care about output shape while creating sample It is managed by GpuRunner
§Example
use flashlight_tensor::prelude::*;
#[tokio::main]
async fn main(){
if std::env::var("CI").is_ok() {
eprintln!("Skipping GPU test in CI");
return;
}
let mut runner: GpuRunner = GpuRunner::init(1, MemoryMetric::GB);
let sample = Sample::from_data(vec!{Tensor::fill(1.0, &[2, 1]), Tensor::fill(1.0, &[1, 2])}, vec!{}, &[]);
runner.append(sample);
//output shape: [2, 2]
let output_data: Vec<Tensor<f32>> = runner.tens_broadcast_sub().await;
}Sourcepub async fn tens_broadcast_mul(&mut self) -> Vec<Tensor<f32>>
pub async fn tens_broadcast_mul(&mut self) -> Vec<Tensor<f32>>
Perform a broadcast multiplication operation on tensor using GpuRunner No need to care about output shape while creating sample It is managed by GpuRunner
§Example
use flashlight_tensor::prelude::*;
#[tokio::main]
async fn main(){
if std::env::var("CI").is_ok() {
eprintln!("Skipping GPU test in CI");
return;
}
let mut runner: GpuRunner = GpuRunner::init(1, MemoryMetric::GB);
let sample = Sample::from_data(vec!{Tensor::fill(1.0, &[2, 1]), Tensor::fill(1.0, &[1, 2])}, vec!{}, &[]);
runner.append(sample);
//output shape: [2, 2]
let output_data: Vec<Tensor<f32>> = runner.tens_broadcast_mul().await;
}Sourcepub async fn tens_broadcast_div(&mut self) -> Vec<Tensor<f32>>
pub async fn tens_broadcast_div(&mut self) -> Vec<Tensor<f32>>
Perform a broadcast division operation on tensor using GpuRunner No need to care about output shape while creating sample It is managed by GpuRunner
§Example
use flashlight_tensor::prelude::*;
#[tokio::main]
async fn main(){
if std::env::var("CI").is_ok() {
eprintln!("Skipping GPU test in CI");
return;
}
let mut runner: GpuRunner = GpuRunner::init(1, MemoryMetric::GB);
let sample = Sample::from_data(vec!{Tensor::fill(1.0, &[2, 1]), Tensor::fill(1.0, &[1, 2])}, vec!{}, &[]);
runner.append(sample);
//output shape: [2, 2]
let output_data: Vec<Tensor<f32>> = runner.tens_broadcast_div().await;
}Source§impl GpuRunner
impl GpuRunner
Sourcepub fn init(buffer_size: u64, metric: MemoryMetric) -> GpuRunner
pub fn init(buffer_size: u64, metric: MemoryMetric) -> GpuRunner
Initialize GpuRunner with memory size. memory limit is 2GB because of the wgpu limitations
Sourcepub fn with_capacity(
capacity: usize,
buffer_size: u64,
metric: MemoryMetric,
) -> GpuRunner
pub fn with_capacity( capacity: usize, buffer_size: u64, metric: MemoryMetric, ) -> GpuRunner
Initialize GpuRunner with memory size with gpu_data.input_capacity = capacity. memory limit is 2GB because of the wgpu limitations