我一直在使用并行算法中的时间测量(基准测试),更具体的矩阵乘法。我正在使用以下算法:
if(taskid==MASTER) {
averow = NRA/numworkers;
extra = NRA%numworkers;
offset = 0;
mtype = FROM_MASTER;
for (dest=1; dest<=numworkers; dest++)
{
rows = (dest <= extra) ? averow+1 : averow;
MPI_Send(&offset, 1, MPI_INT, dest, mtype, MPI_COMM_WORLD);
MPI_Send(&rows, 1, MPI_INT, dest, mtype, MPI_COMM_WORLD);
MPI_Send(&a[offset][0], rows*NCA, MPI_DOUBLE, dest, mtype,MPI_COMM_WORLD);
MPI_Send(&b, NCA*NCB, MPI_DOUBLE, dest, mtype, MPI_COMM_WORLD);
offset = offset + rows;
}
mtype = FROM_WORKER;
for (i=1; i<=numworkers; i++)
{
source = i;
MPI_Recv(&offset, 1, MPI_INT, source, mtype, MPI_COMM_WORLD, &status);
MPI_Recv(&rows, 1, MPI_INT, source, mtype, MPI_COMM_WORLD, &status);
MPI_Recv(&c[offset][0], rows*NCB, MPI_DOUBLE, source, mtype,
MPI_COMM_WORLD, &status);
printf("Resultados recebidos do processo %d\n",source);
}
}
else {
mtype = FROM_MASTER;
MPI_Recv(&offset, 1, MPI_INT, MASTER, mtype, MPI_COMM_WORLD, &status);
MPI_Recv(&rows, 1, MPI_INT, MASTER, mtype, MPI_COMM_WORLD, &status);
MPI_Recv(&a, rows*NCA, MPI_DOUBLE, MASTER, mtype, MPI_COMM_WORLD, &status);
MPI_Recv(&b, NCA*NCB, MPI_DOUBLE, MASTER, mtype, MPI_COMM_WORLD, &status);
for (k=0; k<NCB; k++)
for (i=0; i<rows; i++)
{
c[i][k] = 0.0;
for (j=0; j<NCA; j++)
c[i][k] = c[i][k] + a[i][j] * b[j][k];
}
mtype = FROM_WORKER;
MPI_Send(&offset, 1, MPI_INT, MASTER, mtype, MPI_COMM_WORLD);
MPI_Send(&rows, 1, MPI_INT, MASTER, mtype, MPI_COMM_WORLD);
MPI_Send(&c, rows*NCB, MPI_DOUBLE, MASTER, mtype, MPI_COMM_WORLD);
}
我注意到,对于方形矩阵,它比矩形矩阵花费的时间更少。 例如:如果我使用4个节点(一个作为主节点),A是500x500,B是500x500,则每个节点的迭代次数等于4150万,而如果A是2400000x6而B是6x6,则每个节点迭代2880万次。虽然第二种情况需要较少的迭代次数,但它需要大约1.00秒,而第一种情况只需要大约0.46秒。
逻辑上,第二个应该更快,因为它每个节点的迭代次数更少。 做一些数学计算,我意识到MPI在第一个案例中每个消息发送和接收83,000个元素,在第二个案例上发送和接收4,800,000个元素。
消息的大小是否证明了延迟?
答案 0 :(得分:1)
通过MPI发送的消息大小肯定会影响性能 你的代码看一下流行的MPI中发布的THESE图表 实施的网页。
正如您在第一张图中所看到的,通信延迟会增加 消息大小。此趋势适用于任何网络,而不仅仅适用于InfiniBand 如图中所示。