OpenMPで遊んでみた

例のCore i7マシンで並列プログラミングして遊んでみた。使ったのはicc内蔵のopenmp

Leibnitzの公式 ( pi/4 = 1 – 1/3 + 1/5 – 1/7 …)

ソースはこんな感じ

#include<stdio.h>

#define imax 2000000000

int main(int argc, char* argv[])
{
  long i;
  double sum1=0,sum2=0;
#pragma omp parallel for reduction(+:sum1)
    for(i=1;i<=imax;i+=4){
      sum1+=1./i;
    }
#pragma omp parallel for reduction(+:sum2)
    for(i=3;i<=imax;i+=4){
      sum2+=1./i;
    }
  printf("%lf\n",sum1-sum2);
}
OpenMP無効 (-O3)
real    0m3.966s
user    0m3.964s
sys     0m0.000s
OpenMP有効 (-O3 -openmp -openmp-report2)
real    0m1.204s
user    0m7.620s
sys     0m0.036s

大体4倍くらい高速化されている

Julia集合 (zn+1=zn2+c が発散しない点)を求めるプログラム

ソースはこんな感じ

#include<stdio.h>

#define M 500
#define N 250000
#define T 50000
#define cre 0.2
#define cim 0.1

#include<stdio.h>

#define M 500
#define N 250000
#define T 50000
#define cre 0.2
#define cim 0.1

int main(int argc, char* argv[])
{
  long i,j;
  long n;
  long t;
  double x0[N],y0[N],x1,y1,x2,y2;
  for(i=0;i<M;i++)
    for(j=0;j<M;j++){
      n=i*M+j;
      x0[n]=-1+2*(double)j/M;
      y0[n]=-1+2*(double)i/M;
    }

#pragma omp parallel private(x1,y1,x2,y2) shared(x0,y0)
  {
#pragma omp for nowait
    for(n=0;n<N;n++){
      x1=x0[n];
      y1=y0[n];
      for(t=0;t<T;t++){
        x2=x1*x1-y1*y1+cre;
        y2=2*x1*y1+cim;
        x1=x2;
        y1=y2;
        if(x1*x1+y1*y1>1000.){
          printf("%lf %lf\n", x0, y0);
          break;
        }
      }
    }
  }
}
OpenMP無効 (-O3)
real    0m44.650s
user    0m44.647s
sys     0m0.004s
OpenMP有効 (-O3 -openmp -openmp-report2)
real    0m7.610s
user    0m53.683s
sys     0m0.052s

大体6倍くらい高速化されている。

これがそのときのtopの画面。確かに8つ全てを使い切っている

広告
カテゴリー: Linux. OpenMPで遊んでみた はコメントを受け付けていません。
%d人のブロガーが「いいね」をつけました。