luna_thread

luna_thread 让 MoonBit 程序把并行工作描述为数据,并在原生 C 运行时上运行其中一部分。程序构建计划(作用于带类型输入域的 map、reduce、scan 和 map-reduce)和工作流(其节点使用通道、互斥锁、屏障等能力的任务图),在 MoonBit 中验证它们,并通过 C 外部函数接口执行整数内核和工作流图。经由 Node.js 插件的 JavaScript 路径已搭好脚手架,但还不执行任何东西。

仓库中还保存着实现正在逐步靠拢的规范性规范。本手册描述当前分支实现了什么;凡是代码比规范更窄的地方,页面都会说明。

MoonBit Workflow 与并行 FFI Runtime 的规范性规格

状态

该模块的版本为 0.1.0,实现了一个有意保持很小的首个子集(“v1”):

  • 计划和工作流在 MoonBit 中验证,并且只有同步模式下的原生后端能通过验证。
  • 可执行的内核包括作用于 Int 和 Int64 的逐元素翻倍、求和、最小值和最大值归约,以及包含式前缀和。门面暴露了 Int 版本的翻倍、求和与前缀和。
  • 工作流图运行在 C 中基于 pthread 的调度器上,该调度器执行每个节点的同步协议。计算节点会被调度,但还不运行它们的计划。
  • 门面和 backend/native 只能在 native 目标上构建;plan、shared、workflow 和 backend/js 可以在所有目标上构建。

包

MoonBit 模块位于仓库的 luna_thread/ 目录中;其根包以 core 为名编写文档。

包导入路径内容页面
coreLuna-Flow/luna_thread门面:策略、计划和工作流构建器、直接执行以及异步工作流。API · 教程 · 设计
planLuna-Flow/luna_thread/plan与后端无关的数据并行计划及其验证。API · 教程 · 设计
workflowLuna-Flow/luna_thread/workflow带能力的任务图、其验证和提交记录。API · 教程 · 设计
sharedLuna-Flow/luna_thread/shared执行策略、后端目标、运行时能力以及整数编码的 FFI 记录。API · 教程 · 设计
backend/nativeLuna-Flow/luna_thread/backend/nativeC FFI 后端:内核、工作流运行时以及带类型的原生请求。API · 教程 · 设计
backend/jsLuna-Flow/luna_thread/backend/jsJavaScript 后端的占位包。API · 教程 · 设计

native/ 中的 C 运行时、作为 MoonBit 原生桩编译的副本,以及 js/ 中的 Node.js 插件都不是 MoonBit 包;架构指南描述了它们以及各层如何组合。

阅读路径

如果你想运行点什么,请从 core 教程开始:它在原生后端上对数组做翻倍、求和与扫描,并提交一个小型工作流。若想在构建之前理解计划或工作流的含义,请阅读 plan 教程和 workflow 教程。如果你已经在使用这个库,API 页面列出了每个公开名称,可从 core API 开始。贡献者应阅读架构指南和各设计页面,特别是关于线程和内存模型的原生后端设计,然后阅读上面的规范。

工具链

本模块使用 moon.mod 与 moon.pkg 清单语法,需要 MoonBit moonc 0.10 或更高版本。运行门面需要 native 目标和 C 编译器;构建会从包的原生桩链接 C 运行时,并使用 POSIX 线程。以 OpenMP 构建独立的 C 运行时使用 CMake,Node.js 插件使用 node-gyp;scripts/check-env.sh 会检查所有这些工具。

安装

把模块添加到你的项目中:

moon add Luna-Flow/luna_thread@0.1.0

在一个为原生目标构建的包的 moon.pkg 中导入门面:

import {
  "Luna-Flow/luna_thread",
}

supported_targets = "native"

之后即可通过 @luna_thread 使用门面。只构建计划或工作流的包可以在任何目标上导入 Luna-Flow/luna_thread/plan 或 Luna-Flow/luna_thread/workflow。