#include
#include "mpi.h"
double integrand(double x);
/*
この積分を台形則を使って計算する。
/ 1
| 4
| -------- dx = 3.141592653589793238462643383279502884197...
| 2
/ 0 1 + x
*/
int main(int argc, char *argv[])
{
int Nproc, myID, Ninterval, myNinterval, i;
double integral, myintegral=0.0, x, deltax, lowerx=0.0, upperx=1.0, mylowerx;
/*
Nproc: 使うCPUの個数。
myID : 自分の番号。myID=0, 1, 2, ..., Nproc-1.
Ninterval: 積分範囲0--1を Ninterval 個にわける。
myNinterval: Ninterval のうち、各CPUが計算する個数。
*/
/* MPIの準備 */
MPI_Init(&argc,&argv); /* MPIの初期化 */
MPI_Comm_size(MPI_COMM_WORLD, &Nproc); /* CPUの個数を知る */
MPI_Comm_rank(MPI_COMM_WORLD, &myID); /* 自分の番号を知る */
/* Ninterval を入力 */
if(myID == 0) { /* 0番の CPU から Ninterval を入力 */
printf("The number of intervals? (Must be a multiple of %d): ",Nproc);
scanf("%d", &Ninterval);
}
MPI_Bcast(&Ninterval, 1, MPI_INT, 0, MPI_COMM_WORLD);
/* 入力された Ninterval の値を他のCPUに教える */
/* 積分の準備 */
myNinterval = Ninterval / Nproc;
deltax = (upperx - lowerx) / Ninterval;
mylowerx = lowerx + (upperx - lowerx)/Nproc * myID;
/* 積分の実行 */
for(i = 1; i <= myNinterval; i++) {
x = mylowerx + deltax * (i - 0.5);
myintegral += deltax * integrand(x);
}
MPI_Reduce(&myintegral, &integral, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);
/* 各CPUの計算した部分を合計する */
/* 結果の出力 */
if(myID == 0) printf("The integral is approximately %.16f.\n", integral);
/* MPIの終了 */
MPI_Finalize();
}
double integrand(double x)
{return 4.0 / (1.0 + x * x);}
プログラム
前のスライド | 次のスライド | 最初のスライドに戻る | グラフィックスの表示 |