使用 OpenMP 并行执行比串行执行 c++ 花费更长的时间,我计算执行时间是否正确?
Parallel exection using OpenMP takes longer than serial execution c++, am i calculating execution time in the right way?
不使用 Open MP 指令 - 串行执行 - 在此处查看屏幕截图
使用 OpenMp 指令 - 并行执行 - 在此处查看屏幕截图
#include "stdafx.h"
#include <omp.h>
#include <iostream>
#include <time.h>
using namespace std;
static long num_steps = 100000;
double step;
double pi;
int main()
{
clock_t tStart = clock();
int i;
double x, sum = 0.0;
step = 1.0 / (double)num_steps;
#pragma omp parallel for shared(sum)
for (i = 0; i < num_steps; i++)
{
x = (i + 0.5)*step;
#pragma omp critical
{
sum += 4.0 / (1.0 + x * x);
}
}
pi = step * sum;
cout << pi <<"n";
printf("Time taken: %.5fsn", (double)(clock() - tStart) / CLOCKS_PER_SEC);
getchar();
return 0;
}
我试过多次,串行执行总是更快为什么?
串行执行时间:0.0200s 并行执行时间:0.02500s
为什么这里的串行执行速度更快?我是否以正确的方式计算了执行时间?
OpenMP 在内部实现了用于并行处理的多线程,并且可以使用大量数据来测量多线程的性能。对于非常小的数据量,您无法测量多线程应用程序的性能。原因:-
a) 要创建一个线程 O/S 需要为每个线程分配内存,这需要时间(即使它是很小的位)。
b) 当你创建多线程时,它需要上下文切换,这也需要时间。
c) 需要释放分配给线程的内存,这也需要时间。
d) 这取决于机器中的处理器数量和总内存 (RAM)
因此,当您尝试使用多线程进行小型操作时,它的性能将与单个线程相同(默认情况下,O/S 为每个称为主线程的进程分配一个线程)。所以在这种情况下,你的结果是完美的。要衡量多线程架构的性能,请使用大量具有复杂操作的数据,然后只有您才能看到差异。
由于您的critical
块,您无法并行sum
求和。每当一个线程到达critical
部分时,所有其他线程都必须等待。
明智的方法是为每个线程创建一个临时的 sum 副本,该副本可以在不同步的情况下求和,然后对不同线程的结果求和。 Openmp 可以使用reduction
子句自动执行此操作。所以你的循环将被更改为。
#pragma omp parallel for reduction(+:sum)
for (i = 0; i < num_steps; i++)
{
x = (i + 0.5)*step;
sum += 4.0 / (1.0 + x * x);
}
在我的机器上,这比使用critical
块的版本快 10 倍(我还增加了num_steps以减少线程创建等一次性操作的影响)。
PS:我建议您使用<chrono>
,<boost/timer/timer.hpp>
或google benchmark
来计时代码。
- 如何计算Big-O表示法中的平均渐近运行时间
- 通过字符串来计算长度需要更长的时间,而不是移动字符串几次?
- 如何计算此排序函数的时间复杂度?
- 计算两个代码块的时间复杂度
- 如何使用发送数据包所花费的时间计算两个节点之间的距离?
- 如何计算函数的时间复杂度?
- 标准::映射::合并的计算时间复杂度
- 从ubuntu上的utc时间计算unix时间
- 为什么这个经过的时间(帧时间)计算会锁定我的游戏
- 计算C++军事时间的时差
- 以小于一毫秒的精度计算时间的功能
- 如何在长时间计算中进行C 的一次进度更新
- Qt C++ "keine Rückmeldung" - 长时间计算期间 GUI 中的错误
- 设置具有非constexpr函数的constexpr变量(但可以在编译时间计算)
- 需要为延迟时间计算编写算法
- int64 时间计算(C++)
- C++如何进行长时间计算
- 在编译时间计算中使用GMP
- 使用 Unix 程序时间计算每次迭代的程序运行时间
- 根据 SCTE 35 消息中的 pts 时间计算拼接事件的时间