MPI_Reduce() 到特定的数组元素

Posted

技术标签:

【中文标题】MPI_Reduce() 到特定的数组元素【英文标题】:MPI_Reduce() to specific array elements 【发布时间】:2021-06-21 08:44:27 【问题描述】:

我在并行代码中遇到问题,我需要将所有进程的值减少到根进程,对它们求和,然后将总和分配给数组元素。我想在一个循环中执行此操作,以便每个 MPI_Reduce() 调用减少为沿数组的连续元素。我想知道如何指向数组中的特定位置。部分for循环代码如下所示。

for(int i = 1; i < N_t; i++) 
 ....

        loc_EK = valEK * (cblas_ddot(loc_N, loc_vx, 1, loc_vx, 1) + 
        cblas_ddot(loc_N, loc_vy, 1, loc_vy, 1));
        loc_EP = valEP * cblas_dasum(loc_N, loc_y, 1);
        loc_ET = loc_EP + loc_EK;

        // Gather and sum loc_E components in root process
        MPI_Reduce(&loc_EK, (EK + 1 + i), 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);
        MPI_Reduce(&loc_EP, (EP + 1 + i), 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);
        MPI_Reduce(&loc_ET, (ET + 1 + i), 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);
    

我现在使用 (EK+i+1) 指向数组位置,其中 EK 是指向动态数组的指针。我曾尝试使用 EK[i+1],但正如预期的那样,这不起作用。我应该如何解决这个问题,以便我可以将每个减少的总和分配给 EK 指向的数组元素? 请注意,显示的所有变量和指针之前都已初始化,我只是排除了代码中不必要的部分以更清楚地说明这一点。

【问题讨论】:

【参考方案1】:

您需要指定为:

   MPI_Reduce(loc_EK, &EK[1], N_t, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); 

完整的运行示例:

#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>

int main(int argc,char *argv[])
    MPI_Init(NULL,NULL); // Initialize the MPI environment
    int world_rank; 
    int world_size;
    MPI_Comm_rank(MPI_COMM_WORLD,&world_rank);
    MPI_Comm_size(MPI_COMM_WORLD,&world_size);
    int size = 10;
    double *number = new double[size];
    for(int i = 0; i < size; i++)
         number[i] = world_rank + 1;

    double *sum = new double[size + 1];
    for(int i = 0; i < size + 1 ; i++) 
        sum[i] = 0;
        
    MPI_Reduce(number, &sum[1], size, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);            
    
    if(world_rank == 0)
      for(int i = 0; i < size; i++)
         printf("%f\n",sum[i]);
    

    MPI_Finalize();
    return 0;
 

输出(两个进程):

3.000000
3.000000
3.000000
3.000000
3.000000
3.000000
3.000000
3.000000
3.000000
3.000000

【讨论】:

以上是关于MPI_Reduce() 到特定的数组元素的主要内容,如果未能解决你的问题,请参考以下文章

更新深度嵌套的 react redux 状态数组元素

重温前端基础之-js排序算法

如何将元素插入到特定位置的数组中?

PHP 在特定位置插入/添加元素到数组

PHP 在特定位置插入/添加元素到数组

有一个js数组,已排序,现在需要移动某些元素到特定的位置,这种实现