Crate accel

Source
Expand description

GPGPU framework for Rust based on CUDA Driver API

§Setup

Currently (0.3.0), accel works only on Linux system. Windows support will come in future release (0.3.x or 0.4~).

  1. Install CUDA on your system

  2. Setup Rust environement using rustup (Requires 1.42 or later)

  3. Add nvptx64-nvidia-cuda target and install ptx-linker, or run

    curl -sSL https://gitlab.com/termoshtt/accel/raw/master/setup_nvptx_toolchain.sh | bash

§Examples

accel works with stable Rust

[dependencies]
accel = "=0.3.0-alpha.2"

Do NOT add accel-core to [dependencies]. It will be linked automatically into the device code.

§Vector Add

use accel::*;

#[kernel]
unsafe fn add(a: *const f32, b: *const f32, c: *mut f32, n: usize) {
    let i = accel_core::index();
    if (i as usize) < n {
        *c.offset(i) = *a.offset(i) + *b.offset(i);
    }
}

fn main() -> error::Result<()> {
    let device = Device::nth(0)?;
    let ctx = device.create_context();

    // Allocate memories on GPU
    let n = 32;
    let mut a = DeviceMemory::<f32>::zeros(ctx.clone(), n);
    let mut b = DeviceMemory::<f32>::zeros(ctx.clone(), n);
    let mut c = DeviceMemory::<f32>::zeros(ctx.clone(), n);

    // Accessible from CPU as usual Rust slice (though this will be slow)
    for i in 0..n {
        a[i] = i as f32;
        b[i] = 2.0 * i as f32;
    }
    println!("a = {:?}", a.as_slice());
    println!("b = {:?}", b.as_slice());

    // Launch kernel synchronously
    add(ctx,
        1 /* grid */,
        n /* block */,
        &(&a.as_ptr(), &b.as_ptr(), &c.as_mut_ptr(), &n)
    ).expect("Kernel call failed");

    println!("c = {:?}", c.as_slice());
    Ok(())
}

§Assertion on GPU

use accel::*;

#[kernel]
fn assert() {
    accel_core::assert_eq!(1 + 2, 4);  // will fail
}

fn main() -> error::Result<()> {
    let device = Device::nth(0)?;
    let ctx = device.create_context();
    let result = assert(ctx, 1 /* grid */, 4 /* block */, &());
    assert!(result.is_err()); // assertion failed
    Ok(())
}
use accel::*;

#[kernel]
pub fn print() {
    let i = accel_core::index();
    accel_core::println!("Hello from {}", i);
}

fn main() -> error::Result<()> {
    let device = Device::nth(0)?;
    let ctx = device.create_context();
    print(ctx, 1, 4, &())?;
    Ok(())
}

Re-exports§

pub use device::*;
pub use linker::*;
pub use memory::*;
pub use module::*;
pub use profiler::*;
pub use stream::*;

Modules§

device
CUDA Device and Context
error
linker
CUDA JIT compiler and Linkers
memory
Memory management
module
CUDA Module (i.e. loaded PTX or cubin)
profiler
Profiling GPU kernels and host CUDA API calls
stream

Macros§

contexted_call
contexted_new
ffi_call
ffi_new

Attribute Macros§

kernel