2017-04-26 11 views
1

私は、OpenMPライブラリからプラグマomp parallelを使って三項探索アルゴリズムを実装しようとしています。私は再帰を使用しています。ここで私のコード実装でこれまでに到達したことがあります。omp parallelセクションのスレッドをセクションで分割しないのはなぜですか?

これは、検索機能である:

int ternarySearch(int arr[], int size, int left, int right, int num) 
{ 
    if (left < 0 || right > size - 1 || left > right){ 
     return -1; 
    } 
    else if (num == arr[left]){ 
     return left-1; 
    } 
    else if (num == arr[right]){ 
     return right-1; 
    } 
    else if (num < arr[left]){ 
     return ternarySearch(arr, size, left - 1, right, num); 
    } 
    else if (num > arr[left] && num < arr[right]){ 
     return ternarySearch(arr, size, left + 1, right - 1, num); 
    } 
    else if (num > arr[right]){ 
     return ternarySearch(arr, size, left, right + 1, num); 
    } 
} 

そして、ここではternarySearch関数を呼び出すメイン機能で一部です:

omp_set_num_threads(4); 
    int quarter = size/4; 

    /*Using Recursion*/ 
    cout << endl << "Parallel Using Recursion: " << endl << endl; 
    bool isFound = false; 
    double paraRecStartTime = omp_get_wtime(); 
    #pragma omp parallel shared(isFound) 
    { 
     int id, start, end, left, right, result; 

     id = omp_get_thread_num(); 
     start = id*quarter; 
     end = start + quarter; 
     left = (quarter/3) + start; 
     right = end - (quarter/3); 
     cout << id << endl; 
     result = ternarySearch(arr, end, left, right, num); 
     if(result != -1) { 
      cout << "Found by thread " << id << " in index " << result << endl; 
      isFound = true; 
     } 
    } 


    double paraRecRunTime = omp_get_wtime() - paraRecStartTime; 
    cout << "Ternary Search took " << paraRecRunTime << " sec using 4 threads." << endl << endl; 

    if (isFound == false) { 
     cout << "Number does not exist in the array." << endl << endl; 
    } 

問題は出力では、すべてのスレッドが見つけることです各スレッドは三項探索アルゴリズムを使用して探索するために配列のセクションのみを与えられているはずである。誰かが私がどこに間違っていたのかを教えてくれるの?

+0

あなたはかなりの整数の部分をそこに持っています。すべての結果が正しいことを確認しましたか?例えば'left =(quarter/3)+ start;の値は何ですか? – user463035818

+0

4つの異なるスレッド(0,1,2,3)の場合、左の値はそれぞれ16,66,116,166です。技術的には正確ですが、手で手動で計算した後、@ tobi303 – prog

答えて

0

さらにOpenMP標準を読み、このためにタスクを使用してください。再帰的な問題は、入れ子にされた並列性を使うよりはるかに良い。

関連する問題