【问题标题】:Speed up issues with 4 threads on quadcore system using OpenMP使用 OpenMP 在四核系统上加速 4 线程问题
【发布时间】:2012-09-14 11:46:14
【问题描述】:

我在使用 OpenMP 的四核系统上使用 4 个线程时遇到了加速问题。使用 2 个线程,效率接近 1,但使用 4 个线程,效率降低到一半,即运行时间与使用 2 个线程运行代码时大致相同。我在 OpenMP 论坛上搜索过,之前发现类似的问题是因为 Inter turbo boost 技术。请参考此帖http://openmp.org/forum/viewtopic.php?f=3&t=1289&start=0&hilit=intel+turbo+boost

所以我尝试在我的机器的所有 4 个处理器上禁用涡轮增压,但无法解决这个问题。

我只从上面的链接中获取了基准代码。

我有一台戴尔笔记本电脑,我的硬件/操作系统信息摘要如下:

OS : Linux3.0.0.12-generic , Ubuntu
KDE SC Version : 4.7.1

Processor: Intel(R) Core(TM) i7-2620M CPU @ 2.70GHz

请让我知道还有哪些其他可能的问题导致我无法使用 4 个线程/内核进行加速。作为附加信息。我检查了所有 4 个线程都在不同的内核上运行。

期待您的回答。

代码:

#include <stdio.h>
#include <omp.h>
#include <math.h>


double estimate_pi(double radius, int nsteps){

   int i;
   double h=2*radius/nsteps;
   double sum=0;
   for (i=1;i<nsteps;i++){
      sum+=sqrt(pow(radius,2)-pow(-radius+i*h,2));
      //sum+=.5*sum;
   }
   sum*=h;
   sum=2*sum/(radius*radius);
   //printf("radius:%f --> %f\n",radius,sum);
   return sum;


}

int main(int argc, char* argv[]){


   double ser_est,par_est;
   long int radii_range;
   if (argc>1) radii_range=atoi(argv[1]);
   else radii_range=500;   

   int nthreads;
   if (argc>2) nthreads=atoi(argv[2]);
   else nthreads=omp_get_num_procs();

   printf("Estimating Pi by averaging %ld estimates.\n",radii_range);
   printf("OpenMP says there are %d processors available.\n",omp_get_num_procs());

   int r;
   double start, stop, serial_time, par_time;



   par_est=0;
   double tmp=0;
   ser_est=0;
   start=omp_get_wtime();
   for (r=1;r<=radii_range;r++){
      tmp=estimate_pi(r,1e6);
      ser_est+=tmp;
   }
   stop=omp_get_wtime();
   serial_time=stop-start;
   ser_est=ser_est/radii_range;

   omp_set_num_threads(nthreads);
   start=omp_get_wtime();
   #pragma omp parallel for private(r,tmp) reduction(+:par_est)
   for (r=1;r<=radii_range;r++){
      tmp=estimate_pi(r,1e6);
      par_est+=tmp;
   }
   stop=omp_get_wtime();
   par_time=stop-start;
   par_est=par_est/radii_range;

   printf("Serial Estimate: %f\nParallel Estimate:%f\n\n",ser_est,par_est);
   printf("Serial Time: %f\nParallel Time:%f\nNumber of Threads: %d\nSpeedup: %f\nEfficiency: %f\n",serial_time,par_time,nthreads,serial_time/par_time, serial_time/par_time/nthreads);


}

【问题讨论】:

  • @KillianDS:我从这里的论坛帖子中复制了他的代码。
  • @Tudor:我的印象是这是一个旧论坛帖子,而不是这里 OP 的实际代码。
  • @KillianDS:嗯,我现在知道是 2011 年的了。但是他为什么要引用它呢?
  • @Tudor:实际上我只是在寻找解决问题的方法。然后我发现这篇文章的基准代码比我的更好,所以我给了代码的参考一个帖子..非常感谢您的回答..我不知道我的机器是带 HT 的双核..跨度>

标签: c++ multithreading openmp


【解决方案1】:

Core i7-2620M 是具有 HT 的双核(因此有 4 个逻辑核)。 HT 并不总能提高程序性能,而且改进很大程度上取决于程序本身(对于一些内存密集型应用程序,它甚至可能会降级)。您绝对不应该期望 4 倍的加速,因为它没有 4 个物理内核。

如果您有时间,不妨从这里读一读:http://software.intel.com/en-us/articles/performance-insights-to-intel-hyper-threading-technology/

【讨论】:

  • 因此,与 i7 的 2 线程相比,4 线程不会降低性能。 6个线程呢?会减少吗?
  • @tuğrulbüyükışık:使用 6 个线程,您已经超过了并发线程的数量,尽管 2 个额外的线程可能不足以降低性能。同样,这在很大程度上取决于应用程序。
  • @Tudor:实际上,HT 可以让内存密集型应用程序更快,而非内存密集型应用程序使用 HT 可能会慢一些。
  • @ronag:如果总线上的争用过多,肯定会影响性能。
  • @Tudor:什么?您为此类评论提供了更多背景信息。当应用程序线程经常停滞时,HT 会更快,这可能是由于缓存未命中(内存密集型)或分支预测错误造成的。
猜你喜欢
  • 1970-01-01
  • 2010-12-29
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 2016-04-23
  • 1970-01-01
  • 2013-07-01
  • 2010-09-11
相关资源
最近更新 更多