为什么这段代码(在 Matlab 的 MEX 文件中使用 OpenMP)给出不同的结果?
Why this code (with OpenMP in MEX-file of Matlab) give different results?
我正在使用OpenMP为Matlab构建MEX文件。我发现我的代码在使用 OpenMP 进行加速时给出了不同的结果。我做了一个简单的例子,如下所示。它假设计算每个向量的平均值。每个向量中的每个元素都是 1。所以结果应该是 1 的数组。但结果有时会有其他数字,例如 0.333、0.666 或 0。我认为它一定与 OpenMP for 循环有关。但是我想不通。任何建议或想法将不胜感激。
#include "mex.h"
#include <vector>
#include <iostream>
#include <algorithm>
#include <numeric>
#include <omp.h>
using namespace std;
void mexFunction(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[])
{
int xx=8;
int yy[]={2,3,4,5,6,7,8,9};
vector<vector<double>> data(xx);
vector<double>mean0(xx);
int i,ii;
#pragma omp parallel
{
#pragma omp for
for (i = 0; i < xx; i++) {
data[i].resize(yy[i]);
for (ii = 0; ii < yy[i]; ii++) {
data[i][ii]=1;
}
mean0[i] =accumulate( data[i].begin(), data[i].end(), 0.0)/data[i].size();
}
}
// output
plhs[0] = mxCreateDoubleMatrix(mean0.size(), 1, mxREAL);
copy(mean0.begin(), mean0.end(), mxGetPr(plhs[0]));
return;
}
您已在parallel
部分之前声明了int i,ii;
。这会导致共享这些变量。
您正在使用C++,在首次初始化变量的位置声明变量。在循环变量的情况下,这看起来像这样:
for (int i = 0; i < xx; i++) {
data[i].resize(yy[i]);
for (int ii = 0; ii < yy[i]; ii++) {
data[i][ii]=1;
}
mean0[i] = ...
}
这提高了代码的可读性,并解决了 OpenMP 的问题。
顺便说一下,上面的循环也可以通过一次调用来编写std::fill
。
相关文章:
- 为什么"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单块的结果