2016-12-31 7 views
0

文字列検索のための単純なアルゴリズムをパラレル化しようとしています。私はシンプルなバージョンを作成し、その後、複数のスレッドを使用してそれをスピードアップしようとしました。文字列検索 - パラレルバージョンが遅い

しかし、次のコードは、それが非常に遅くなります:

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; 
} 

私が間違って何をしているのですか?

+3

ランダム推測:結果の開始/停止/照合のオーバーヘッドを補うために各スレッドで作業が不十分ですか? –

+0

一致するものが見つからないため、サイクルがすぐに終了することがあります。これを解決するには? – tomascapek

+1

私は、あなたが解決しようとしている特定の問題の正確な詳細を知らないので、私が言うことは難しいです(私は基本は理解していますが、大きな文字列の数、文字列の最初の部分がどれくらい前に一致するか、並べ替えられているかどうか、ソートされているかなど - ここで重要なことすべてを考えなかったと思います)。一般的に、各スレッドは他のスレッドとは別に実行されるほど、パフォーマンスが向上します。 –

答えて

0

だから私は後ずさりし、別のアプローチを試みた:

template<typename T> long unsigned int simple_paralel(const T * str1, unsigned long int str1_length, const T * str2, unsigned long int str2_length, int threads) { 
    count = 0; 

    unsigned long int block = str1_length/threads; 
    unsigned long int total = 0; 
    unsigned long int result = 0; 

    unsigned long int smallest = ~0; 
    #pragma omp parallel for shared(count) 
    for(int i=0; i<threads; i++) 
    { 
    unsigned long int res; 
    unsigned long int start = i * block; 
    if(i != threads -1) 
    { 
     total += block; 
     res = simple_p(str1 + start, block, str2, str2_length, false); 
    } else { 
     res = simple_p(str1 + start, str1_length - total, str2, str2_length); 
    } 

    if(res < result && res != 0){ 
     result = res; 
    } 
    } 

    return count; 
} 

をそして期待どおりに動作します。しかし、私はまだ、私ははOpenMPでこれを行うことはできません信じることができない。

+1

***しかし、OpenMPでこれを行うことはできないと私はまだ信じられません。***私はこの声明と混同しています。ここではopenmpを使っているようです。これは問題を解決する答えになるのでしょうか? – drescherjm

+0

私の悪い!私は、OpenMPが自分のソリューションのように入力を簡単にチャンクに分割できると思っていました。 – tomascapek