#geobacter #run-time #kernel #intrinsics #compiler #requires #memory

nightly geobacter-core

Geobacter 核心包:运行时平台无关的内建函数和一些新类型,以帮助进行主机/设备内存使用。此包需要特殊的编译器来构建。

1 个稳定版本

使用旧的 Rust 2015

1.0.0 2019年11月19日

#1165 in 开发工具

Download history 64/week @ 2024-03-30 26/week @ 2024-04-06 20/week @ 2024-04-13 19/week @ 2024-04-20 17/week @ 2024-04-27 20/week @ 2024-05-04 22/week @ 2024-05-11 20/week @ 2024-05-18 14/week @ 2024-05-25 18/week @ 2024-06-01 12/week @ 2024-06-08 17/week @ 2024-06-15 23/week @ 2024-06-22 5/week @ 2024-06-29 5/week @ 2024-07-06 19/week @ 2024-07-13

53 每月下载量
用于 9 个包 (7 直接使用)

MIT/Apache

47KB
1.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 std函数适配到Geobacter等价物。
  • 安全输出写入:两个工作项不能创建对同一变量的可变引用。
  • 设备端入队:需要机制将子内核图像句柄嵌入到父内核中。
  • 设备 -> 主机 MPSC通道。

Vulkan/SPIRV

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

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

Cuda

不支持。

如何获取工具链?

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

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

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

我如何使用它进行编码?

请参阅CODING.md! :^)

谁在从事这项工作?

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

新贡献者绝对欢迎。

依赖关系

~0.4–1MB
~23K SLoC