集群上 allreduce 中的 MPI_BYTE 错误

Posted

技术标签:

【中文标题】集群上 allreduce 中的 MPI_BYTE 错误【英文标题】:MPI_BYTE error in allreduce on cluster 【发布时间】:2018-09-01 13:02:04 【问题描述】:

MPI_BYTE 在一个集群上运行完美,但在另一个集群上抛出错误。 这有什么原因吗,因为 sizeof(bool)=1 BYTE 而我喜欢减少 1 BYTE。 这是代码

int main( int argcs, char *pArgs[] )


 MPI_Init( &argcs, &pArgs );

   int my_rank, comsize;

    MPI_Comm_rank( MPI_COMM_WORLD, &my_rank );

    MPI_Comm_size( MPI_COMM_WORLD, &comsize );

    bool sb=false;

    if(my_rank==comsize-1)
    
      sb=true;
    

    bool rb=true;

    MPI_Request request0;

    double t1;

    t1 = MPI_Wtime();

MPI_Iallreduce( &sb, &rb, sizeof(bool), MPI_BYTE, MPI_MAX, MPI_COMM_WORLD, &request0 );

    MPI_Wait( &request0, MPI_STATUS_IGNORE );

    double   t2 = MPI_Wtime(); 

     MPI_Finalize();

【问题讨论】:

请发布错误消息以及有关其工作/失败的系统的更多信息... 一个簇是小端,另一个是大端吗? 【参考方案1】:

我认为标准不允许您使用 MPI_BYTEC bool

FWIW,在Fortran 你可以使用MPI_LOGICAL

sizeof(bool) == 1的说法确实有误,详情请参考Is sizeof(bool) defined?。

在我看来,您的程序不正确,因此具有未定义的行为。

恐怕你得手动把C中的bool转换成byte,然后才能用MPI_BYTE

【讨论】:

以上是关于集群上 allreduce 中的 MPI_BYTE 错误的主要内容,如果未能解决你的问题,请参考以下文章

带你认识大模型训练关键算法:分布式训练Allreduce算法

带你认识大模型训练关键算法:分布式训练Allreduce算法

MPI C,基于值的 Allreduce 结构

MPI通信的几种模式, Broadcast, Scatter, Gather, Allgather, Reduce, AllReduce

带你认识大模型训练关键算法:分布式训练Allreduce算法

带你认识大模型训练关键算法:分布式训练Allreduce算法