首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ubuntu中的OpenMP :并行程序在双核处理器上运行速度比单线程慢两倍。为什么?

Ubuntu中的OpenMP :并行程序在双核处理器上运行速度比单线程慢两倍。为什么?
EN

Stack Overflow用户
提问于 2011-08-08 19:48:37
回答 4查看 1.6K关注 0票数 0

我从wikipedia得到代码

代码语言:javascript
复制
#include <stdio.h>
#include <omp.h>

#define N 100

int main(int argc, char *argv[])
{
  float a[N], b[N], c[N];
  int i;
  omp_set_dynamic(0);
  omp_set_num_threads(10); 


  for (i = 0; i < N; i++)
  {
      a[i] = i * 1.0;
      b[i] = i * 2.0;
  }

#pragma omp parallel shared(a, b, c) private(i)
  {
#pragma omp for
    for (i = 0; i < N; i++)
      c[i] = a[i] + b[i];
  }
  printf ("%f\n", c[10]);
  return 0;
}

我试着用gcc4.5在我的ubuntu11.04上编译并运行它(我的配置:英特尔C2D T7500M 2.2 than,2048Mb内存),这个程序的运行速度比单线程慢两倍。为什么?

EN

回答 4

Stack Overflow用户

发布于 2011-08-09 04:16:59

非常简单的答案:增加N,并将线程的数量设置为您拥有的处理器数量。

对于您的机器,100是一个非常低的数字。尝试更高的几个数量级。

另一个问题是:如何测量计算时间?通常,程序需要花费一些时间才能得到可比较的结果。

票数 1
EN

Stack Overflow用户

发布于 2011-08-08 20:34:44

我认为编译器在非smp的情况下优化了for循环(使用SSE指令,例如)而在OMP变体中则不能。

使用gcc -S (或objdump -S)查看不同变体的程序集。

无论如何,您可能需要注意共享变量,因为它们需要同步,这会使速度变得非常慢。如果你能“智能”分块(看看调度杂注),你可能会减少争用,但是再一次:

  • 验证发出的code
  • profile
  • don't低估了单线程代码的效率(因为缓存位置和缺少上下文切换)
  • 将线程数量设置为CPU数量(让openMP为您决定!);除非您的线程团队有一个具有专用任务的主线程,在这种情况下,分配一个额外的线程

可能是有价值的

在我尝试应用OMP进行并行化的所有情况下,大约70%的情况下速度较慢。在某些情况下,确实可以提高速度

  • coarse-grained parallellism (您的示例位于频谱的细粒度一端)
  • no shared data
票数 0
EN

Stack Overflow用户

发布于 2013-06-05 14:04:31

你面临的问题是错误的内存共享。每个线程都应该有自己的私有ci。

试试这个:#杂注omp并行共享(a,b)私有(i,c)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6981643

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档