アーキテクチャ

このガイドでは、luna_thread の MoonBit パッケージ、C ランタイム、JavaScript アドオンがどう組み合わさるか、そしてどの整数コードが外部関数インターフェースを越えるかを説明します。各 MoonBit パッケージの詳細はパッケージのページにあります。

レイヤー

仕様は 2 つの実現経路を挙げています。

MoonBit facade -> MoonBit C FFI  -> C wrapper  -> C runtime
MoonBit facade -> MoonBit JS FFI -> JS wrapper -> N-API addon -> C runtime

1 つ目の経路は存在します。2 つ目は MoonBit 側で止まっています。backend/js は JavaScript ターゲットを示すだけで、js/ のアドオンは runtimeName 関数しかエクスポートしません。

MoonBit パッケージの依存関係に閉路はありません。

パッケージインポート
sharedコアライブラリのみ
planshared
workflowplan, shared
backend/jsplan, shared
backend/nativeplan, shared, workflow
corebackend/native, plan, shared, workflow
  • shared はほかのすべてのパッケージが使う語彙を持ちます。バックエンドターゲット、実行モード、順序の保証、実行ポリシーとその検証、ランタイムケイパビリティの表、C のリクエスト構造体を整数コードで写したものです。
  • plan は型付きの入力領域に対する 1 つのデータ並列操作を記述し、v1 のサブセットに照らして検査します。
  • workflow は、ノードが計算プランやケイパビリティに結び付いた同期ステップであるタスクグラフを記述し、その構造を検査します。
  • backend/native はプランを型付きのネイティブリクエストに変換し、C のカーネルを呼び出し、ワークフローを整列して C スケジューラに渡します。
  • ルートパッケージ core はよく使う入口を既定値付きで再エクスポートし、投入をネイティブバックエンドに振り分けます。

C ランタイム

ランタイムは 1 つの C ファイルと 1 つのヘッダからなります。

ファイル役割
native/include/luna_thread_runtime.h公開 C API。ステータスコード、リクエスト構造体、ワークフローの型です。
native/src/runtime.cカーネル、検証、ワークフロースケジューラです。
luna_thread/backend/native/ffi_runtime_impl.c同じソースを MoonBit のネイティブスタブとしてコンパイルしたもので、違いは #include のパスだけです。
luna_thread/backend/native/ffi_runtime_bridge.cMoonBit の引数をリクエスト構造体に変換する luna_mbt_* ラッパーです。
luna_thread/backend/native/ffi_stub.cluna_mbt_* ラッパーの宣言です。
native/tests/smoke.cカーネルとその失敗ステータスに対する C のスモークテストです。

ランタイムの 2 つのコピーは手作業で同一に保たなければなりません。

ビルドは 2 通りあります。moon はシステムの C コンパイラで OpenMP のフラグなしにスタブをコンパイルするので、#pragma omp のループは呼び出し元のスレッドで実行されますが、ワークフロースケジューラは POSIX スレッドを起動します。CMake(make native-configure、make native-build)は、LUNA_THREAD_ENABLE_OPENMP が有効なら native/ を OpenMP 付きの静的ライブラリとしてビルドし、スモークテストも一緒にビルドします。両方の実行モデルはネイティブバックエンドの設計で説明しています。

インターフェースを越えるコード

すべての列挙値は Int として C インターフェースを越えます。MoonBit 側では backend/native(ステータスは shared)で対応づけます。

ステータスコード

コードC の名前MoonBit の NativeStatus
0LUNA_THREAD_STATUS_OKOk
1INVALID_ARGUMENTInvalidArgument
2UNSUPPORTED_BACKENDUnsupportedBackend
3UNSUPPORTED_MODEUnsupportedMode
4UNSUPPORTED_VALUE_TYPEUnsupportedValueType
5UNSUPPORTED_REDUCTION_KERNELUnsupportedReductionKernel
6OVERFLOWOverflow
7NULL_POINTERNullPointer
8UNSUPPORTED_RUNTIME_PRIMITIVEなし
9RUNTIME_BROKENなし
10CHANNEL_EMPTYなし
11CHANNEL_CLOSEDなし
12MUTEX_PROTOCOL_ERRORなし
13CONDVAR_PROTOCOL_ERRORなし
14BARRIER_BROKENなし

コード 8 から 14 はワークフローランタイムからのみ返され、WorkflowResult::status が生の整数として運びます。

ワークフローのコード

コードノードの種類ケイパビリティの種類エッジの種類ランタイムの状態
0ComputeOwnedBufferDataDependencySubmitted
1SpawnSharedReadViewControlDependencyRunning
2JoinAtomicCellOwnershipTransferCompleted
3SendMutexSynchronizationDependencyFailed
4RecvCondvarRejected
5LockRwLock
6UnlockSemaphore
7WaitBarrier
8SignalChannel
9BarrierOpaque
10ReadShared
11WriteShared

値の型は I32 が 0、I64 が 1、リダクションカーネルは Sum が 0、Min が 1、Max が 2 です。

JavaScript アドオン

js/ は node-gyp のプロジェクト(make js-install、make js-build)で、その C ソースは "luna_thread_addon" を返す関数 runtimeName を 1 つだけ登録します。まだ C ランタイムはリンクしていません。

仕様

doc/attachments/moonbit_parallel_spec/main.typ は規範となる英語の仕様で、main.zh_CN.typ はその中国語版です。make docs で両方をコンパイルします。仕様はワークフロー計算、所有権の移転、ABI のレイアウト、適合性の義務を定めています。実装は第 I 部のデータモデルと検証、そしてその一部のネイティブ実現を扱っており、どの部分かは各パッケージの設計ページに書かれています。docs/spec-review-report-zh.md にはレビューの所見が中国語で記録されています。

リポジトリの構成

パス内容
luna_thread/MoonBit モジュール(moon.mod)とそのパッケージです。
native/C ランタイム、ヘッダ、CMake ビルド、スモークテストです。
js/Node.js アドオンのひな形です。
doc/このマニュアル、その翻訳、仕様です。
scripts/check-env.shMoonBit、C、Node.js、Typst のツールチェーンを検査します。
Makefile検査、ネイティブランタイムとアドオンのビルド、仕様のコンパイルのためのショートカットです。