7

LLVMをネイティブコードジェネレータとして使用するErlangの軽量プロセス(「グリーンスレッド」)をサポートした並列言語の設計を検討しています。軽量プロセスは、ネイティブOSスレッドにM:N形式で割り当てられ、スレッド間のワークスチールが可能でなければならない(すなわち、プロセスは、必要に応じてスレッド間で渡すことができるデータ構造によって表されるべきである)。非常に多数のプロセスが同時に存在する可能性があるので、プロセスは多量のメモリを占有してはならず、それらの間のコンテキスト切り替えはできるだけ速くすべきです。さらに、コンテキストスイッチ中に軽量プロセスを「一時停止」するか、またはガベージコレクションが発生する場合は、むしろ単純でなければなりません。私はErlangがLLVMバックエンドを持っていることを理解していますが、その実装についての文献はほとんど見つかりません。誰かが私にこれがどのように可能かもしれないかを記述することができますか?LLVMは "グリーンスレッド" /軽量プロセスを実装するための機能を提供していますか?

+0

分割スタックが必要な場合があります。 GCCはそれらを持っているので、おそらくLLVM –

答えて

0

私はLLVMまたはErlangに特定の経験はありません。

しかし、PARLANSEというプログラミング言語でこのようなシステムを実装しました。 はい、コンテキストスイッチを安くすることは困難です。この時

詳細はSO答え:私はLLVMの持っているhttps://stackoverflow.com/a/999610/120163

何少し知識が、それは難しいかもしれない示唆しています。何を 生成する必要がありますコンテキストの切り替えコードです。私はLLVMが直接 をサポートしているかどうかはわかりません。 という純粋なCコードを生成するときには簡単なことではありません。なぜなら言語プリミティブはマシン/スレッド の状態をうまく理解できないからです。

彼はここでは、C + +の14の機能をサポートしようとしているClangは、確かに "C + +ネイティブ"スレッドに遭遇する必要があります。それを可能にするためにコンテキスト切り替えのサポートが必要なので、多分誰かが問題を解決している、または既に持っているかもしれません。

0

LLVMは、この種のシステムの実装に直接関係しません。 LLVMのIRよりも低いような構造を持つ言語のフロントエンドはたくさんあります。

LLVMは単なる実行スレッド用のネイティブコードを生成するコンパイラ技術です。コンテキスト切り替えの実装、スタックの適切な設定(サボテンのスタックやその他の技術)、その他の懸念事項は、主にランタイムと環境の責任です。

1つの例外は、必要に応じてスタックを拡張するためのランタイムコールの合成をサポートし、潜在的にスタックを非連続領域に分割することです。コメントに示されているように、LLVMはそれほどうまくテストされていませんが、これをサポートしています。ただし、フロントエンドはLLVMのサポートを必要としないようにスタックの使用を制御することもできます。

関連する問題