当前位置: 首页 > 软件库 > 开发工具 > >

gpgpu-rs

基于 wgpu 的 GPU 计算库
授权协议 EUPL
开发语言 Rust
所属分类 开发工具
软件类型 开源软件
地区 不详
投 递 者 乐正育
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

gpgpu-rs 是基于 wgpu,采用 Rust 实现的简易 GPU 计算库。

如需开始使用gpgpu,先创建[Framework]实例然后按照下面的示例进行操作。

向量 A B 相乘并将结果存入 C 的例子:

 use gpgpu::*;

 fn main() -> GpuResult<()> {
    let fw = Framework::default();
    
    // Original CPU data
    let cpu_data = (0..10000).into_iter().collect::<Vec<u32>>();

    // GPU buffer creation
    let buf_a = GpuBuffer::from_slice(&fw, &cpu_data);       // Input
    let buf_b = GpuBuffer::from_slice(&fw, &cpu_data);       // Input
    let buf_c = GpuBuffer::<u32>::new(&fw, cpu_data.len());  // Output

    // Shader load from SPIR-V binary file
    let shader_module = utils::shader::from_spirv_file(&fw, "<SPIR-V shader path>")?;
    //  or from a WGSL source file
    let shader_module = utils::shader::from_wgsl_file(&fw, "<WGSL shader path>")?;    

    // Descriptor set creation
    let desc_set = DescriptorSet::default()
        .bind_buffer(&buf_a, GpuBufferUsage::ReadOnly)
        .bind_buffer(&buf_b, GpuBufferUsage::ReadOnly)
        .bind_buffer(&buf_c, GpuBufferUsage::ReadWrite);
    
    // Kernel creation and enqueuing
    fw.create_kernel_builder(&shader_module, "main")   // Entry point
        .add_descriptor_set(desc_set)                      
        .build()
        .enqueue(cpu_data.len() as u32, 1, 1);         // Enqueuing, not very optimus ��

    let output = buf_c.read()?;                        // Read back C from GPU
    for (a, b) in cpu_data.into_iter().zip(output) {
        assert_eq!(a.pow(2), b);
    }

    Ok(())
}

使用 WGSL 编写的着色器程序

// Vector type definition. Used for both input and output
[[block]]
struct Vector {
    data: [[stride(4)]] array<u32>;
};

// A, B and C vectors
[[group(0), binding(0)]] var<storage, read>  a: Vector;
[[group(0), binding(1)]] var<storage, read>  b: Vector;
[[group(0), binding(2)]] var<storage, read_write> c: Vector;

[[stage(compute), workgroup_size(1)]]
fn main([[builtin(global_invocation_id)]] global_id: vec3<u32>) {
    c.data[global_id.x] = a.data[global_id.x] * b.data[global_id.x];
}
 相关资料
  • 到目前为止,我们一直在使用CPU计算。对复杂的神经网络和大规模的数据来说,使用CPU来计算可能不够高效。在本节中,我们将介绍如何使用单块NVIDIA GPU来计算。首先,需要确保已经安装好了至少一块NVIDIA GPU。然后,下载CUDA并按照提示设置好相应的路径(可参考附录中“使用AWS运行代码”一节)。这些准备工作都完成后,下面就可以通过nvidia-smi命令来查看显卡信息了。 !nvidi

  • 我在Tensorflow中的LSTM-RNN上训练一些音乐数据,遇到了GPU内存分配的一些问题,我不明白:我遇到了OOM,而实际上似乎还有足够的VRAM可用。一些背景:我正在使用GTX1060 6GB、英特尔至强E3-1231V3和8GB内存开发Ubuntu Gnome 16.04。现在,首先是我能理解的错误消息的一部分,在中,我将在最后再次添加整个错误消息,以供任何可能要求帮助的人使用: I t

  • 本节中我们将展示如何使用多块GPU计算,例如,使用多块GPU训练同一个模型。正如所期望的那样,运行本节中的程序需要至少2块GPU。事实上,一台机器上安装多块GPU很常见,这是因为主板上通常会有多个PCIe插槽。如果正确安装了NVIDIA驱动,我们可以通过nvidia-smi命令来查看当前计算机上的全部GPU。 !nvidia-smi “自动并行计算”一节介绍过,大部分运算可以使用所有的CPU的全部

  • 我正在尝试使用我的RTX 2060 Super与Keras进行预测。出于某种原因,它似乎在我的CPU上运行。 这是我用来调试的测试脚本: 以下是打印到控制台的结果: 下面是一个屏幕截图,显示了我在Task Manager中的CPU和GPU利用率: 任何帮助都将不胜感激!

  • 一位电气工程师最近告诫我不要将GPU用于科学计算(例如,在精度非常重要的情况下),因为它没有像CPU那样的硬件保障。这是真的吗?如果是的话,这个问题在典型的硬件中有多普遍/多严重?

  • 在Gluon中,我们可以很方便地使用数据并行进行多GPU计算。例如,我们并不需要自己实现“多GPU计算”一节里介绍的多GPU之间同步数据的辅助函数。 首先导入本节实验所需的包或模块。运行本节中的程序需要至少2块GPU。 import d2lzh as d2l import mxnet as mx from mxnet import autograd, gluon, init, nd from