1 个不稳定版本
0.1.0 | 2023年11月20日 |
---|
#687 在 编程语言 中
115KB
3.5K SLoC
ptoxide
ptoxide
是一个crate,允许在任何机器上执行NVIDIA CUDA PTX代码。它是作为一个了解CUDA执行模型的项目而创建的。
通过将其编译成自定义的字节码格式,然后在虚拟机内部执行,来执行内核。
要了解库的实际工作方式,请查看下面的示例,并查看tests 目录中的集成测试。
尝试运行 cargo run --example times_two
以查看其效果!
支持的功能
ptoxide
支持大多数基本的PTX功能,例如
- 全局、共享和局部(栈)内存
- (递归)函数调用
- 使用屏障进行线程同步
- 对整数和浮点值进行各种算术运算
- 一维、二维和三维线程网格和块
这些功能足以执行kernels目录中找到的内核,例如简单的向量运算、矩阵乘法和使用共享缓冲区的矩阵转置。
然而,许多功能和指令仍然缺失,您在尝试执行更复杂的程序时可能会遇到todo!
和解析错误。欢迎提交PR以实现缺失的功能!
内部结构
该库的代码本身尚未得到很好的文档记录。然而,以下是构成ptoxide
的主要模块的概述
示例
以下代码示例展示了如何通过一个内核将浮点向量按2倍缩放。请查看完整示例,它位于示例目录中,或者通过运行以下命令来运行它:cargo run --example times_two
。
use ptoxide::{Context, Argument, LaunchParams};
fn times_two(kernel: &str) {
let a: Vec<f32> = vec![1., 2., 3., 4., 5.];
let mut b: Vec<f32> = vec![0.; a.len()];
let n = a.len();
let mut ctx = Context::new_with_module(kernel).expect("compile kernel");
const BLOCK_SIZE: u32 = 256;
let grid_size = (n as u32 + BLOCK_SIZE - 1) / BLOCK_SIZE;
let da = ctx.alloc(n);
let db = ctx.alloc(n);
ctx.write(da, &a);
ctx.run(
LaunchParams::func_id(0)
.grid1d(grid_size)
.block1d(BLOCK_SIZE),
&[
Argument::ptr(da),
Argument::ptr(db),
Argument::U64(n as u64),
],
).expect("execute kernel");
ctx.read(db, &mut b);
// prints [2.0, 4.0, 6.0, 8.0, 10.0]
println!("{:?}", b);
}
读取PTX
要了解更多关于PTX指令集架构(ISA)的信息,请查看NVIDIA的文档。
许可证
ptoxide
根据您的要求,在Apache License 2.0和MIT许可证下双许可。
依赖项
约2.5MB
约21K SLoC