Emu is a language for hardware-accelerated numerical computation embedded in Rust. Emu provides the emu! macro for writing code. Emu will then translate your code to OpenCL source code at compile time and store it in the EMU global constant. You can then run your code using a binding to OpenCL such as ocl or rust-opencl
emu! {
// adds a scalar to elements of a buffer
add(global_buffer [f32], scalar f32) {
global_buffer[get_global_id(0)] += scalar;
}
// multiplies elements of a buffer by a scalar
multiply(global_buffer [f32], scalar f32) {
global_buffer[get_global_id(0)] *= scalar;
}
// multiply 2 matrices
// n is the dimension of the matrices
// a and b are the matrices to be multiplied, c is the result
multiply_matrices(n i32, global_a [f32], global_b [f32], global_c [f32]) {
// indices of cells to multiply
let i: i32 = get_global_id(0);
let j: i32 = get_global_id(1);
// execute step of multiplication
for k in 0..n {
global_c[i * n + j] += global_a[i * n + k] * global_b[k * n + j];
}
}
}
To start writing Emu kernels embedded in your Rust code, simply add the following to your Cargo.toml file.
[dependencies] emu-lang = "0.1.0"