#author("2019-06-05T10:05:15+00:00","","")
#author("2019-11-14T08:37:02+00:00","","")
[[横井]]
#ref(seito.docx,,生徒側テキスト)

http://www.cenav.org/raspi2a/

↑で構築now

/* mpicc pix_graph.c -o ./pix_graph -lm -lX11 -L/usr/X11/lib -I/usr/X11R6/include */

#include "mpi.h"
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

#define  NUM_MAX  100000000
#define  PI 3.141592653589793

typedef struct
{
  double x;
  double y;
}POINT;

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

  POINT p;
  double r, pi, s, e;
  int cnt, total_cnt, i, rank, size, local_cnt, start, end, sendbuf, recvbuf;


  MPI_Init(&argc, &argv); /* MPI 初期化 (プロセス数、プロセスのランク(番号)等の取得)*/
  MPI_Comm_size(MPI_COMM_WORLD, &size);
  MPI_Comm_rank(MPI_COMM_WORLD, &rank);

  s=MPI_Wtime();

  local_cnt=(int)((double)NUM_MAX/(double)size);

  start=rank*local_cnt;
  end=(rank+1)*local_cnt;

  srand((unsigned int)time(NULL)*(rank+1));
  cnt = 0;

  for (i = start; i < end-start; i++){ /* ランダムに点をうつ*/
    p.x = (double)rand() / (double)RAND_MAX;
    p.y = (double)rand() / (double)RAND_MAX;

    r = sqrt(p.x * p.x + p.y * p.y);

    if ( r < 1.0 ){
      cnt++;
    }
  }

  sendbuf = cnt;
  recvbuf = 0;

  MPI_Allreduce(&sendbuf, &recvbuf, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD);
  total_cnt =recvbuf;

  pi = 4.0 * (double)total_cnt / (double)NUM_MAX;

  if(rank==0){
    printf("pi: %18.16lf, Error: %18.16lf \n",pi, fabs(pi-PI));
    e=MPI_Wtime();
    printf("時間 = %f[s]\n",e-s);
  }

  MPI_Finalize();

  return 0;
}


トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS