2016-11-05 13 views
1

私は大学の仕事をしようとします。そこで、std :: cinから大きなテキストを取り出し、 'tolower()'を使ってすべての文字をより低いcharに変換してstd :: coutに入れる必要があります。OpenMP:上のテキストを下に

これはパラレル化してスケーラブルでなければなりません。まず、行内のテキストを分割し、すべての行に新しいスレッドを渡すことを考えましたが、タスクはopenMPで排他的に行う必要があります。私のマシンは並行して実行できるので、使用するスレッドが多すぎるはずはありません。

#pragma omp parallel for 

それは良いアイデアです、ループのためにすべての単一の文字を反復処理するために:

のでパラダイム「の」は、このOpenMPのがありますか?それとも良い方法がありますか?

ありがとうございました!

+1

あなたの大文字小文字を確認する場合は、各キャラクターを訪問する必要があります。その周りに方法はありません。この場合、I/Oは処理よりも多くの時間を要する可能性があるため、後者を並列化しても実行時間全体に大きな影響を与えない可能性があります。 –

答えて

1

どのような場合でも、すべての文字を繰り返し処理します。しかし、OpenMPについては、あなたのマシンとチャンク戦略に基づいていくつかのスレッドを選択しています。いずれか調整可能ですが、そうする必要はありません。この場合の主な制限は、実際にはtolowerの使用を指示されていることです。

注:行分割は簡単に並列化できません。たとえば、端末からの入力であれば、ノンブロッキングの読み込みや行ベースの読み込み(ほとんどの場合、一度に複数の行を送ることができます)を行うと、端末層によって既に完了しています。ファイルから読み込む場合、行に分割するには、ファイル全体を改行し、開始点と終了点を計算する必要があります。しかし、あなたの操作はラインに依存しないので、これは完全に無駄な努力です。 tolowerは改行文字を変更せず、文字を追加または削除しません。

forループを使用することをお勧めしますか。 OpenMP Cでは、そうです。 OpenMPは、#pragma omp parallel forであなたの典型的なfor (i=0; i<len; i++)をよりスマートなアルゴリズムに変換します。より高いレベルの言語では、必要な操作はmapと呼ばれ、HaskellのparMapのような並列バージョンを持つことができます。そのような言語では、基本的にはoutput = map tolower inputです。私は現代のC++知識を持つ人が、Boostテンプレートを使ってチャイムすることを期待しています。

関連する問題