マルチスレッドに関する悲観論

大量同時実行とハードウェア同時実行は、21世紀のホットトピックです。 これにはいくつかの良い理由がありますが、悲しい理由もあります。



2つの理由:ゲームでの優れたGPUパフォーマンスの組み合わせと、AIのディープラーニングでの予期しないサイド使用 悲しい理由は、2006年以降、ユニプロセッサシステムの速度が物理法則に反していることです。 リークと熱破壊の現在の問題は、クロック周波数の増加を急激に制限し、今では古典的な電圧低減は量子ノイズの深刻な問題に直面しています。



プロセッサメーカーは、一般の人々の注目を集めて、各チップにますます多くのプロセッサコアをプッシュし、理論的な全体的なパフォーマンスを売り込んでいます。 フードの下でマルチスレッドを使用するコンベヤ化の努力と投機的な実行方法も急速に成長しているため、プログラマに見える単一のプロセッサが命令をより速く処理できます。



不都合な真実は、あまり魅力的ではないコンピューティングタスクの多くが、目に見えるマルチスレッドをうまく使用できないことです。 これにはさまざまな理由があり、プログラマーに異なる結果をもたらし、多くの混乱があります。 この記事では、状況をいくらか明確にしたいと思います。



まず、ハードウェア並列処理が最適に機能する場所とその理由を明確に理解する必要があります。 グラフィックス、ニューラルネットワーク、信号処理、ビットコインマイニングの計算を見てみましょう。 パターンがあります:並列化アルゴリズムは、(a)実行するように特別に設計された機器で最適に機能します。 (b)他に何もできない!



また、最も成功した並列アルゴリズム(並べ替え、文字列照合、高速フーリエ変換、行列演算、画像の逆量子化など)の入力は非常に似ていることがわかります。 原則として、それらはメトリック構造を持ち、「近い」データと「遠い」データの違いが暗示されます。これにより、遠い要素間の接続は重要ではないため、データを部分に分割できます。



セマンティックローカリティに関する最後の記事では、データのローカリティが良好な場合、並列メソッドが主に適用可能であると言えます。 また、GPUの中心にある収縮マトリックスのように、「短距離」接続のみをサポートする機器で最適に機能します。



一方、汎用コンピューター(von Neumannアーキテクチャー)では、局所性の低い入力データ用のセクションを効果的に生成するソフトウェアを作成することは非常に困難です。



その結果、単純なヒューリスティックを定式化できます。 並列計算を使用する可能性は、入力データの既約意味的非局所性の程度に反比例します。



並列計算のもう1つの制限は、いくつかの重要なアルゴリズムをまったく理論的に並列化できないことです。 ブログでこのトピックについて初めて議論したとき、「シックアルゴリズム」という用語を思いつきました。SICKは「Serial、Intrinscally-Cope、Kiddo!」の略です。 重要な例は次のとおりです。最短経路を見つけるためのダイクストラのアルゴリズム。 有向グラフのサイクルの検出(ソルバーで3-SATを使用); ディープサーチ; ハッシュの暗号チェーンのn番目のメンバーを計算します。 ネットワークストリームの最適化...これは完全なリストではありません。



ここで、特にグラフとツリー構造のコンテキストでは、入力データのローカリティが役割を果たします。 レコードは厳密な順序で計算されるため、暗号化ハッシュチェーンは並列化できません。これは、チェーンを偽造から保護するための本当に重要なルールです。



そして、ここにロックが入ります:SICKアルゴリズムが動作している間は何も並列化できません。



終わりではありません。 障害物には少なくとも2つのクラスがあり、非常に一般的なものがあります。



まず、必要なツールがありません。 ほとんどの言語は、ミューテックスとセマフォ以外をサポートしていません。 これは便利で、プリミティブは簡単に実装できますが、この状況は頭の中で複雑さの恐ろしい爆発を引き起こします:相互作用する4つ以上のロックの規模を理解することはほとんど不可能です。



運がよければ、Goチャンネル(別名Communicating Sequential Processes)やRustの所有権/送信/同期システムなど、より適応性の高いプリミティブのセットを取得できます。 しかし、実際には、フォンノイマンアーキテクチャで並列処理を実装するためのプリミティブの「正しい」言語が何であるかはわかりません。 おそらく、正しいプリミティブのセットも1つもありません。 おそらく、2つまたは3つの異なるセットが異なる問題領域に適していますが、それらは1つの単位および2の平方根として通約不可能です。 これまでのところ、2018年には誰も本当に知りません。



そして最後の、しかし重要な制限は人間の脳です。 優れたデータの局所性と効率的なツールを備えた明確なアルゴリズムであっても、たとえアルゴリズムが非常に単純に適用されたとしても、並列プログラミングは人々にとって単純に困難です。 私たちの脳は、純粋にシーケンシャルなプログラム、特に並列プログラムの最も単純な状態空間をあまりうまくモデリングしていません。



これは、並列コードのデバッグが難しい以上の多くの真の証拠があるためです。 これは、競合状態、デッドロック、自己破壊的なロック、わずかに安全ではない命令の順序による潜在的なデータ破損によって妨げられます。



デナードのスケーリング法則が崩壊した後、これらの制限を理解することがより重要になると思います。 プログラミングにおけるこれらすべてのボトルネックのため、マルチコアシステムの一部は常に、100%の計算能力で機器をロードできないソフトウェアを実行します。 反対側から見ると、現在のタスクに過剰な鉄分があります。 どのくらいのお金と努力が無駄になっていますか?



プロセッサメーカーは、より多くのコアを搭載したスマートな新しいチップの機能上の利点を過大評価することを望んでいます。 収益性を維持しながら、巨額の生産コストを賄うために他にどのように資金を調達できるでしょうか? マーケティングは最善を尽くしているので、そのようなマルチスレッドが本当に有益なタスクを不思議に思うことはありません。



正直なところ、そのようなタスクがあります。 1秒間に数十万の同時トランザクションを処理するデータセンターのサーバーは、コア全体に負荷をかなり分散させる可能性があります。 スマートフォンや組み込みシステムも-どちらの場合も、コストとエネルギー消費を最小限に抑えるために多大な努力が払われており、過剰な電力を投入することは困難です。



しかし、普通のデスクトップとラップトップのユーザーにとっては? 漠然と私を苦しめる疑い。 ここで状況を理解することは困難です。生産性の本当の向上は、HDDからSSDへの移行など、他の要因によるものだからです。 このような成果は、徹底的なプロファイリングを行わないと、CPUを高速化する効果と誤解されやすくなります。



そのような疑いの根拠は次のとおりです。



  1. デスクトップ/ラップトップコンピューターでの深刻な並列計算は、GPUでのみ発生します。
  2. 通常、プロセッサ内の3つ以上のコアは役に立ちません。 オペレーティングシステムはアプリケーションフローを配信できますが、通常のソフトウェアは同時実行性を使用できず、ほとんどのユーザーは、機器を完全にロードするために大量のCPUリソースを消費する多数の異なるアプリケーションを同時に起動することはほとんどありません。
  3. その結果、ほとんどのクアッドコアシステムは、ほとんどの場合、熱を生成するだけで動作します。


私の読者の中には、この仮説について合理的にコメントできる人がたくさんいます。 彼らの言うことを見るのは面白い。



更新 G +のコメンテーターは、マルチコアプロセッサの興味深い利点の1つを指摘しました。つまり、コードを非常に迅速にコンパイルします。 Cのような言語のソースコードのローカリティは良好です。ここでは、適切に分離されたユニット(ソースファイル)がオブジェクトファイルにコンパイルされ、その後リンカーが結合します。



All Articles