【发布时间】:2016-03-01 13:23:23
【问题描述】:
这是我在这里的第一篇文章。耶!回到问题:
我正在学习如何使用 OpenMP。我的 IDE 是 Code::Blocks。我想改进我的一些旧程序。我需要确保结果将完全相同。看来“for”循环在主线程中的优化方式与在其他线程中不同。
示例:
#include <iostream>
#include <omp.h>
int main()
{
std::cout.precision(17);
#pragma omp parallel for schedule(static, 1) ordered
for(int i=0; i<4; i++)
{
double sum = 0.;
for(int j=0; j<10; j++)
{
sum += 10.1;
}
#pragma omp ordered
std::cout << "thread " << omp_get_thread_num() << " says " << sum << "\n";
}
return 0;
}
生产
thread 0 says 101
thread 1 says 100.99999999999998579
thread 2 says 100.99999999999998579
thread 3 says 100.99999999999998579
我能否以某种方式确保所有线程都收到与我的单线程程序(未使用 OpenMP)收到的相同的优化?
编辑:
编译器是“来自 TDM-GCC(版本 4.9.2,32 位,SJLJ)的编译器和 GDB 调试器”,不管是什么意思。这是 IDE 的“默认值”。我不熟悉编译器的差异。
提供的输出来自“Release”构建,它添加了“-O2”参数。
“-O”、“-O1”和“-O3”参数都不会产生“101”。
你可以从dropbox (zip file, also contains possibly required dlls)试试我的.exe。
【问题讨论】:
-
您能提供更多信息吗?您使用的是哪个编译器?例如,如果我使用 gcc 4.8.x,我会得到:线程 X 表示所有线程的 100.99999999999999。话虽如此,大多数 OpenMP 运行时只是为循环体创建一个新的概述例程,并且每个线程都执行相同的例程。
-
gcc 4.9 和 5.3 的同义词
-
完成。你也在使用“发布”版本吗?
-
@Gilles 是同一个 IDE 吗?因为 Code::Blocks 在构建过程中添加了额外的参数,比如“-O2”。
-
我尝试在 32 和 64b 模式下使用 gcc 4.9.3 和 gcc 5.3.0,并进行了各种优化:我总是让所有线程打印相同的输出,这是大多数时候“100.99999999999999”。 只有在 32b 模式下使用 -O2 时,我会得到“101”,但对于所有线程,所以没有差异,即使在这里......
标签: c++ multithreading gcc openmp gcc4.9