Skip to content

mfkiwl/custos

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

227 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

custos

Crates.io version Docs

A minimal OpenCL, CUDA and host CPU array manipulation engine / framework. It provides some matrix / buffer operations: matrix multiplication (BLAS, cuBLAS), element-wise arithmetic (vector addition, ...), set all elements to zero (or default value). This library demonstrates how more operations can be implemented for the compute devices: custos-math

Installation

Add "custos" as a dependency:

[dependencies]
custos = {version = "0.1.0", features=["opencl"]}

Available features:

  • "opencl" ... adds OpenCL features, where the CLDevice (feature) is the most important one.
  • "cuda" ... adds CUDA features. (CudaDevice)
  • "safe" ... non-copy matrix and buffer. (safer)

Using the host CPU as the compute device:

cpu_readme.rs

use custos::{CPU, AsDev, Matrix, BaseOps, VecRead};

fn main() {
    let device = CPU::new();
    let a = Matrix::from(( &device, (2, 3), [1, 2, 3, 4, 5, 6]));
    let b = Matrix::from(( &device, (2, 3), [6, 5, 4, 3, 2, 1]));
    
    // specify device for operation
    let c = device.add(&a, &b);
    assert_eq!(device.read(&c), [7, 7, 7, 7, 7, 7]);

    // select() ... sets CPU as 'global device' 
    // -> when device is not specified in an operation, the 'global device' is used
    let device = CPU::new().select();

    let a = Matrix::from(( &device, (2, 3), [1, 2, 3, 4, 5, 6]));
    let b = Matrix::from(( &device, (2, 3), [6, 5, 4, 3, 2, 1]));

    let c = a + b;
    assert_eq!(c.read(), vec![7, 7, 7, 7, 7, 7]);
}

Using an OpenCL device as the compute device:

cl_readme.rs

use custos::{CLDevice, Matrix, AsDev};

fn main() -> custos::Result<()> {
    let device = CLDevice::new(0)?.select();
    let a = Matrix::from((&device, 2, 3, [5, 3, 2, 4, 6, 2]));
    let b = Matrix::from((&device, 1, 6, [1, 4, 0, 2, 1, 3]));

    let c = a + b;
    assert_eq!(c.read(), [6, 7, 2, 6, 7, 5]);

    Ok(())
}

Using a CUDA device as the compute device:

cuda_readme.rs

use custos::{CudaDevice, Matrix, AsDev};

fn main() -> custos::Result<()> {
    let device = CudaDevice::new(0)?.select();
    let a = Matrix::from((&device, 2, 3, [5, 3, 2, 4, 6, 2]));
    let b = Matrix::from((&device, 1, 6, [1, 4, 0, 2, 1, 3]));

    let c = a + b;
    assert_eq!(c.read(), [6, 7, 2, 6, 7, 5]);

    Ok(())
}

About

CUDA, OpenCL and CPU based library for matrix operations

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages

  • Rust 100.0%