MPI-2: 支持单边通信;
MPI-3: 支持非阻塞的Collective通信, 可以更大程度的并行计算和通信;例如MPI_Iallreduce
SSE/AVX: SIMD
CUDA: SIMT (T:Thread)
MPI: SPMD/MPMD (P:Program)
OpenMP: SMP
MPI_Rank和if-else决定每个进程做不同事儿;
可创建新的进程组(全局是MPI_COMM_WORLD)
点对点通信: MPI_Send/MPI_Recv
组播通信:MPI_Allreduce/MPI_Reduce/MPI_Bcast/MPI_Gather/MPI_Scatter (通信+同步+计算)
同步:MPI_Barrier
单边通信
用户自定义数据类型:可处理不连续的数据。在发送方将不连续数据打包到连续的区域,然后发送,接收方将打包后的连续数据解包到不连续的存储空间
重要:对于相同的数据量:尽量传递少量的大数据包,避免传递很多小的数据包(尽量少的MPI消息传递函数的调用,可以减小系统的开销)
性能Profiling工具:Vampir(可以一段一段的Application时间和MPI调用时间)
MPI_Probe,检测消息是否到达,但不接收消息
空进程:MPI_PROC_NULL
MPI_Send和MPI_Recv必须成对出现,否则可能死锁!
例子:2个进程彼此向对方发送数据;1. 都先接收再发送,肯定死锁; 2. 都先发送再接收,不安全,因为当双方发送buffer都满的时候会死锁;
解决方案:1. 一个先发送再接收,一个先接收再发送;2. MPI_Sendrecv; 3. MPI_Isend或MPI_Irecv用一个就够了(+MPI_Wait or MPI_Test)