#cuda #virtual-machine #ptx #kernel #execute #learn #model

ptoxide

一个无需GPU即可执行CUDA PTX的虚拟机

1 个不稳定版本

0.1.0 2023年11月20日

#687编程语言

MIT/Apache

115KB
3.5K SLoC

ptoxide

ptoxide 是一个crate,允许在任何机器上执行NVIDIA CUDA PTX代码。它是作为一个了解CUDA执行模型的项目而创建的。

通过将其编译成自定义的字节码格式,然后在虚拟机内部执行,来执行内核。

要了解库的实际工作方式,请查看下面的示例,并查看tests 目录中的集成测试。

尝试运行 cargo run --example times_two 以查看其效果!

支持的功能

ptoxide 支持大多数基本的PTX功能,例如

  • 全局、共享和局部(栈)内存
  • (递归)函数调用
  • 使用屏障进行线程同步
  • 对整数和浮点值进行各种算术运算
  • 一维、二维和三维线程网格和块

这些功能足以执行kernels目录中找到的内核,例如简单的向量运算、矩阵乘法和使用共享缓冲区的矩阵转置。

然而,许多功能和指令仍然缺失,您在尝试执行更复杂的程序时可能会遇到todo!和解析错误。欢迎提交PR以实现缺失的功能!

内部结构

该库的代码本身尚未得到很好的文档记录。然而,以下是构成ptoxide的主要模块的概述

  • ast 模块实现了解析PTX程序逻辑。
  • vm 模块定义了一种字节码格式,并实现了执行它的虚拟机。
  • compiler 模块实现了一个简单的单遍编译器,将给定的AST PTX程序转换为字节码。

示例

以下代码示例展示了如何通过一个内核将浮点向量按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