如果将错误的参数传递给 MPI_Allreduce 会发生什么?
What will happen if wrong arguement is passed into MPI_Allreduce?
我正在使用 MPI_Allreduce 编写 Fortran。我不小心把 MPI_DOUBLE_PRECISION 而不是 MPI_INTEGER 来得到整数和。有时我会得到正确答案,有时我会得到一些非常大的负数。我正在上并行计算课程并检查我的教科书。我没有发现如果我将错误的 MPI_Datatype 传递给 MPI_Allreduce 究竟会发生什么。 此外,编译器或代码根本不会报错,这使得调试变得极其困难! 有没有一种方法可以识别错误的 MPI_Datatype 被传递到 MPI_Allreduce?如果传递了错误的参数,有人可以解释一下 MPI_ALlreduce 将如何工作吗?
非常感谢!
一般来说,不正确的程序都有未定义的行为。
在你的情况下,使用 MPI_DOUBLE_PRECISION
而不是 MPI_INTEGER
可能会导致数组溢出,从而导致内存损坏,然后所有的赌注都会被取消。
此外,您将使用运算符(+
是 MPI_SUM
),它对浮点数而不是整数进行运算,这是不正确的。
随意学习 DOUBLE PRECISION
数字的格式,看看如果将它们视为整数并执行加法会发生什么。
我正在使用 MPI_Allreduce 编写 Fortran。我不小心把 MPI_DOUBLE_PRECISION 而不是 MPI_INTEGER 来得到整数和。有时我会得到正确答案,有时我会得到一些非常大的负数。我正在上并行计算课程并检查我的教科书。我没有发现如果我将错误的 MPI_Datatype 传递给 MPI_Allreduce 究竟会发生什么。 此外,编译器或代码根本不会报错,这使得调试变得极其困难! 有没有一种方法可以识别错误的 MPI_Datatype 被传递到 MPI_Allreduce?如果传递了错误的参数,有人可以解释一下 MPI_ALlreduce 将如何工作吗?
非常感谢!
一般来说,不正确的程序都有未定义的行为。
在你的情况下,使用 MPI_DOUBLE_PRECISION
而不是 MPI_INTEGER
可能会导致数组溢出,从而导致内存损坏,然后所有的赌注都会被取消。
此外,您将使用运算符(+
是 MPI_SUM
),它对浮点数而不是整数进行运算,这是不正确的。
随意学习 DOUBLE PRECISION
数字的格式,看看如果将它们视为整数并执行加法会发生什么。