3个不稳定版本

0.2.0 2021年11月21日
0.1.1 2020年6月11日
0.1.0 2017年6月12日

机器学习 中排名 833

每月下载量 45
4 个crate中使用

MIT/Apache

315KB
7K SLoC

coaster • Join the chat at https://gitter.im/spearow/juice Build Status Crates.io dependency status License

coaster是一个可扩展的、可插入的、后端无关的框架,用于在CUDA、OpenCL和常见的宿主CPU上执行并行、高性能计算。它速度快,易于构建,并提供一个可扩展的Rust结构,可以在几乎任何机器上执行操作,即使没有CUDA或OpenCL设备。

coaster抽象了不同的计算语言(本地、OpenCL、Cuda),并允许您在服务器、桌面或移动设备上运行高性能代码,而无需为部署的机器适应代码。coaster不需要机器上的OpenCL或Cuda,并自动回退到本地宿主CPU,使您的应用程序高度灵活且易于构建。

coaster为Juice提供动力。

  • __并行化性能__
    coaster使您能够轻松地在机器上并行化计算,充分利用CPU/GPU的所有可用核心。coaster通过插件提供优化操作,您可以直接使用它们来加速应用程序。

  • __易于扩展__
    使用coaster编写用于GPU执行的定制操作变得容易,因为它已经处理了框架的特定性、内存管理、安全性和其他开销。coaster提供插件(见以下示例),您可以使用它们来扩展coaster后端,以包含您自己的、业务特定的操作。

  • __平滑构建__
    由于Coaster不需要安装各种框架和库,因此它不会显著增加您应用程序的构建时间。Coaster在运行时检查这些框架是否可用,如果不可用,则优雅地回退到标准的本地CPU。您或您的用户无需经历漫长而痛苦的构建过程。

更多信息,

免责声明:Coaster目前处于非常早期且高度发展的阶段。如果您遇到任何非因尚未实现的功能导致的错误,请自由创建一个问题。

入门指南

如果您正在使用Cargo,只需将Coaster添加到您的Cargo.toml

[dependencies]
coaster = "0.2"

如果您正在使用Cargo Edit,您可以调用

$ cargo add coaster

插件

您可以通过插件轻松扩展Coaster的Backend,以实现更多与后端无关的操作。插件提供一系列相关的操作 - BLAS是一个很好的例子。要扩展Coaster的Backend以包含来自插件的操作,只需将所需的插件crate添加到您的Cargo.toml文件中。以下是可以立即用于您自己的应用程序或作为创建您自己的插件的起点的一组可用的Coaster插件。

  • BLAS - Coaster插件,用于后端无关的基本线性代数子程序操作。
  • NN - Coaster插件,用于神经网络相关算法。

您可以通过插件轻松编写自己的与后端无关的并行操作,并将其提供给其他人 - 我们很高兴在这里展示您的插件,只需发送给我们一个PR。

示例

Coaster不包含任何操作。以下示例假定您已将coaster和Coaster插件coaster-nn添加到您的Cargo清单中。

use coaster as co;
use coaster_nn as nn;

use co::prelude::*;
use nn::*;

fn write_to_memory<T: Copy>(mem: &mut FlatBox, data: &[T]) {
	let mut mem_buffer = mem.as_mut_slice::<T>();
	for (index, datum) in data.iter().enumerate() {
	    mem_buffer[index] = *datum;
	}
}

fn main() {
    // Initialize a CUDA Backend.
    let backend = Backend::<Cuda>::default().unwrap();
    // Initialize two SharedTensors.
    let mut x = SharedTensor::<f32>::new(&(1, 1, 3));
    let mut result = SharedTensor::<f32>::new(&(1, 1, 3));
    // Fill `x` with some data.
    let payload: &[f32] = &::std::iter::repeat(1f32).take(x.capacity()).collect::<Vec<f32>>();
    let native = Backend::<Native>::default().unwrap();
    write_to_memory(x.write_only(native.device()).unwrap(), payload); // Write to native host memory.
    // Run the sigmoid operation, provided by the NN Plugin, on your CUDA enabled GPU.
    backend.sigmoid(&mut x, &mut result).unwrap();
    // See the result.
    println!("{:?}", result.read(native.device()).unwrap().as_slice::<f32>());
}

贡献

想要贡献?太棒了!我们有一些指导您开始贡献代码或文档的说明。我们还有一些我们可能需要您帮助的高优先级问题。

我们有一个主要基于实时协作的文化,这里在GitHub和Gitter频道上进行。您也可以联系维护者{@drahnr}。

除非您明确表示,否则您有意提交以包含在您的工作中的任何贡献,根据Apache-2.0许可证的定义,应如下双授权,而不附加任何其他条款或条件。

变更日志

您可以在根文件CHANGELOG.md中找到发布历史。

变更日志是一个记录项目所有变更的日志或记录,如网站或软件项目,通常包括错误修复、新功能等记录 - 维基百科

我们正在使用Clog,Rust工具,用于自动生成变更日志文件。

许可证

以下任一许可证下授权:

任选其一。

依赖关系

~0.8–1.8MB
~39K SLoC