並行性について推論するためにどの中間表現を使用できますか?


12

私は、コンパイラーがプログラマーに代わって並行性に関してインテリジェントな選択を行えるようにするために必要なものをよりよく理解しようとしています。たとえば、この問題には多くの困難な側面があることを理解しています。

  • 競合状態がないことを確認する
  • 同時に実行されるコードに、コードのセマンティックな意味に影響を与える副作用がないことを保証する

  • コードで利用可能な並列度を考慮して、スレッドのスピンアップによるオーバーヘッドが価値があるかどうかを判断する

私の理解では、最新のコンパイラで使用される2つの主要な中間表現は、手続き型言語とオブジェクト指向言語の静的な単一割り当てと、関数型言語のスタイルを渡す継続です。これらの中間形式を使用して、上記の問題のいずれかを推論することは難しいようです。理論的には自動並列化の可能性が最も高い言語(副作用のない保証付きのHaskellのような純粋な関数型言語)でさえ、この分野での進歩は限られています。

私の質問は、この問題に取り組むためにどのような中間表現が実際に使用されているのかということです。学術研究で使用されているが、このタスクに適しているとは知らない他の表現はありますか?この問題は、コンパイルが中間表現に到達する前に抽象構文ツリーを操作することにより、コンパイラーのフロントエンドで根本的に解決する必要があるものですか?


機能的な方法でコードを記述すれば、競合状態や副作用を心配する必要はありません。
ロバートハーヴェイ14年

4
これはあなたの質問にはまったく答えませんが、並行コードについての推論に使用できるProcess Calculiに興味があるかもしれません。最もよく知られている例は、パイ計算です。ただし、自動並列化は依然としてほとんど解決されていない問題であり、コンパイラーに特定の保証を提供するために言語を特別に設計するか、特別な注釈を使用することにより、最善の取り組みが行われます。
アモン14年

4
インテル同時コレクション(CNC)の背景として機能紙のリストなど生産者-消費者としての基本的な8つの同時パターン、。これらの同時パターンは、不変性や副作用のないなどの多くのプロパティに依存します。(誰かがその論文を要約し、ここに答えとして投稿できれば
幸い

理論的なツールの1つは、SSAの上に構築された「動的単一割り当て(DSA)」と呼ばれます。
rwong 14年

@rwong:明示的な参照を提供できますか?
アイラバクスター14年

回答:


5

中間表現(IR)で並行性を明示的にモデル化することが必要な要件であると想定します。したがって、1つの答えは、「fork and join」、「parallel x y」など、「いくつかの同時実行操作を追加したシーケンシャルプログラムに使用されるIR」です。これらを追加すると、ある種の並行性について推論することができますが、必ずしも簡単ではありません。また、完全に機能的な表現に至るまでせずに特定のプロパティ(データ競合の自由度)を確保する方法も明らかではありません(これにより、並列処理を実用的にモデル化することが難しくなります)。

おそらく色付きペトリネット(CPN)は、並行性のあるプログラムを表すのに適した選択肢です。(CPN内のトークンは「色付き」であり、値を運ぶことができます。状態への「遷移」は、着信トークンに対して任意の演算を実行し、「場所」に計算値を持つ異なる色のトークンを生成できます)。場所を計算結果と見なし、遷移をモデル化演算子(メモリにアクセスするための特別なものを含む)として考える場合、プログラムをモデル化するデータフローグラフの量がわかります。これを簡単に使用して、トリプル[operator、input1、input2、output]などの古典的なコンパイラー表現を正式に解釈できます。

このようなCPNグラフを分析するためのツールは多数あります。デッドロックフリーネス、場所でのトークンカウントの有界性などの計算プロパティが含まれます。階層CPNを使用すると、関数と手順、および「呼び出し」の概念をモデル化できます。

これらの表現が明らかにしないことは、アプリケーションをどこで並列化できるかを簡単に推論できるようにすることです。共有オペランドを副作用としない場合、2つのサブ計算が平行になる可能性があります(関数型プログラム/表現が好きな人もいます)。プログラム表現が共有メモリをモデル化する場合、それをモノリスとしてモデル化し、エイリアスアドレス指定など、共有メモリ上の相互作用に関する推論に関する通常の問題を取得できます。これを回避する1つの方法は、メモリを分離したチャンクとして扱うことです大きなプログラム状態は、これらの(ツリーのような)集合体です。おそらく、これらのチャンクを中間表現で渡すことができます。2つの並列計算がチャンク(メモリサブツリーなど)を共有していない場合、それらの間に相互作用はありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.