C++ MPI REDUCT运算中的求和顺序

C++ MPI REDUCT运算中的求和顺序,c++,parallel-processing,mpi,hpc,C++,Parallel Processing,Mpi,Hpc,我们知道浮点数的不同求和顺序可能导致不同的结果 考虑使用MPI_SUM操作调用的MPI函数MPI_reduce #include <mpi.h> int MPI_Reduce(const void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, int root, MPI_Comm comm) #包括 整数MPI_减少(常数void

我们知道浮点数的不同求和顺序可能导致不同的结果

考虑使用MPI_SUM操作调用的MPI函数MPI_reduce

#include <mpi.h>
int MPI_Reduce(const void *sendbuf, void *recvbuf, int count,
               MPI_Datatype datatype, MPI_Op op, int root,
               MPI_Comm comm)
#包括
整数MPI_减少(常数void*sendbuf、void*recvbuf、整数计数、,
MPI_数据类型数据类型,MPI_操作,int root,
MPI_通信(通信)
MPI标准或MPI实现是否保证每次使用相同的输入和输出数据运行函数时,结果都是相同的

这就是我在博物馆里发现的

还原的“规范”求值顺序由 组中进程的级别。然而,实现可以 利用结合性,或结合性和交换性, 以更改评估顺序

但这并不能提供关于可重复性的任何见解。

提供了一些进一步的见解:

对实施者的建议。强烈建议
MPI\u REDUCE
实施,以便在 函数应用于相同的参数,以相同的格式显示 秩序。请注意,这可能会阻止利用 军衔的实际位置。(给实施者的建议结束。)

因此,虽然没有保证,但我希望实现遵循这一建议,并产生可重复的结果。

提供了一些进一步的见解:

对实施者的建议。强烈建议
MPI\u REDUCE
实施,以便在 函数应用于相同的参数,以相同的格式显示 秩序。请注意,这可能会阻止利用 军衔的实际位置。(给实施者的建议结束。)


因此,虽然没有保证,但我希望实现遵循这一建议,并产生可重复的结果。

如果每次运行时,节点和核心之间具有相同物理位置的相同列组数,那么每次运行时,您可能会期望相同的结果(不过,正如您在上面看到的,该标准并不保证这一点)

实际上,在共享使用HPC系统上,您通常不会实现完全相同的放置,因此缩减顺序通常不同,并且您会看到由于缩减操作顺序不同而产生的微小差异


我还应该说:即使您一致地复制物理布局,由于共享基础架构(互连或磁盘,即使是非独占使用的节点)上的不同条件,操作顺序也可能有所不同。如果其他用户以不同的方式加载系统,则可以更改到达每个列组的数据顺序,从而更改操作顺序(取决于并行简化算法).

如果每次运行时在节点和核心之间具有相同数量的列组和相同的物理位置,则每次运行时可能会得到相同的结果(尽管如上所述,标准并不保证这一点)

实际上,在共享使用HPC系统上,您通常不会实现完全相同的放置,因此缩减顺序通常不同,并且您会看到由于缩减操作顺序不同而产生的微小差异


我还应该说:即使您一致地复制物理布局,由于共享基础架构(互连或磁盘,即使是非独占使用的节点)上的不同条件,操作顺序也可能有所不同。如果其他用户以不同的方式加载系统,则可以更改达到每个秩的数据顺序,从而更改操作顺序(取决于并行简化算法)。

我将解释“关联性和交换性”作为数学意义上的结合性和交换性。加实数两者兼而有之,但实际上加浮点数既不是结合的,也不是交换的。因此,我希望操作可以重新排序,但每次运行ITIRC时会得到不同的结果,该标准至少强烈建议避免不确定集体主义。只要你使用相同的通信器,操作就会以相同的顺序进行评估,因此应该产生相同的结果。@GillesGouaillardet这就是我对MPI库的期望。我有一个庞大的代码库,每次运行它时都会产生微小的结果偏差。我想知道是否应该研究MPI-exchange(或可能在非阻塞操作中)或它来自串行部分。@paceholdernote这可能不适用于非阻塞集合。如果您使用一个MPI任务运行应用程序会怎么样?您仍然看到偏差吗?MPI任务是否使用线程并行性(如OpenMP或多线程LIB,如MKL?)顺便说一句,你用的是哪种MPI?@GillesGouaillardet有一个MPI进程它工作得很好。这是一个纯MPI代码。我不确定,它一定是这台机器上的IBM实现。我会解释“关联性和交换性”作为数学意义上的结合性和交换性。加实数两者兼而有之,但实际上加浮点数既不是结合的,也不是交换的。因此,我希望操作可以重新排序,但每次运行ITIRC时会得到不同的结果,该标准至少强烈建议避免不确定集体主义。只要你使用相同的通信器,操作就会以相同的顺序进行评估,因此应该产生相同的结果。@GillesGouaillardet这就是我对MPI库的期望。我有一个庞大的代码库,每次运行它时都会产生微小的结果偏差。我想知道是否应该研究MPI-exchange(或可能在非阻塞操作中)或它是来自串行部分的内容。@paceholdernote这可能不适用于非阻塞co