删除多余的并行语句时的不同程序行为
Different program behavior when removing superfluous parallel statement
我只是在尝试在较低的代码中查找数据竞赛时被卡住了:
#pragma omp parallel
{
#pragma omp for
for(i=0; i<m; i++) {
y[i]=0;
for(j=0; j<n; j++){
y[i]=y[i]+A[i][j]*x[j];
}
}
}
我对y得到了不同的结果。奇怪的是,当在for
:前面添加parallel
时,一切似乎都很好
#pragma omp parallel for
我认为这个关键字在这里是多余的,因为已经有一个并行块了。为什么程序在删除关键字时表现不同?
如果您使并行块嵌套在并行块中,则如果您不激活"嵌套并行性",则它将被忽略omp_set_nested(1);
所以使用#pragma omp parallel for
,您的代码将使用所有线程执行,并且所有线程执行相同的计算。
如果在并行块中生成#pragma omp for
,则不会忽略它。
在内部for
循环中,y[i]
的值在并行执行中发生变化,同时用作目标和源。
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- C++,系统无法执行指定的程序
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 重载操作程序时出错>>用于类中的字符串 memebr
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 试图在visual studio上用C++创建一个桌面应用程序
- 模板元程序查找相似的连续类型名称
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- 如何通过cpp程序运行shell脚本
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- IPC使用多个管道和分支进程来运行Python程序
- 如何将c++程序的一些输出传递给shell,以便在shell中使用
- 使用C++程序合并排序没有得到正确的输出
- 基于boost的程序的静态链接——zlib问题
- 程序崩溃并显示"std::out_of_range"错误
- Arm GNU编译器:通过多余的强制转换优化的三进制生成的程序集
- 删除多余的并行语句时的不同程序行为
- 从字符串中删除多余空格的程序