MPI_Reduce 和 MPI_MIN 如何工作?

sam*_*sam 2 c mpi

如果我有这个代码:

int main(void) {
    int result=0;
    int num[6] = {1, 2, 4, 3, 7, 1};
    if (my_rank != 0) {
        MPI_Reduce(num, &result, 6, MPI_INT, MPI_MIN, 0, MPI_COMM_WORLD);
    } else {
        MPI_Reduce(num, &result, 6, MPI_INT, MPI_MIN, 0, MPI_COMM_WORLD)
        printf("result = %d\n", result);
    }
}
Run Code Online (Sandbox Code Playgroud)

结果打印为 1 ;

但如果num[0]=9;那么结果是9

我读到为了解决这个问题,我必须将变量定义num为数组。我无法理解该函数如何MPI_Reduce与 一起使用MPI_MIN。为什么如果num[0]不等于最小数,那么我必须将变量定义num为数组?

Zul*_*lan 5

MPI_Reduce对通信器的成员执行缩减 - 而不是本地数组的成员。sendbuf并且recvbuf两者必须相同size

我认为该标准说得最好:

因此,所有进程都提供相同长度的输入缓冲区和输出缓冲区,以及相同类型的元素。每个进程可以提供一个元素或一系列元素,在这种情况下,组合操作在序列的每个条目上按元素执行

MPI 无法获取数组中所有元素的最小值,您必须手动执行此操作。