#geobacter #run-time #single #source #programming #accelerator #framework

geobacter-runtime-nv

Geobacter Nvidia/CUDA 运行时。目前尚无功能性。

1 个不稳定版本

0.1.0 2019年11月20日

#1124硬件支持

MIT/Apache

155KB
3.5K 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。

待办事项 🚧 提供 prebuilt 软件包。

我如何使用它编写代码?

请参阅 CODING.md! :^)

谁在从事这项工作?

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

欢迎新的贡献者。

依赖项

~5–14MB
~187K SLoC