#geobacter #framework #kernel #run-time #programming #single #hsa

nightly hsa-rt

Rust对HSA的封装。Geobacter项目的一部分。

1 个不稳定版本

使用旧的Rust 2015

0.1.0 2019年11月19日

#202缓存


2 crate 使用

MIT/Apache

105KB
3K SLoC

🚧 Geobacter Rust 编译器和运行时 🚧

什么是Geobacter?

Geobacter是一个支持单源加速器编程的框架,无需编译两次。然而,Geobacter不是一个JIT;预期是内核会反复调用,并且可能运行成本较高。事实上,由于单函数内核的性质,Geobacter启用了一些对于所有crate来说运行成本过高的LLVM选项。

Geobacter这个名字来自第一个被发现的能够使用氧化铁作为电子受体氧化有机成分的细菌。

目前,AMDGPU和HPC是我们的重点。

它是如何工作的?

在Rust类型系统中,每个fn都有一个唯一的类型。因此,我们可以通过类型来引用函数定义。在我们的Rust分叉中,我们使用特殊的驱动定义的内联函数,实际上返回Rust编译器的ty::Instance<'_>形式,以及其他特定于目标的信息(例如,以支持SPIR-V管道描述)

在运行时,我们使用每个依赖项的元数据重新池化编译器驱动程序(进入运行时驱动程序)。然后我们查找真实的DefId,通过一些编译器提供者API技巧,让LLVM代码生成crate为相应的函数及其所有依赖项生成IR。但是,要清楚的是,这并不是一个JIT,并且不适合JIT式的东西;例如,我们启用了额外的LLVM优化,如Polly,以及增加了优化搜索空间。因此,虽然优化相对较快,但对于JIT来说,它们太慢了。

有一个进程内缓存,以编译器生成的静态形式存在,因此内核不会在加速器目标上多次代码生成。

状态(即什么可行什么不可行)

通常,LLVM优化之前的所有内容都适用于所有目标。在编译时获取特定函数的ID是可行的。在运行时,加载每个crate的元数据并使用这些元数据来设置伪Rust驱动器是可行的,同样地,上述函数ID运行代码生成包括优化以及(如果适用)将其发送到目标机器第二次运行也是可行的。

AMDGPU

该目标可以直接使用,尽管由于仍然存在关于将引用传递给设备不可访问内存(如堆栈)的未解决陷阱,因此调度需要一些不安全性。此外,内核输出必须显式通过指针传递,因为 &mut 必须是唯一的,但所有工作项共享相同的参数值!

"额外"功能

  • 提供漂亮的接口来指定内核启动边界并高效地获取工作项/工作组ID,
  • 设备可见的主机内存分配器,
  • 设备内存分配,但无法在 Box 等中使用,因为无法保证大BAR,
  • 设备纹理,
  • 设备端信号,
  • (主要是)适用于一些使用场景的安全LDS(工作组内存)接口。

待办事项 🚧

  • 更友好的交叉开关接口。
  • 将OpenCL标准函数调整为Geobacter等效函数。
  • 安全输出写入:两个工作项不能创建对同一变量的可变引用。
  • 设备端排队:需要机制在父内核中嵌入子内核图像句柄。
  • 设备 -> 主机 MPSC 通道。

Vulkan/SPIRV

Vulkan/SPIR-V 的支持不如AMDGPU,但对于“简单”计算内核应该可以工作,并且目前还没有使用指南。

Geobacter要求您的Vulkan实现支持物理存储缓冲区地址和变量指针扩展。

Cuda

不支持。

如何获取工具链?

目前,我们没有预构建的编译器供您下载,更不用说直接从 rustup 下载的能力。

因此,您需要自己构建Rust工具链。请参阅 BUILD.md。

待办事项 🚧 提供预构建软件包。

如何使用它进行编码?

请参阅 CODING.md! :^)

谁在做这个?

Richard Diamond 在业余时间从事这项工作。

新贡献者绝对欢迎。

依赖关系

~0–2.2MB
~43K SLoC