Show HN: Eyot,一种把 GPU 视为普通线程的编程语言

发布: (2026年3月8日 GMT+8 19:04)
7 分钟阅读

Source: Hacker News

概览

Eyot 是我正在构建的一种新语言,旨在让将工作卸载到 GPU 如同生成后台线程一样无缝。

Eyot 的源代码会透明地为 CPU 和 GPU 编译,二者之间的通信由运行时处理。传统的 GPU 编程要求你自行处理许多任务——内存分配、内核编译、工作调度等。这些长期以来在为 CPU 编写代码时已经由语言运行时负责,而 Eyot 将这种便利扩展到面向 GPU 的代码。

目标用户是那些大量使用 GPU 或其他加速器的领域,例如游戏开发、数值分析和人工智能。

Eyot 仍处于早期阶段。它尚未准备好用于正式工作,但你可以进行实验,如果你尝试了,我很乐意听取你的意见。下面给出一个简单示例(可在演示平台中运行):

fn square(value i64) i64 {
   print_ln("square(", value, ")")
   return value * value
}

cpu fn main() {
    // 1. 直接调用
    print_ln("square(2) on cpu = ", square(2))

    // 2. 作为在 CPU 上运行的 worker 调用
    let cpu_worker = cpu square
    send(cpu_worker, [i64]{ 3 })
    print_ln(receive(cpu_worker))

    // 3. 作为在 GPU 上运行的 worker 调用
    let gpu_worker = gpu square
    send(gpu_worker, [i64]{ 4, 5, 6 })
    print_ln(receive(gpu_worker))
}
  • square 函数按预期直接在 CPU 上调用。
  • CPU workersquare 函数创建(let cpu_worker = cpu square)。该 worker 在后台 CPU 线程上处理通过 send 函数发送的值。对数字求平方后,worker 通过 receive 调用返回结果。
  • 这一次创建的是 GPU worker 而不是 CPU worker(let gpu_worker = gpu square)。这会使 square 函数被编译为内核并在 GPU 上运行;除此之外其行为完全相同。正如你所见,Eyot 的 print_ln 也可以在 GPU 端工作。

Motivation

我参与过许多项目,在这些项目中,将计算迁移到 GPU 是显而易见的提升性能的途径,但由于实现难度大而被忽视。这些项目不仅限于计算机视觉或游戏开发等显而易见的领域,还包括一些看似不适合 GPU 编程的场景,例如桌面应用程序开发。

举例来说,早前我在 Texifier(一款 macOS LaTeX 编辑器)工作时,曾对久负盛名的 TeX 排版系统进行改造,使其直接将多边形输出到 GPU 内存,而不是生成 PDF。这样做显著降低了延迟,使我们能够实时更新输出。该功能颇受欢迎,但实现的困难让我怀疑项目是否值得投入。

在 Eyot 中,我希望构建一种语言,使得在 GPU 上工作深植于语言设计之中,变得轻而易举。长期以来,我们把 CPU/操作系统的组合视作运行代码的环境,而不是可以被操控的设备。Eyot 只是将这种思路扩展到 GPU。虽然 CUDA 等选项已经存在,但 Eyot 的目标是围绕 GPU 并发模型构建整套语言。

当前状态

进展比较缓慢,因为我在业余时间进行开发(欢迎赞助!),最近又因为新生儿的到来而稍作休整。我的主要路线图项目包括:

  • 渲染 – Eyot 目前仅提供对 GPU 的计算访问。游戏开发是一个重要目标,因此渲染支持在我的愿望清单中占很高位置。我希望使用 Vulkan 来实现,同时用 Vulkan 计算取代 OpenCL。
  • 语法 – 为了在不引入在 CPU 与 GPU 两端都不可行的语言特性的前提下实验 CPU/GPU 交互,我推迟了 Eyot 语法的开发。当前缺失的主要语法特性有代数数据类型、lambda 表达式以及某种形式的接口/特质(trait)多态。
  • GPU 内存管理 – 向量和字符串目前只能在 CPU 端分配;这也应当能够在 GPU 上工作。我还希望内存管理器能够在适当时自动将分配转移到共享缓冲区。
  • 性能 – 遵循 “先让它工作,再让它正确,最后让它快” 的原则,我可能会把这部分留到后期,但尽快对 Eyot 投入真实工作负载并提升速度仍然是目标。
  • 标准库 – 目前的库仅包含少量函数,需要进一步完善。

不会进行的工作

  • 自动并行化 – Eyot 不会,也不会自动在 CPU/GPU 核心之间并行化工作。我们的目标是提供一种方便的方式来在处理器之间分配工作,而不是削减控制权。
  • 理论上最优的性能 – Eyot 并不打算完全取代现有的 GPGPU 库,就像 C/C++ 并不打算完全取代汇编一样。Eyot 代码与等价的 C/Vulkan 代码之间出现显著的性能差异会被视为 bug,但为了一定的易用性而接受一些性能惩罚是可以接受的。
  • 成为下一个伟大的通用语言 – 我们会尽量让 GPU 与 CPU 之间的语法差异最小化,因此语言设计将受到 GPU 能力的限制,这可能会限制可以加入 Eyot 语法的内容。

进一步阅读

感谢阅读。您可以通过其文档源代码了解更多关于 Eyot 的信息。如果您想尝试它,欢迎打开 issue 或留下评论!

0 浏览
Back to Blog

相关文章

阅读更多 »