#opencl #cuda #computation #back-end #hpc

collenchyma

在任意硬件上进行高性能计算

8 个版本

使用旧的 Rust 2015

0.0.8 2016 年 2 月 21 日
0.0.7 2015 年 12 月 21 日
0.0.3 2015 年 11 月 30 日

#413机器学习

Download history 26/week @ 2024-03-11 16/week @ 2024-03-18 17/week @ 2024-03-25 50/week @ 2024-04-01 13/week @ 2024-04-08 18/week @ 2024-04-15 23/week @ 2024-04-22 13/week @ 2024-04-29 17/week @ 2024-05-06 14/week @ 2024-05-13 14/week @ 2024-05-20 10/week @ 2024-05-27 14/week @ 2024-06-03 10/week @ 2024-06-10 10/week @ 2024-06-17 19/week @ 2024-06-24

54 每月下载量
6 crates 中使用

MIT/Apache

285KB
5.5K SLoC

Collenchyma • 加入聊天 https://gitter.im/autumnai/collenchyma 构建状态 覆盖率状态 许可

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

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

Collenchyma 是在 Autumn 开始的,旨在支持机器智能框架 Leaf,以实现后端无关、最先进的性能。

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

  • __易于扩展__
    使用 Collenchyma 为 GPU 执行编写自定义操作变得非常简单,因为它已经处理了框架的特定之处、内存管理、安全性以及其他开销。Collenchyma 提供了插件(见下文示例),您可以使用它们来扩展 Collenchyma 后端,添加您自己业务特定的操作。

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

更多信息,

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

入门指南

如果您使用 Cargo,只需将 Collenchyma 添加到您的 Cargo.toml 文件中

[dependencies]
collenchyma = "0.0.8"

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

$ cargo add collenchyma

插件

您可以通过插件轻松扩展 Collenchyma 的 Backend 以支持更多与后端无关的操作。插件提供了一组相关操作 - BLAS 是一个好例子。要将插件中的操作扩展到 Collenchyma 的 Backend,只需将所需的插件包添加到您的 Cargo.toml 文件中。以下是可用的 Collenchyma 插件列表,您可以直接用于自己的应用程序,或者作为您创建自己的插件的起点。

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

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

示例

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

extern crate collenchyma as co;
extern crate collenchyma_nn as nn;
use co::prelude::*;
use nn::*;

fn write_to_memory<T: Copy>(mem: &mut MemoryType, data: &[T]) {
    if let &mut MemoryType::Native(ref mut mem) = mem {
        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(backend.device(), &(1, 1, 3)).unwrap();
    let mut result = SharedTensor::<f32>::new(backend.device(), &(1, 1, 3)).unwrap();
    // Fill `x` with some data.
    let payload: &[f32] = &::std::iter::repeat(1f32).take(x.capacity()).collect::<Vec<f32>>();
    let native = Backend::<Native>::default().unwrap();
    x.add_device(native.device()).unwrap(); // Add native host memory
    x.sync(native.device()).unwrap(); // Sync to native host memory
    write_to_memory(x.get_mut(native.device()).unwrap(), payload); // Write to native host memory.
    x.sync(backend.device()).unwrap(); // Sync the data to the CUDA device.
    // Run the sigmoid operation, provided by the NN Plugin, on your CUDA enabled GPU.
    backend.sigmoid(&mut x, &mut result).unwrap();
    // See the result.
    result.add_device(native.device()).unwrap(); // Add native host memory
    result.sync(native.device()).unwrap(); // Sync the result to host memory.
    println!("{:?}", result.get(native.device()).unwrap().as_native().unwrap().as_slice::<f32>());
}

贡献

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

我们有一个主要是实时协作的文化,在这里的 GitHub 上以及Collenchyma Gitter 频道上发生。您也可以联系维护者 {@MJ@hobofan}。

除非您明确声明,否则您提交给工作内容的任何贡献,如 Apache-2.0 许可证中定义的,将按照以下方式双重许可,不附加任何额外的条款或条件。

变更日志

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

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

我们使用Clog,Rust 自动生成 CHANGELOG 文件的工具。

许可证

许可协议为以下之一

任选其一。

依赖项

~550–780KB
~18K SLoC