我想在群集的每台机器上轻松地执行集体通信.假设我有4台机器,每台机器有8个核心,我的mpi程序将运行32个MPI任务.对于给定的功能,我想要的是:
从概念上讲,我理解我必须为每个主机创建一个通信器.我四处搜索,没有发现任何明确的事情.我对MPI小组和传播者感到不舒服.这是我的两个问题:
规范说MPI_Get_processor_name返回"实际(而不是虚拟)节点的唯一说明符",所以我认为你可以这样做.我想你会聚集在一起收集所有的主机名,然后分配处理器组来制作他们的通信器; 或者复制MPI_COMM_WORLD,将名称转换为整数哈希值,并使用mpi_comm_split对集合进行分区.
您还可以采用janneb建议的方法并使用特定于实现的选项来确保MPI实现以这种方式分配任务; OpenMPI使用--byslot生成此排序; 使用mpich2,您可以使用-print-rank-map查看映射.
但这真的是你想要做的吗?如果其他进程在一个处理器工作时处于空闲状态,那么这比每个人冗余地进行计算更好吗?(或者这是内存还是I/O密集型,你担心争用吗?)如果你要做很多这样的事情 - 处理节点内并行化与节点外并行化有很大不同 - 那么您可能想要考虑混合编程模型 - 每个节点运行一个MPI任务和MPI_spawning子任务或使用OpenMP进行节点间通信,这两者都是HPM建议的.