2

OpenMPを使用するクアッドコアシステムで4つのスレッドを使用するとスピードアップの問題が発生します。2スレッドの場合、効率は1に近くなりますが、4スレッドの場合は半分に減少します。つまり、実行時間は2スレッドを使用してコードを実行する場合とほぼ同じです。OpenMPフォーラムで検索したところ、インテルターボブーストテクノロジーが原因である同様の問題が見つかりました。この投稿を参照してくださいhttp://openmp.org/forum/viewtopic.php?f=3&t=1289&start=0&hilit=intel+turbo+boost

だから私は私のマシンの4つのプロセッサすべてでターボブーストを無効にしようとしましたが、問題を取り除くことができませんでした。

上記のリンクからのみベンチマークコードを取得しました。

DELLラップトップを持っていますが、ハードウェア/OS情報の概要は次のとおりです。

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);


}
4

1 に答える 1

5

Core i7-2620Mは、HT を備えたデュアルコア (したがって 4 つの論理コア) です。HT は常にプログラムのパフォーマンスを改善するとは限りません。改善はプログラム自体に大きく依存します (一部のメモリ集約型アプリでは、パフォーマンスが低下することさえあります)。物理コアが 4 つないため、4 倍のスピードアップは期待できません。

時間があれば、ここから少し読む価値があります: http://software.intel.com/en-us/articles/performance-insights-to-intel-hyper-threading-technology/

于 2012-09-14T11:48:39.230 に答える