加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

MPI_Allgather的负缩放

发布时间:2020-12-16 07:10:46 所属栏目:百科 来源:网络整理
导读:我正面临一个问题,因为我在C中编写并行分子动力学算法,其中所有核心计算最小的碰撞时间,然后通过MPI_Allgather将碰撞伙伴传递给所有其他核心以查看最早的碰撞. 我已经内置了一个时间测量功能,以查看我的程序的不同部分是如何缩放的.这表明,对于8个节点(192个
我正面临一个问题,因为我在C中编写并行分子动力学算法,其中所有核心计算最小的碰撞时间,然后通过MPI_Allgather将碰撞伙伴传递给所有其他核心以查看最早的碰撞.
我已经内置了一个时间测量功能,以查看我的程序的不同部分是如何缩放的.这表明,对于8个节点(192个核心),Allgather在100k时间步长上需要2000秒,而在20个节点(480)上需要5000秒.

我在Cray系统上使用带有以下标志的Cray编译器:

add_definitions(-DNDEBUG)
    set(CMAKE_C_FLAGS "-O3 -h c99,pl=./compiler_information,wp")
    set(CMAKE_EXE_LINKER_FLAGS "-h pl=./compiler_information,wp")

代码的一部分如下所示:

MPI_Barrier(cartcomm);

    START(scmcdm_Allgather); // time measure
        MPI_Allgather(v_min_cpartner,1,mpi_vector5,min_cpartners,cartcomm);
    STOP(scmcdm_Allgather); // time measure

其中mpi_vector5是一个包含5个双精度数的连续数据类型:

MPI_Type_contiguous(5,MPI_DOUBLE,&mpi_vector5);

这是正常的行为吗?我该如何优化?

更新:
感谢您的评论,我实施了另外两种解决问题的方法:

>如果它们在给定的时间步长内实际发生冲突(只有少数几个),则所有内核首先发送一个整数值,然后只有发生冲突的内核将其传递给核心0,然后核心0广播最小值.

这里第一步很慢,所有核心都与核心0通信.MPI是否有可能跳过这一步并有一个集体通信例程,其中只有部分核心参与? (即最小的)

>我使用了具有碰撞时间和等级的double_int对来使用minloc函数,而不是使用vector5进行通信.具有最小冲突时间的核心然后广播vector5.

到目前为止,这个解决方案是最快的,但它仍然是负面扩展(8个节点上1600个,20个节点上3000个).

还有其他想法吗?

解决方法

解决原始问题的问题:

>保持MPI简单.如果您有类似发送5个双打的内容,请避免使用数据类型.因此,如果您要发送5个双打,请说:MPI_Allgather(v_min_cpartner,5,cartcomm)

原因在于,不幸的是,用户定义的MPI数据类型的情况可能并不总是被优化.
>我假设您在操作完成等级0时打印.这是一种方式,但它可能会给您一个不完整的图片.最好的方法是为每个等级计时,然后运行MPI_Allreduce以查找所有等级报告的时间的最大值.

集体操作在不同的时间段在不同的级别上完成,并且MPI实现在内部根据级别数,有效负载,机器分配的大小等来更改算法.如果该等级位于MPMD的关键路径上,则计算特定等级的时间是有意义的程序;如果您正在执行SPMD程序,则必须等待下一次集体操作或同步点中花费时间最长的等级.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读