2个版本
0.1.4 | 2023年6月2日 |
---|---|
0.1.3 | 2021年9月22日 |
在图形API中排名第83
每月下载量1,511
用于25个crate(通过rust-gpu-tools)
是fil-rustacuda的分支(filecoin-project)
主页 (github.io)
2个版本
2023年6月2日
2021年9月22日
在图形API中排名第83
每月下载量1,511
- 每月下载量1,511
- 用于rust-gpu-tools的25个crate中
- Apache-2.0许可
- 要求
- 相关项目
- 目标
- 路线图
- 快速入门
- 贡献
用于rust-gpu-tools的25个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