2个版本

0.1.4 2023年6月2日
0.1.3 2021年9月22日

图形API中排名第83

Download history 438/week @ 2024-04-22 322/week @ 2024-04-29 549/week @ 2024-05-06 467/week @ 2024-05-13 406/week @ 2024-05-20 407/week @ 2024-05-27 345/week @ 2024-06-03 449/week @ 2024-06-10 252/week @ 2024-06-17 389/week @ 2024-06-24 251/week @ 2024-07-01 317/week @ 2024-07-08 290/week @ 2024-07-15 260/week @ 2024-07-22 458/week @ 2024-07-29 489/week @ 2024-08-05

每月下载量1,511
用于25个crate(通过rust-gpu-tools

Volker MischeFriedel Ziegelmayer的财产。

fil-rustacuda的分支(filecoin-project
主页 (github.io)

2个版本

crates.io Documentation

2023年6月2日

2021年9月22日

图形API中排名第83

每月下载量1,511

用于rust-gpu-tools25个crate中

维护

  • 许可
  • 需求
  • 相关项目
  • 主要设计目标是

高层:使用RustaCUDA对Rust程序员来说应该感觉熟悉且直观。

易于使用:RustaCUDA应该有良好的文档和设计,以帮助新手GPU程序员入门,同时不会过多限制经验丰富的用户。

Apache-2.0许可

当前RustaCUDA支持CUDA API的最小可行子集(基本上,是管理内存和启动基本内核所必需的最小部分)。以下功能不包括

  • 除了内核启动之外的所有异步操作
  • 访问CUDA 1/2/3D数组和纹理内存
  • 多GPU支持
  • 运行时链接
  • CUDA 图
  • 等等!

这些额外的功能将在时间允许和必要时进行开发。如果您需要尚未支持的功能,请考虑提交一个拉取请求!

要求

在开始使用RustaCUDA之前,您必须为您的系统安装CUDA开发库。需要版本8.0或更高版本。您还必须安装具有适当驱动程序的CUDA兼容GPU。

首先,将环境变量CUDA_LIBRARY_PATH设置为CUDA头文件的路径

export CUDA_LIBRARY_PATH="C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.1\lib\x64"

一些Ubuntu用户在使用CUDA_LIBRARY_PATH时遇到了链接错误。如果您看到这样的错误

  = note: /usr/bin/ld: cannot find -lcudart                                                              
          /usr/bin/ld: cannot find -lcublas                                                              
          collect2: error: ld returned 1 exit status 

使用LIBRARY_PATH而不是CUDA_LIBRARY_PATH似乎有所帮助。

现在,开始构建一个基本的CUDA crate。将以下内容添加到您的Cargo.toml

[dependencies]
rustacuda = "0.1"
rustacuda_core = "0.1"
rustacuda_derive = "0.1"

并将其添加到您的crate根目录

#[macro_use]
extern crate rustacuda;

#[macro_use]
extern crate rustacuda_derive;
extern crate rustacuda_core;

接下来,从RustaCUDA仓库下载resources/add.ptx文件,并将其放置在应用程序的资源目录中。

examples/目录包含帮助您入门的示例代码。要执行最简单的示例(在GPU上添加两个数字),将此代码放入您的main.rs文件。

#[macro_use]
extern crate rustacuda;

use rustacuda::prelude::*;
use rustacuda::memory::DeviceBox;
use std::error::Error;
use std::ffi::CString;

fn main() -> Result<(), Box<dyn Error>> {
    // Initialize the CUDA API
    rustacuda::init(CudaFlags::empty())?;
    
    // Get the first device
    let device = Device::get_device(0)?;

    // Create a context associated to this device
    let context = Context::create_and_push(
        ContextFlags::MAP_HOST | ContextFlags::SCHED_AUTO, device)?;

    // Load the module containing the function we want to call
    let module_data = CString::new(include_str!("../resources/add.ptx"))?;
    let module = Module::load_from_string(&module_data)?;

    // Create a stream to submit work to
    let stream = Stream::new(StreamFlags::NON_BLOCKING, None)?;

    // Allocate space on the device and copy numbers to it.
    let mut x = DeviceBox::new(&10.0f32)?;
    let mut y = DeviceBox::new(&20.0f32)?;
    let mut result = DeviceBox::new(&0.0f32)?;

    // Launching kernels is unsafe since Rust can't enforce safety - think of kernel launches
    // as a foreign-function call. In this case, it is - this kernel is written in CUDA C.
    unsafe {
        // Launch the `sum` function with one block containing one thread on the given stream.
        launch!(module.sum<<<1, 1, 0, stream>>>(
            x.as_device_ptr(),
            y.as_device_ptr(),
            result.as_device_ptr(),
            1 // Length
        ))?;
    }

    // The kernel launch is asynchronous, so we wait for the kernel to finish executing
    stream.synchronize()?;

    // Copy the result back to the host
    let mut result_host = 0.0f32;
    result.copy_to(&mut result_host)?;
    
    println!("Sum is {}", result_host);

    Ok(())
}

如果一切正常,您应该能够运行cargo run并看到输出

Sum is 30.0

相关项目

感谢您的关注!欢迎贡献。

有关问题、功能请求、疑问和错误报告,应通过上面的问题跟踪器进行报告。特别是,因为RustaCUDA旨在提供良好的文档,请报告您在文档中发现的任何令人困惑或不正确的内容。

以拉取请求的形式提供的代码或文档改进也受欢迎。请在进行大量工作之前提交或评论一个问题,以便进行讨论。

有关更多详细信息,请参阅CONTRIBUTING.md文件

目标

RustaCUDA目前由Brook Heisler (@bheisler) 维护。

路线图

RustaCUDA采用Apache 2.0许可证和MIT许可证双重许可。

快速入门

RustaCUDA需要安装至少CUDA版本8。

  • accel是一个完整的CUDA计算框架。感谢accel创建和维护cuda-sys FFI包装库。
  • rust-ptx-builder是一个build.rs辅助库,它使将Rust crate编译成CUDA内核变得容易。

依赖项

~2MB
~45K SLoC