マルチスレッド アプリケーションを作成する際に、考え方が変わったり、見方が変わったりするパラダイムはありますか? おそらく、手続き型プログラミングと関数型プログラミングのように、大きく異なるものを感じるでしょう。
5 に答える
並行性には、さまざまな問題に対してさまざまなモデルがあります。同時実行のウィキペディアのページには、いくつかのモデルがリストされています。また、同時実行にアプローチするためのさまざまな方法の出発点となる同時実行パターンのページもあります。
どのアプローチを取るかは、当面の問題に大きく依存します。さまざまなモデルが、並行アプリケーションで発生する可能性のあるさまざまな問題を解決します。
授業では、並行処理では相互排除と同期を併用して並行処理の問題を解決すると教えられました。一部のソリューションでは 1 つだけが必要ですが、両方を使用すると、同時実行の問題を解決できるはずです。
大きく異なる概念については、不変性と並行性を見ることができます。すべてのデータが不変である場合、並行性に対する従来のアプローチは必要ありません。この記事では、そのトピックについて説明します。
質問の意味がよくわかりませんが、CUDAを使用してコーディングを開始すると、マルチスレッド アプリケーションについて異なる考え方が得られます。
数千のスレッドが同時に存在するため、セマフォ、モニターなどの一般的なマルチスレッド技術とは異なります。したがって、CUDA での並列処理の問題は、データをパーティション分割し、後でデータのチャンクを混合することにあります。
一般的なシリアルの問題を完全に再考したほんの一例がSCANアルゴリズムです。次のように簡単です。
- SET {a,b,c,d,e} が与えられた場合
以下のセットが欲しいです。
{a, a+b, a+b+c, a+b+c+d, a+b+c+d+e}
この場合の記号 '+' は任意の可換演算子です (プラスだけでなく、乗算も実行できます)。
これを並行して行う方法は?これは問題を完全に再考したものであり、この論文で説明されています。
CUDA のさまざまなアルゴリズムのさらに多くの実装は、NVIDIA のWeb サイトで見つけることができます。
非常に保守的なパラダイム シフトは、スレッド中心の同時実行 (すべてを共有) からプロセス中心の同時実行 (アドレス空間の分離) への移行です。このようにして、意図しないデータ共有を回避でき、異なるサブシステム間での通信ポリシーの適用が容易になります。
この考え方は古く、より信頼性の高いオペレーティング システムを構築するために Micro-Kernel OS コミュニティによって (とりわけ) 広められました。興味深いことに、 Microsoft Research によるSingularity OS プロトタイプは、このモデルを使用する場合、従来のアドレス空間は必要ないことを示しています。
私が最も気に入っている比較的新しいアイデアは、トランザクション メモリです。更新が常にアトミックであることを確認することで、同時実行性の問題を回避します。