繁体   English   中英

使用OpenMP进行并行执行需要比串行执行c ++更长的时间,我是否以正确的方式计算执行时间?

[英]Parallel exection using OpenMP takes longer than serial execution c++, am i calculating execution time in the right way?

不使用Open MP Directives - 串行执行 - 请在此处查看屏幕截图

使用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: %.5fs\n", (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><boost/timer/timer.hpp>google benchmark来计时代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM