luna_thread

luna_thread は、MoonBit のプログラムが並列の作業をデータとして記述し、その一部をネイティブ C ランタイムで実行できるようにします。プログラムはプラン(型付きの入力領域に対する map、reduce、scan、map-reduce)とワークフロー(ノードがチャネル、ミューテックス、バリアなどのケイパビリティを使うタスクグラフ)を作り、MoonBit で検証し、C の外部関数インターフェースを通じて整数カーネルとワークフローグラフを実行します。Node.js アドオンを使う JavaScript の経路はひな形だけで、まだ何も実行しません。

リポジトリには、実装が目指している規範的な仕様も含まれています。このマニュアルは現在のブランチが実装しているものを説明し、コードが仕様より狭いところではそのことを明記しています。

MoonBit Workflow と並列 FFI ランタイムの規範的仕様

状況

モジュールのバージョンは 0.1.0 で、意図的に小さく抑えた最初のサブセット(「v1」)を実装しています。

  • プランとワークフローは MoonBit で検証され、検証を通るのは同期モードのネイティブバックエンドだけです。
  • 実行できるカーネルは、Int と Int64 に対する要素ごとの 2 倍、和・最小値・最大値のリダクション、包含的な累積和です。ファサードは Int 版の 2 倍、和、累積和を公開しています。
  • ワークフローグラフは、各ノードの同期プロトコルを実行する 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 チュートリアルから始めてください。ネイティブバックエンドで配列を 2 倍にし、和をとり、スキャンし、小さなワークフローを投入します。作る前にプランやワークフローの意味を理解したいなら、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 をインポートできます。