#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; }