c++ - Openmp 结果不可靠?

标签 c++ visual-c++ openmp robust

我是 openmp 的新手,当我将 openmp 添加到我的代码中时,我发现在不同的运行中结果不一样。这是openmp的固有问题还是我的代码问题?谢谢你!

#include "stdafx.h"
#include <iostream>
#include <vector>
#include <fstream>
#include <math.h>
#include<sstream>
#include <omp.h>
using namespace std;

int main()
{
    double a[1000];
    for (int i = 0; i < 1000; i++)
    {
        a[i] = 0;
    }
    for (int m = 0; m < 1000; m++)
    {
    #pragma omp parallel for shared(a)
        for (int i = 0; i < 1000000; i++)
        {
            int b = pow(i, 0.5);
            if (b < 1000)
            {
                //cout << i <<" "<<sin(i)<< endl;

                a[b] += sin(i);
            }
        }
    }

    fstream all_temp;
    all_temp.open("temperatureabcd.dat", fstream::out);
    for (int aaa = 0; aaa < 1000; aaa++)
    {
        all_temp << a[aaa] << endl;
    }
    all_temp.close();
    return 0;
}

最佳答案

您的代码正在执行数组缩减。简单的解决方案是做

#pragma omp parallel for reduction(+:a[:1000])

但是,您正在使用的 MSVC(我从预编译头 stdafx.h 推断)不支持 OpenMP 数组缩减。您可以通过像这样更改代码来手动进行数组缩减

double a[1000] = {0};
for (int m = 0; m < 1000; m++) {
  #pragma omp parallel
  {
    double a2[1000] = {0};
    #pragma omp for nowait
    for (int i = 0; i < 1000000; i++) {
      int b = pow(i, 0.5);
      if (b < 1000) a2[b] += sin(i);
    }
    #pragma omp critical
    for(int i = 0; i < 1000; i++) a[i] += a2[i];
  }
}

另一个问题是浮点加法不是关联的,所以减少的顺序很重要。这可以通过更多的工作来解决,但这可能不是您的主要问题。

关于c++ - Openmp 结果不可靠?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51663194/

相关文章:

c++ - "virtual memory exhausted"构建 Docker 镜像时

c++ - 在多个头文件中拆分类是否可以?

具有给定内存的c++ vector 构造

c++ - 如何打印在 NS-3 中使用 UDP 接收的数据包?

c++ - 全局函数和不明确的参数 NULL 与 char* 在 vs 2013 和 GCC 之间

c++ - 确定日期之间的差异

python - 将 Cython 与英特尔编译器和 OpenMP 结合使用

c++ - 关闭 OpenMP

visual-c++ - native c++ dll 如何检测它何时在 Windows 应用商店应用程序中运行

c++ - openmp g++错误: collapsed loops not perfectly nested