我有使用MPI计算积分的程序。这是代码(梯形规则,通过使用trap1.h
文件中包含的外部函数):
#include <mpi.h>
#include <stdio.h>
#include <math.h>
#include "get_data.h"
#include "trap1.h"
extern double trap1(int n1, int n2, double a, double h);
extern void Get_data(int* n, int m, int d);
int main(int argc, char** argv)
{
int world_size, world_rank, i, N, N1, N2;
double Sum, GSum, A, B, h, time1, time2, x, ISum,time;
MPI_Status Status;
A=0.0;
B=1.0;
MPI_Init(NULL, NULL);
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
Get_data(&N, world_rank, world_size);
if(world_rank==0) time1=MPI_Wtime();
N1 = N*world_rank/world_size+1;
N2 = N*(world_rank+1)/world_size;
h=(B-A)/N;
Sum = trap1(N1,N2, A, h);
FILE * pFile;
if(world_rank==0) {
GSum = Sum;
for(i=1;i<world_size;i++)
{
MPI_Recv(&ISum,1, MPI_DOUBLE_PRECISION,MPI_ANY_SOURCE, 0, MPI_COMM_WORLD, &Status);
}
time2 = MPI_Wtime();
GSum=GSum/N;
time = time2-time1;
printf("Result = %et Time = %et Intervals: %dn",GSum,time,N);
FILE * pFile;
pFile = fopen ("time1_1.log","a");
fprintf (pFile, "number of procs is %it time= %ft cost = %it", world_size, time, world_size*time);
fclose(pFile);
}
else MPI_Send(&Sum, 1, MPI_DOUBLE_PRECISION, 0, 0, MPI_COMM_WORLD);
MPI_Finalize();
}
我需要获得每个流程的计算时间(即,我想计算流程i
,其中0 <= i < world_size
正在运行的时间段)。不幸的是,我所有的尝试都没有成功。如果我理解正确,我需要获得值
MPI_Wtime() - time1
其中time1
是程序初始化值,用于每个进程。但是我不明白我的代码的哪一部分这个值给出了进程的计算时间。
我已插入代码
FILE * pFile;
pFile = fopen("time0_1_1.log","a");
fprintf (pFile, "particular_time= %f\t", MPI_Wtime() - time1);
fclose(pFile);
后进入程序代码
MPI_Recv(&ISum,1, MPI_DOUBLE_PRECISION,MPI_ANY_SOURCE, 0, MPI_COMM_WORLD, &Status);
线。但我不确定我获得的时间是否是特定过程的时间。
你能帮助我吗?