8 个版本
使用旧的 Rust 2015
0.2.7 | 2018 年 5 月 23 日 |
---|---|
0.2.6 | 2018 年 5 月 11 日 |
0.2.3 | 2018 年 4 月 30 日 |
0.1.11 |
|
0.0.2 |
|
#418 in 机器学习
175KB
3.5K SLoC
cumath
Cumath 是 Rust 的安全 CUDA 封装库:目标是创建一个零成本的封装,使您能够轻松使用 CUDA、cuBLAS 和 curand。
/!\ 这个库仍在开发中!
/!\ Cumath 在 /usr/bin/local/cuda/lib64 (Linux 上默认的 CUDA 路径) 中查找 CUDA 库。如果它对您不起作用,您可以 显式指定 CUDA 路径
实现
- GPU 内存管理
- 向量
- 矩阵
- CuBLAS
- CuRAND
- CUDA 流
- 数据类型泛型
待实现
- cumath_nn:基于 cumath 的 Cudnn 封装
- 用户自定义 CUDA 内核
- 更多内置函数
- 改进自动 CUDA 兼容 C 编译器检测
不会实现
- 后端选择与 CPU(这更像是高级库)
入门
将 Cumath 添加到您的 Cargo.toml 中
[dependencies]
cumath = "0.2.6"
然后在 main.rs 中
extern crate cumath;
示例
简单的向量加法
extern crate cumath;
use cumath::*;
fn assert_equals_float(a: f32, b: f32) {
let d = a-b;
if d < -0.000001 || d > 0.000001 {
panic!("{} != {}", a, b);
}
}
fn main() {
let value0 = -0.23254;
let value1 = 1.185254;
// Create a vector containing [value0, value0, value0, value0, value0]
let mut vector0 = CuVector::<f32>::new(value0, 5);
// Create a vector containing [value1]
let vector1 = CuVector::<f32>::new(value1, 1);
{
// Borrow a slice of vector0 with offset 2 and length 1
let mut slice = vector0.slice_mut(2, 1);
// Add vector1 to the slice
slice.add(&vector1, &DEFAULT_STREAM);
}
// Copy the data to host memory
let mut output = vec![0.0; 5];
vector0.clone_to_host(&mut output);
assert_equals_float(output[0], value0);
assert_equals_float(output[1], value0);
assert_equals_float(output[2], value0+value1);
assert_equals_float(output[3], value0);
assert_equals_float(output[4], value0);
}
使用 CuBLAS 进行矩阵乘法
extern crate cumath;
use cumath::*;
fn assert_equals_float(a: f32, b: f32) {
let d = a-b;
if d < -0.000001 || d > 0.000001 {
panic!("{} != {}", a, b);
}
}
fn main() {
// Create an instance of CuBLAS
let cublas = Cublas::new().unwrap();
// Create a 2*2 Matrix containing [1.0, 2.0, -2.0, 4.0] (matrices are row-ordered)
let matrix1 = CuMatrix::<f32>::from_host_data(2, 2, &[1.0, 2.0, -2.0, 4.0]);
// Create a 2*2 Matrix containing [2.0, -1.0, 0.0, 1.0]
let matrix2 = CuMatrix::<f32>::from_host_data(2, 2, &[2.0, -1.0, 0.0, 1.0]);
// Create a Zero 2*2 Matrix
let mut output = CuMatrix::<f32>::zero(2, 2);
// Matrix-Matrix multiplication
cublas.mult_m_m(&matrix1, &matrix2, &mut output);
// Copy the data to host memory
let mut cpu_output = vec![0.0; 4];
output.clone_to_host(&mut cpu_output);
assert_equals_float(cpu_output[0], 4.0);
assert_equals_float(cpu_output[1], 0.0);
assert_equals_float(cpu_output[2], -2.0);
assert_equals_float(cpu_output[3], 4.0);
}
有关更多信息,请运行 'cargo doc --open'
无运行时依赖项
~185KB