Base On WGPU
This library uses WGPU to perform array operations
📦️ Installation
[dependencies]
arrOgpu = {git="https://github.com/araxnoid-code/arrOgpu.git"}
Code
use arr_o_gpu::ArrOgpuModule;
fn main() {
let model = ArrOgpuModule::default();
}
🚧 Announcement
- arrOgpu only supports numbers of type f32.
- In this version, arrOgpu is still in the development stage, therefore the maximum storage allowed is 400000 bytes or 100000 numbers of type f32.
- in this version there are still a few features and the possibility of bugs will occur, in the future it will continue to be developed.
Method
Create An Array
use arr_o_gpu::ArrOgpuModule;
fn main() {
let model = ArrOgpuModule::default();
let array = model
.array_from_vector(&[1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0], &[2, 5])
.unwrap();
println!("{}", array)
// output
// [
// [1.0, 2.0, 3.0, 4.0, 5.0]
// [6.0, 7.0, 8.0, 9.0, 10.0]
// ]
}
Indexing
use arr_o_gpu::ArrOgpuModule;
fn main() {
let model = ArrOgpuModule::default();
let array = model
.array_from_vector(&[1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0], &[2, 5])
.unwrap();
println!("{}", array);
// [
// [1.0, 2.0, 3.0, 4.0, 5.0]
// [6.0, 7.0, 8.0, 9.0, 10.0]
// ]
let indexing_a = array.index(&[0]).unwrap();
println!("{}", indexing_a);
// [1.0, 2.0, 3.0, 4.0, 5.0]
let indexing_b = array.index(&[1, 4]).unwrap();
println!("{}", indexing_b);
// [10.0]
}
element-wise operations(Add, Sub, Mul, Div)
use arr_o_gpu::ArrOgpuModule;
fn main() {
let model = ArrOgpuModule::default();
let array_a = model
.array_from_vector(&[1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0], &[2, 5])
.unwrap();
let array_b = model
.array_from_vector(&[10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0], &[2, 5])
.unwrap();
let add = model.add(&array_a, &array_b).unwrap();
println!("{}", add);
// [
// [11.0, 13.0, 15.0, 17.0, 19.0]
// [21.0, 23.0, 25.0, 27.0, 29.0]
// ]
let sub = model.sub(&array_a, &array_b).unwrap();
println!("{}", sub);
// [
// [-9.0, -9.0, -9.0, -9.0, -9.0]
// [-9.0, -9.0, -9.0, -9.0, -9.0]
// ]
let mul = model.mul(&array_a, &array_b).unwrap();
println!("{}", mul);
// [
// [10.0, 22.0, 36.0, 52.0, 70.0]
// [90.0, 112.0, 136.0, 162.0, 190.0]
// ]
let div = model.div(&array_a, &array_b).unwrap();
println!("{}", div);
// [
// [0.1, 0.18181819, 0.25, 0.3076923, 0.35714284]
// [0.39999998, 0.4375, 0.47058824, 0.5, 0.5263158]
// ]
}
Matmul 2D
use arr_o_gpu::ArrOgpuModule;
fn main() {
let model = ArrOgpuModule::default();
let array_a = model
.array_from_vector(&[1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0], &[2, 5])
.unwrap();
let array_b = model
.array_from_vector(&[10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0], &[5, 2])
.unwrap();
let result = model.matmul_2d(&array_a, &array_b).unwrap();
println!("{}", result);
// [
// [230.0, 245.0]
// [580.0, 620.0]
// ]
}
Matmul ND
use arr_o_gpu::ArrOgpuModule;
fn main() {
let module = ArrOgpuModule::default();
let arr_a = module
.array_from_vector(&[1.0, 2.0, 3.0, 4.0, 1.0, 2.0, 3.0, 4.0], &[2, 2, 2])
.unwrap();
println!("{}", arr_a);
// [
// [
// [1.0, 2.0]
// [3.0, 4.0]
// ]
// [
// [1.0, 2.0]
// [3.0, 4.0]
// ]
// ]
let arr_b = module
.array_from_vector(&[7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0], &[2, 2, 2])
.unwrap();
println!("{}", arr_b);
// [
// [
// [7.0, 8.0]
// [9.0, 10.0]
// ]
// [
// [11.0, 12.0]
// [13.0, 14.0]
// ]
// ]
let matmul = module.matmul_nd(&arr_a, &arr_b).unwrap();
println!("{}", matmul);
// [
// [
// [25.0, 28.0]
// [57.0, 64.0]
// ]
// [
// [37.0, 40.0]
// [85.0, 92.0]
// ]
// ]
}
Broadcasting
use arr_o_gpu::ArrOgpuModule;
fn main() {
let module = ArrOgpuModule::default();
let arr_a = module.array_from_vector(&[1.0, 2.0, 3.0, 4.0], &[2, 1, 2]).unwrap();
println!("{}", arr_a);
// [
// [
// [1.0, 2.0]
// ]
// [
// [3.0, 4.0]
// ]
// ]
let broadcasting = module.broadcasting(&arr_a, &[2, 3, 2]).unwrap();
println!("{}", broadcasting);
// [
// [
// [1.0, 2.0]
// [1.0, 2.0]
// [1.0, 2.0]
// ]
// [
// [3.0, 4.0]
// [3.0, 4.0]
// [3.0, 4.0]
// ]
// ]
}
Slicing
use arr_o_gpu::{ ArrOgpuModule, r };
fn main() {
let module = ArrOgpuModule::default();
let arr_a = module
.array_from_vector(
&[
0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0,
16.0, 17.0,
],
&[2, 3, 3]
)
.unwrap();
println!("{}", arr_a);
// [
// [
// [0.0, 1.0, 2.0]
// [3.0, 4.0, 5.0]
// [6.0, 7.0, 8.0]
// ]
// [
// [9.0, 10.0, 11.0]
// [12.0, 13.0, 14.0]
// [15.0, 16.0, 17.0]
// ]
// ]
let slicing_a = module.slicing(&arr_a, &[r(1..2)]).unwrap();
println!("{}", slicing_a);
// [
// [
// [9.0, 10.0, 11.0]
// [12.0, 13.0, 14.0]
// [15.0, 16.0, 17.0]
// ]
// ]
let slicing_b = module.slicing(&arr_a, &[r(..), r(1..), r(..2)]).unwrap();
println!("{}", slicing_b);
// [
// [
// [3.0, 4.0]
// [6.0, 7.0]
// ]
// [
// [12.0, 13.0]
// [15.0, 16.0]
// ]
// ]
}