【发布时间】:2023-03-09 10:31:01
【问题描述】:
我是 OpenMP 的新手,现在我正在研究 atomic 的用法。每次跑步我都有不同的结果和时间。有时大约一分钟,有时大约 19 秒。
下面是我的代码:
#include <iostream>
#include<iomanip>
#include<cmath>
#include<omp.h>
#include"KiTimer.h"
int main()
{
using namespace std;
const int NUM_REPEAT = 100000000;
KiTimer timer;
timer.MakeTimer(0, "ADD");
timer.Start();
double sum = 0., x = 0.;
#pragma omp parallel
{
#pragma omp single
cout << "Thread num:" << omp_get_num_threads() << endl;
#pragma omp for private(x)
for (int i = 0; i < NUM_REPEAT; i++) {
x = sqrt(i);
#pragma omp atomic
sum += x;
}
}
cout << setprecision(20) << "total:" << sum << endl;
timer.Stop();
timer.Print();
return 0;
}
以下是三个不同测试运行的结果:
- 第一个结果:
- 第二个结果:
- 第三个结果:
【问题讨论】:
-
浮点加法有精度损失。
-
不要使用原子。您的 for 循环应标记为
reduction(+:sum)。 -
好的,谢谢。我想我明白了。
-
您可以将运行结果包含为文本(在代码块中),而不是文本的屏幕截图。
-
好的,我接下来改进