c++ - 如何让 GNU GCC 类似地优化 OpenMP 线程

标签 c++ multithreading gcc openmp gcc4.9

这是我在这里的第一篇文章。好极了!回到问题:

我正在学习如何使用 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 的“默认”。我不熟悉编译器差异。

提供的输出来自“发布”构建,它添加了“-O2”参数。

“-O”、“-O1”和“-O3”参数都不会产生“101”。

你可以试试我的 .exe 来自 dropbox (zip file, also contains possibly required dlls) .

最佳答案

发生这种情况是因为 float 或 double 数据类型不能表示某些数字,如 20.2

#include <iostream>
int main()
{
    std::cout.precision(17);
    double a=20.2;
    std::cout << a << std::endl;
    return 0;
}

它的输出将是

20.199999999999999

有关此的更多信息,请参阅 Unexpected Output when adding two float numbers

不知道为什么第一个线程不会发生这种情况,但如果您删除 openMP,那么您也会得到相同的结果。

关于c++ - 如何让 GNU GCC 类似地优化 OpenMP 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35724135/

相关文章:

c++ - 与继承的函数混淆

c# - 在共享相同方法的多个线程中使用 Random

multithreading - 如何解决这个特定的线程问题

c - 如何获取 `gcc` 以从标准 C 为 x86-64 生成 `bts` 指令?

c++ - 使用 Eigen 的插件在第二次运行时崩溃

c++ - 从 C++ 中的二进制文件顺序读取结构

c++ - 无法将文件读入 vector

java - JNI 环境指针

java - 我是否以正确的方式使用可调用和 future 多线程(java)?

c - 相当于 LD_PRELOAD 的 gcc 标志?