Sieve C++ 並列プログラミングシステムは、 Codeplay社が設計・リリースしたC++コンパイラおよび並列ランタイムであり、コードの並列化を簡素化し、マルチプロセッサまたはマルチコアシステム上で効率的に実行できるようにすることを目的としています。OpenMP、RapidMind Development Platform、Threading Building Blocks (TBB)など、他のよく知られた並列化手法の代替となるものです。
Sieveは、Sieveマーカーで注釈付けされた逐次コードの一部を受け取り、自動的に並列化するC++コンパイラです。プログラマは、並列化したいコードを「sieve」というタグが付いた字句スコープで囲みます。このスコープは一般的に「sieveブロック」と呼ばれ、その内部で特定のルールが適用されます。:
副作用を遅延させることで、通常は自動並列化を妨げる多くの小さな依存関係が解消されます。コンパイラは読み書きを安全に並べ替えることができ、ダイレクトメモリアクセス(DMA)などのさまざまなデータ移動メカニズムをより効果的に利用できます。さらに、エイリアス解析とデータフロー解析も簡素化できます。コンパイラは、並列処理を活用するために、シーブブロック内のコードをより簡単に分割できるようになります。
このスコープの分離は、Sieve System が非均一メモリ アーキテクチャでも使用できることを意味します。PlayStation 3で使用されているCell マイクロプロセッサなどのマルチコア CPU はこのタイプであり、高速コアはシステム固有のパフォーマンスを活用するために使用する必要があるローカル メモリを備えています。また、x86 のような共有メモリ システムでも動作できるため、さまざまなアーキテクチャで実行できます。Sieve ブロックはネストすることもできます。異なるメモリと処理要素の階層構造を持つシステム向け。
sieveコンパイラは、sieveブロック内のコードを暗黙的に、または「splithere」ステートメントによって明示的にチャンクに分割できます。たとえば、次の例はループを並列化する例を示しています。
sieve { for ( iterator i ( 0 ); i < length ; ++ i ) { R [ i ] = A [ i ] * B [ i ] splithere ; } }コンパイラは、forループ構造の本体の上にエントリポイントとして、暗黙的に分割点を追加します。同様に、ループの後に終了ポイントとして分割点が追加されます。
シーブシステムでは、シーブブロックスコープ内のローカル変数のみが依存関係を持つことができます。ただし、これらの依存関係は分割点を越えてはなりません。分割点をまたぐとコンパイラ警告が発生します。このループを並列化するために、標準の整数ループカウンタの代わりに特別な「イテレータ」クラスを使用できます。これは並列化に対して安全であり、プログラマは自由に新しいイテレータクラスを作成できます。これらのイテレータクラスに加えて、プログラマは、削減操作を実行するために使用される「アキュムレータ」と呼ばれるクラスを自由に実装できます。
Iteratorクラスの実装方法により、スケーラビリティを実現するための様々な手段が生まれます。Sieve Parallel Runtimeは、ターゲットプラットフォーム上で実行する際に動的な投機的実行を採用しています。これにより非常に高い速度向上を実現できますが、シングルコアマシンで実行するとオーバーヘッドが発生する可能性があります。。
決定性は、Sieveシステムの特異な特徴です。マルチコアマシンで並列Sieveプログラムを実行してバグが発生した場合、デバッグを容易にするためにシングルコアで実行してもバグは解消されません。これにより、並行プログラミングで最も一般的なバグの1つである競合状態を排除できるという利点があります。シーブブロック内で並行制御構造を考慮する必要がなくなるため、開発時間を短縮し、より安全なコードを作成できます。
このシステムは、DMAエンジンまたは同様のメモリ転送モデルを介して接続されたローカルメモリを備えた、同種または異種のCPUコアを持つ階層型システム向けに設計されています。
ふるいが示されましたマルチコアx86システム、Ageia PhysX物理処理ユニット、およびIBM Cellマイクロプロセッサ上で正常に動作します。特定のターゲットプラットフォーム用のコンパイラコードジェネレータが利用できない場合は、 ANSI Cが生成されます。これにより、既存のCコンパイルツールキットを使用した自動並列化が可能になります。。