[英]How to calculate the sum of an array in parallel using C++ and OpenMP?
我的任務是使用 C++ 和 OpenMP 並行化在我下面的代碼中看到的數組的創建、加倍和求和。 但是,我無法使總和正確地並行工作。 這是我第一次使用 OpenMP,我對 C++ 也很陌生。 我已經嘗試了在我的下面的代碼中可以看到的內容以及其他變體(在 for 循環之外有總和,並行定義一個總和以添加到全局總和,我已經嘗試了這里建議的內容,等等)。 總和應該是4.15362e-14 ,但是當我使用多個線程時,每次我都會得到不同的結果,這些結果是不正確的。 實現這一目標的正確方法是什么?
PS 到目前為止,我們只學到了關鍵、大師、障礙和單一結構,所以如果答案不包括任何其他結構,我將不勝感激。 謝謝!
#include <iostream>
#include <cmath>
#include <omp.h>
using namespace std;
int main()
{
const int size = 256;
double* sinTable = new double[256];
double sum = 0.0;
// parallelized
#pragma omp parallel
{
for (int n = 0; n < size; n++)
{
sinTable[n] = std::sin(2 * M_PI * n / size); // calculate and insert element into array
sinTable[n] = sinTable[n] * 2; // double current element in array
#pragma omp critical
sum += sinTable[n]; // add element to total sum (one thread at a time)
}
}
// print sum and exit
cout << "Sum: " << sum << endl;
return 0;
}
不幸的是,您的代碼不正確,因為您運行了 for 循環線程次數而不是分配工作。 你應該使用:
#pragma omp parallel for
在線程之間分配工作。 另一種選擇是使用減少:
int main()
{
const int size = 256;
const double step = (2.0 * M_PI) / static_cast<double>(size);
double* sinTable = new double[size];
double sum = 0.0;
// parallelized
#pragma omp parallel for reduction(+:sum)
for (int n = 0; n < size; n++)
{
sinTable[n] = std::sin( static_cast<double>(n) * step); // calculate and insert element into array
sinTable[n] = sinTable[n] * 2.0; // double current element in array
sum += sinTable[n]; // add element to total sum (one thread at a time)
}
// print sum and exit
cout << "Sum: " << sum << endl;
delete[] sinTable;
return 0;
}
請注意,理論上總和應為零。 您獲得的值取決於加法順序,因此可能會因舍入誤差而出現細微差異。
size=256 sum(openmp)=2.84217e-14 sum(no openmp)= 4.15362e-14
size=512 sum(openmp)=5.68434e-14 sum(no openmp)= 5.68434e-14
size=1024 sum(openmp)=0 sum(no openmp)=-2.83332e-14
這是CodeExplorer的鏈接。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.