Openmp结果不稳健
Openmp results are not 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];
}
}
另一个问题是浮点加法是不关联的,所以进行归约的顺序很重要。这可以通过更多的工作来解决,但这可能不是你的主要问题。
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- valgrind-hellgrind与泄漏检查的结果不同
- OpenMP阵列性能较差
- 用C++20 fmt限制结果的总大小
- 如何返回一个类的两个对象相加的结果
- 使用QProcess执行命令,并将结果存储在QStringList中
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- OpenMP卸载说'fatal error: could not find accel/nvptx-none/mkoffload'
- 使用 GCC 卸载的 OpenMP 卸载失败,并出现"Ptx assembly aborted due to errors"
- Openmp结果不稳健
- 为什么这段代码(在 Matlab 的 MEX 文件中使用 OpenMP)给出不同的结果?
- C++ openmp 并行计算计算错误的结果
- 在向量上声明缩减,在 1 个线程上运行给出的结果与没有 openmp 的结果不同
- OpenMP循环结果为零
- 在与 OpenMP 并行的嵌套 for 循环中写入共享数组(通过指针)如何产生错误的结果
- OpenMP崩溃会产生错误的结果
- 在 OpenMP 中加入数组结果
- 作为OpenMP杂注结果的中间代码
- MxCalloc和MxFree与OpenMP结果双重免费或损坏
- 如何广播OpenMP单块的结果