【发布时间】: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 指向的数组元素? 请注意,显示的所有变量和指针之前都已初始化,我只是排除了代码中不必要的部分以更清楚地说明这一点。
【问题讨论】:
标签: c++ arrays parallel-processing mpi dynamic-arrays