首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这个OpenMP程序比单线程慢?

为什么这个OpenMP程序比单线程慢?
EN

Stack Overflow用户
提问于 2011-07-12 21:34:17
回答 4查看 5.8K关注 0票数 4

请看这段代码。

单线程程序:http://pastebin.com/KAx4RmSJ.编撰:

g++ -lrt -O2 main.cpp -o nnlv2

用openMP编译的多线程:用:

g++ -lrt -fopenmp -O2 main_openmp.cpp -o nnlv2_openmp

我在双核系统上测试了它(因此我们有两个线程并行运行)。但是多线程版本比单线程版本慢(并且显示不稳定的时间,尝试运行它几次)。怎么了?我在哪里搞错了?

一些测试:

单线程:

代码语言:javascript
复制
Layers Neurons Inputs --- Time (ns)

10 200 200 --- 1898983

10 500 500 --- 11009094

10 1000 1000 --- 48116913

多线程:

代码语言:javascript
复制
Layers Neurons Inputs --- Time (ns)

10 200 200 --- 2518262

10 500 500 --- 13861504

10 1000 1000 --- 53446849

我不明白是怎么回事。

EN

回答 4

Stack Overflow用户

发布于 2011-07-13 00:27:15

你的目标是学习OpenMP,还是让你的程序更快?如果采用后一种方法,那么编写乘法添加代码、减少传递次数和合并SIMD就更有价值了。

步骤1:合并循环并使用乘法添加:

代码语言:javascript
复制
// remove the variable 'temp' completely
for(int i=0;i<LAYERS;i++)
{
  for(int j=0;j<NEURONS;j++)
  {
    outputs[j] = 0;

    for(int k=0,l=0;l<INPUTS;l++,k++)
    {
      outputs[j] += inputs[l] * weights[i][k];
    }

    outputs[j] = sigmoid(outputs[j]);
  }

  std::swap(inputs, outputs);
}
票数 2
EN

Stack Overflow用户

发布于 2011-07-20 04:43:37

使用-static和-p编译,然后运行并使用gprof解析gmon.out:

45.65% gomp_barrier_wait_end

在opemmp的障碍程序中有很多时间。这是等待其他线程完成的时间。由于您多次运行并行for循环(层),因此您失去了并行运行的优势,因为每次完成并行for循环时,都会有一个隐式屏障调用,直到所有其他线程完成时才会返回。

票数 2
EN

Stack Overflow用户

发布于 2011-07-12 23:57:28

在此之前,在多线程配置上运行测试,并确保procexp或任务管理器将显示100%的CPU使用率。如果没有,那么您就不使用多个线程或多个处理器核心。

此外,摘自wiki:

环境变量

一种改变OpenMP应用程序的执行特性的方法。用于控制循环迭代调度、默认线程数等。例如,螺纹用于指定应用程序的线程数。

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

https://stackoverflow.com/questions/6671448

复制
相关文章

相似问题

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