我希望循环下面代码的主要部分,然后计算从循环中收集的结果的平均值
这是代码:
class PingPongVariousLengths {
static public void main(String[] args) {
MPI.Init(args);
int myrank = MPI.COMM_WORLD.Rank();
int tag = 99;
int maxlen = 104857600; //200 megabytes 104857600 characters * 2 bytes per character = 209715200 bytes total, or 200 megabytes
int minlen = 1; // 2 bytes
char [] sendbuff = new char [maxlen];
char [] recvbuff = new char [maxlen];
long speedKbps;
long speedMbps;
if (myrank == 0) {
for (int len = minlen; len <= maxlen; len *= 2) { //len=*2 doubles the ping size each time
long startTime = System.nanoTime();
MPI.COMM_WORLD.Send(sendbuff, 0, len, MPI.CHAR, 1, tag);
MPI.COMM_WORLD.Recv(recvbuff, 0, len, MPI.CHAR, 1, tag);
long endTime = System.nanoTime();
long duration = endTime - startTime;
long durationseconds = (duration * 10-9); // Converts nanoseconds to seconds
System.out.println("Time for the ping to be sent and recived of " + (len*2) + " bytes is " + durationseconds + " seconds"); // multiples by 2 becuase 1 character is 2 bytes
//double transferRate = ((len*2.0) / durationseconds ) ; //amount of data in bytes transferred in 1 second. Currently returning 0 for every result
//System.out.println("transferRate: " + transferRate + " bytes per second");
double transferRateMb = ((len*524288.0) / durationseconds ) ; //amount of data in megabytes transferred in 1 second.
System.out.println("transferRate (megabytes) : " + transferRateMb + " megabytes per second");
}
} else if (myrank == 1) {
for (int len = minlen; len <= maxlen; len *= 2) {
MPI.COMM_WORLD.Recv(recvbuff, 0, len, MPI.CHAR, 0, tag);
MPI.COMM_WORLD.Send(recvbuff, 0, len, MPI.CHAR, 0, tag);
}
}
MPI.Finalize();
}
}
我试图循环它说10或20次,来自
的代码 for (int len = minlen; len <= maxlen; len *= 2) { //len=*2 doubles the ping size each time
到
long durationseconds = (duration * 10-9); // Converts nanoseconds to seconds
我希望运行20次,然后duration
的结果平均超过10或20
我怎样才能最好,最有效地解决这个问题
答案 0 :(得分:1)
如果我理解正确,你想要每个长度增量的平均持续时间秒。为了获得持续时间的平均值,您需要将长度循环移动到平均循环之外。请参阅下面的代码段。
long durationseconds;
int MAX_LOOPS = 20;
for (int len = minlen; len <= maxlen; len *= 2) {
if (myrank == 0) {
durationseconds = 0;
for (int i = 0; i < MAX_LOOPS; i++) {
long startTime = System.nanoTime();
MPI.COMM_WORLD.Send(sendbuff, 0, len, MPI.CHAR, 1, tag);
MPI.COMM_WORLD.Recv(recvbuff, 0, len, MPI.CHAR, 1, tag);
long endTime = System.nanoTime();
long duration = endTime - startTime;
durationseconds = durationseconds + (duration * 10-9);
}
durationseconds = durationseconds / MAX_LOOPS;
System.out.println("Average time for the ping to be sent and recived of " + (len*2) + " bytes is " + durationseconds + " seconds");
double transferRateMb = ((len*524288.0) / durationseconds );
System.out.println("average transferRate (megabytes) : " + transferRateMb + " megabytes per second");
} else if (myrank == 1) {
MPI.COMM_WORLD.Recv(recvbuff, 0, len, MPI.CHAR, 0, tag);
MPI.COMM_WORLD.Send(recvbuff, 0, len, MPI.CHAR, 0, tag);
}
}
答案 1 :(得分:0)
long totalDuration = 0;
for (int i = 0; i<nTimes;i++){
... //Code N stuff here
totalDuration += duration;
}
long avgDuration = totalTime /nTimes;