gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:38:17 25 4
gpt4 key购买 nike

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

我正在学习如何使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com