簡體   English   中英

如何使用 C++ 和 OpenMP 並行計算數組的總和?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM