#geobacter #source #single #llvm #amd #accelerator #programming

sys amd-comgr-sys

AMD comgr FFI 绑定。Geobacter 项目的一部分。

1 个稳定版本

1.0.0 2019 年 11 月 20 日

#15#geobacter


2 个 crate 中使用(通过 amd-comgr

MIT/Apache

3KB

🚧 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–2MB
~37K SLoC