1 个稳定版本
1.0.0 | 2019 年 11 月 19 日 |
---|
#2280 在 开发工具 中
92 每月下载量
用于 11 个 crate (5 个直接使用)
5KB
110 代码行
🚧 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
必须是唯一的,但所有workitems共享相同的参数值!
"额外"功能
- 提供良好的接口来指定内核启动边界并有效地获取workitem/workgroup ID,
- 设备可见的主机内存分配器,
- 设备内存分配,但这不能用于
Box
等,因为无法保证大型BAR, - 设备纹理,
- 设备端信号,
- (大多数情况下)安全的LDS(工作组内存)接口,适用于一些使用场景。
待办事项 🚧
- 更好的交叉接口。
- 将OpenCL std函数适配为Geobacter等效函数。
- 安全的输出写入:两个workitems不得创建对同一变量的可变引用。
- 设备端排队:需要机制将子内核图像句柄嵌入父内核。
- 设备到主机MPSC通道。
Vulkan/SPIRV
Vulkan/SPIR-V的兼容性远不如AMDGPU,但“简单”的计算内核应该可以工作,目前还没有使用指南。
Geobacter要求你的Vulkan实现支持物理存储缓冲区地址和变量指针扩展。
Cuda
无支持。
如何获取工具链?
目前,我们没有提供供您下载的预构建编译器,更不用说直接从rustup
下载的能力。
因此,您需要自己构建Rust工具链。请参阅BUILD.md。
待办事项 🚧提供预构建包。
如何使用它进行编码?
请参阅CODING.md! :^)
谁在做这个?
Richard Diamond在业余时间做这个。
欢迎新的贡献者。
依赖关系
~0.4–1MB
~24K SLoC