c - 访问 MPI 拓扑中的邻居进程值

标签 c mpi hpc

我已经实现了一个笛卡尔拓扑建模 3x3 网格:

enter image description here

其中P0、P1等分别代表进程0、进程1等。因此,拓扑中的每个槽代表一个进程。 Val 表示过程包含的值。

我现在想做的是检查每个进程的邻居值的总和,看看它总和是否等于 300>。如果是,则输出:

Process 1 neighbour values sums up to 300.
Process 3 neighbour values sums up to 300.
Process 5 neighbour values sums up to 300.
.
.

邻居是左上下或右。我编写了代码来模拟上图:

#include <stdio.h>
#include "mpi.h"
int main(int argc, char *argv[])
{
  int value;
  int sum;
  int rank;
  int size;
  int coordinates[2];

  MPI_Comm grid_comm;

  int dim[2],false = 0,reorder;
  int top,bottom,right,left; 

  MPI_Status status;

  MPI_Init(&argc,&argv); 
  MPI_Comm_rank(MPI_COMM_WORLD,&rank);
  MPI_Comm_size(MPI_COMM_WORLD,&size);

  dim[0] = 3;
  dim[1] = 3;
  reorder = 0;
  MPI_Cart_create(MPI_COMM_WORLD,2,dim,&false,reorder,&grid_comm);

  MPI_Cart_shift(grid_comm,0,1,&top,&bottom);
  MPI_Cart_shift(grid_comm,1,1,&left,&right);

  MPI_Comm_rank(grid_comm,&rank);

  MPI_Cart_coords(grid_comm,rank,2,coordinates);
  MPI_Cart_rank(grid_comm,coordinates,&rank);

  if (rank % 2 == 0) {
      value *=100;
  }
  else {
      value *=200;
  }

  MPI_Finalize();
  return 0;
}

我现在面临的问题是在笛卡尔网格中访问邻居值。希望得到一些关于我如何做到这一点的建议。

最佳答案

您可以将 MPI 通信视为分阶段进行。您可以通过四个阶段来完成您需要的操作。在每个阶段,每个节点都会将其值发送给{right,left,top,bottom}上的邻居(除非没有这样的邻居)。

一种方法是使用 MPI_Isend,它是非阻塞的。这意味着在第一阶段,每个节点都向右发送,然后从左侧接收。

关于c - 访问 MPI 拓扑中的邻居进程值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52567100/

相关文章:

c - 用简单的 MPI 代码读写测试文件时出错

c - 非常奇怪的 MPI 行为

java - Java中的高性能集群计算(和MPI)

c - 在c中使用逗号分隔值读取文件

c++ - MPI程序的段错误

c - 将浮点值打印到控制台精度问题_

c - 英特尔 mpicc 链接器错误未定义对 `_mm_idivrem_epi32' 的引用

netlogo - 在 HPC 机器上运行 NetLogo : how to specify the number of cores to be used?

c++ - FFmpeg:无法设置/获取/查找 HLS 选项

c - 如何避免使用 getchar() 按下 Enter 来仅读取单个字符?