1

マルチスレッド (Openmp と C コード) について質問があります。

与えられたテキスト ファイルで 16 個の異なる単語を検索します。これを行う方法は、検索する各単語を含む配列を実行する for ループを作成することです。16 の異なる単語は、同時に実行できる 16 の異なるスレッドを意味します。マルチスレッドを使用するもう 1 つの方法は、テキスト ファイルを x 個の同様のサイズのチャンクに分割し、各チャンクを同時に検索することです。私の質問は次のとおりです。マルチスレッドを使用して単語ごとに 1 つのスレッドを作成し、その特定のサブスレッドを新しいサブスレッドに分割して、1 つのサイズのデータ​​ チャンクをスキャンすることはできますか?

これが不可能/実行可能でない場合、唯一の解決策は、テキスト ファイルを手動で異なる char 配列に分割し、検索する単語ごとに #pragma を使用することだと思います。

テキスト ファイルに対しては読み取り操作のみが実行され、書き込み操作は目的をカウントするために各単語に割り当てられた変数に限定されます。つまり、何かを見逃していない限り、競合状態は発生しません。

4

1 に答える 1

0

まず、16 語は 16 の異なるスレッドを意味するわけではありません。各スレッド自体が、同期オーバーヘッド、不均等な作業分散、spawn-relax 時間などの要因をもたらします。慎重に検討しないと、並列処理の利点が完全に損なわれてしまいます。

並列処理は、作業データ間の依存関係がない場合に大いに活用できます。あなたの仕事は、あなたが表現した可能な解決策のいずれかの作業データから独立しています。文字の大きなプール内でいくつかの文字を検索するには、文字の配置とは関係ありません (たとえば、すべての「C」の後に「++」を探す vs 「++」を探す)。

ここで問題になるのは、メモリ帯域をどのように活用し、「分岐予測」によって失われたものをどのように解消するかです。

共通データ 異なるスレッドは、メモリ バウンドの状況では非常に適しています。データを読み取った最初のスレッドがそれをキャッシュにロードし、他のスレッドはこのデータのチャンクを利用することになります。そのため、データはメモリから一度だけロードされます。各スレッドがその部分をロードしてからフラッシュするため、データを分割すると、データがメモリから 1 回だけロードされます。そのため、メモリ負荷はどちらの場合も非常に似ています。

あなたのコードは「論理的にバインドされた」ものです。分岐予測は注意が必要な非常に重要な側面ですが、非常に注意が必要です。共通データ モジュールは、高い確率で失敗します。100 万個のボールの中から赤色のボールを見つけなければならないとします。予測は、「存在しない」という自然な選択をする傾向があります。しかし、最初の 100 個のボールで失敗したとします。この失敗の後に処理されたすべてのボールはやり直しになり、振り出しに戻ります。逆に、分割の場合、「やり直し」という最悪のシナリオは、共通データとして悪くありません。しかし、それを保証することはできません。

上記のモジュールのいずれを選択するかは、自由に使用できるアーキテクチャに完全に依存します。

SMT / 論理コアと物理コア。SMT で上記の方法のいずれかを使用すると、同じ番号に対してパフォーマンスが低下します。物理コアの。1 つのスレッドがサブスレッドに分割されるというあなたの考えは、SMT の基礎です。新しいスレッドごとに、リソースの追跡が追加され、同期のオーバーヘッドが発生し、分岐の予測ミスが発生する可能性もあります。物理スレッドが増えると、分岐予測によってパフォーマンスが制限されます。

分割または共通データ、コードはスケーラブルではありません。最善の方法は、最小限の番号を使用することです。利用可能な物理コアの。共通データは複雑さを軽減し、作業が非常に簡単になるはずです。最小数。のスレッドは、実験によって見つけることができます。この値の後、パフォーマンスは一定になります。

于 2013-04-29T05:02:13.897 に答える