我想在多个进程之间同时传输数据,我知道如何做到这一点,但也许我看不到隐藏的陷阱。
在下面的MPI示例中,我有6个进程(编号从0到5),我想发送一个MPI_DOUBLE值,从0到1,从2到3,从4到5。 显然没有重叠,所以应该可以同时(同时)进行所有三次传输吗?我不希望其他4个进程等到0和1在2到3次启动之前完成,依此类推。 这是我的示例解决方案:
int rankid; // 0,..,5
double sendb, recvb;
if (rankid%6 == 0) { // processes 0,2,4
MPI_Send(&sendb, 1, MPI_DOUBLE, rank+1, 0, MPI_COMM_WORLD);
} else {
MPI_Recv(&recvb, 1, MPI_DOUBLE, rank-1, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
}
在此代码中,发送和接收进程有自己的路径,从技术上讲,每个对都可以同时进行通信。但这真的在实践中有效吗?是否有一些技术问题取决于硬件或类似的东西? 我天真地期待有三条非相交的车道,每条车道完全独立于其他车道,但可能并非如此。也许每个传输的信息都必须通过一些中心节点?
我已经创建了一个更复杂的应用程序,我注意到在我的家用电脑上运行相同的程序(一个带有6个线程的cpu)比在更大的集群计算机上运行速度更快(每个有16个线程的6个节点) =总共96个过程。