这是我在此的头一篇博文。耶!回到问题:
我正在学习如何使用 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”。
你可以试试我的 .exe 来自dropbox(zip 文件,还包含可能需要的 dll)。