我希望循环下面代码的主要部分,然后计算从循环中收集的结果的平均值
代码如下:
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
我怎样才能最好地、最有效率地去做这件事呢?
发布于 2013-04-14 07:10:08
如果我没理解错的话,您希望每个长度增量的平均持续时间为秒。为了获得持续时间秒的平均值,您需要将长度循环移到平均循环之外。请参阅下面的代码片段。
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);
}
}发布于 2013-04-14 06:51:21
long totalDuration = 0;
for (int i = 0; i<nTimes;i++){
... //Code N stuff here
totalDuration += duration;
}
long avgDuration = totalTime /nTimes;https://stackoverflow.com/questions/15993769
复制相似问题