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;
}
問題は出力では、すべてのスレッドが見つけることです各スレッドは三項探索アルゴリズムを使用して探索するために配列のセクションのみを与えられているはずである。誰かが私がどこに間違っていたのかを教えてくれるの?
あなたはかなりの整数の部分をそこに持っています。すべての結果が正しいことを確認しましたか?例えば'left =(quarter/3)+ start;の値は何ですか? – user463035818
4つの異なるスレッド(0,1,2,3)の場合、左の値はそれぞれ16,66,116,166です。技術的には正確ですが、手で手動で計算した後、@ tobi303 – prog