まず、16 語は 16 の異なるスレッドを意味するわけではありません。各スレッド自体が、同期オーバーヘッド、不均等な作業分散、spawn-relax 時間などの要因をもたらします。慎重に検討しないと、並列処理の利点が完全に損なわれてしまいます。
並列処理は、作業データ間の依存関係がない場合に大いに活用できます。あなたの仕事は、あなたが表現した可能な解決策のいずれかの作業データから独立しています。文字の大きなプール内でいくつかの文字を検索するには、文字の配置とは関係ありません (たとえば、すべての「C」の後に「++」を探す vs 「++」を探す)。
ここで問題になるのは、メモリ帯域をどのように活用し、「分岐予測」によって失われたものをどのように解消するかです。
共通データ 異なるスレッドは、メモリ バウンドの状況では非常に適しています。データを読み取った最初のスレッドがそれをキャッシュにロードし、他のスレッドはこのデータのチャンクを利用することになります。そのため、データはメモリから一度だけロードされます。各スレッドがその部分をロードしてからフラッシュするため、データを分割すると、データがメモリから 1 回だけロードされます。そのため、メモリ負荷はどちらの場合も非常に似ています。
あなたのコードは「論理的にバインドされた」ものです。分岐予測は注意が必要な非常に重要な側面ですが、非常に注意が必要です。共通データ モジュールは、高い確率で失敗します。100 万個のボールの中から赤色のボールを見つけなければならないとします。予測は、「存在しない」という自然な選択をする傾向があります。しかし、最初の 100 個のボールで失敗したとします。この失敗の後に処理されたすべてのボールはやり直しになり、振り出しに戻ります。逆に、分割の場合、「やり直し」という最悪のシナリオは、共通データとして悪くありません。しかし、それを保証することはできません。
上記のモジュールのいずれを選択するかは、自由に使用できるアーキテクチャに完全に依存します。
SMT / 論理コアと物理コア。SMT で上記の方法のいずれかを使用すると、同じ番号に対してパフォーマンスが低下します。物理コアの。1 つのスレッドがサブスレッドに分割されるというあなたの考えは、SMT の基礎です。新しいスレッドごとに、リソースの追跡が追加され、同期のオーバーヘッドが発生し、分岐の予測ミスが発生する可能性もあります。物理スレッドが増えると、分岐予測によってパフォーマンスが制限されます。
分割または共通データ、コードはスケーラブルではありません。最善の方法は、最小限の番号を使用することです。利用可能な物理コアの。共通データは複雑さを軽減し、作業が非常に簡単になるはずです。最小数。のスレッドは、実験によって見つけることができます。この値の後、パフォーマンスは一定になります。