文字列検索のための単純なアルゴリズムをパラレル化しようとしています。私はシンプルなバージョンを作成し、その後、複数のスレッドを使用してそれをスピードアップしようとしました。文字列検索 - パラレルバージョンが遅い
しかし、次のコードは、それが非常に遅くなります:
template<typename T> long unsigned int simple_paralel(const T * str1, unsigned long int str1_length, const T * str2, unsigned long int str2_length) {
unsigned int long result = ~0;
unsigned int long count = 0;
unsigned long int in;
unsigned int long top;
#pragma omp parallel
#pragma for ordered shared(result, count) private(in, top) firstprivate(str1, str2, str1_length, str2_length)
for (top = 0; top < str1_length; top++) {
in = 0;
// & top + in < str1_length
while (in < str2_length) {
if (top + in >= str1_length)
break;
if (str1[top+in] != str2[in]) {
break;
}
++in;
if(in == str2_length) {
// shared and we want to have the smallest index
if(result >= top + 1) {
result = top + 1;
}
count++;
}
}
}
return count;
}
私が間違って何をしているのですか?
ランダム推測:結果の開始/停止/照合のオーバーヘッドを補うために各スレッドで作業が不十分ですか? –
一致するものが見つからないため、サイクルがすぐに終了することがあります。これを解決するには? – tomascapek
私は、あなたが解決しようとしている特定の問題の正確な詳細を知らないので、私が言うことは難しいです(私は基本は理解していますが、大きな文字列の数、文字列の最初の部分がどれくらい前に一致するか、並べ替えられているかどうか、ソートされているかなど - ここで重要なことすべてを考えなかったと思います)。一般的に、各スレッドは他のスレッドとは別に実行されるほど、パフォーマンスが向上します。 –