c - MPI_Scatter() 错误

标签 c mpi openmpi

我有这个串行代码,我正在尝试使用 MPI 将其转换为并行代码。但是,我似乎无法让 MPI_Scatter() 函数在不崩溃的情况下正常工作。该函数遍历名为 cells 的数组并修改一些值。

下面是原始串口代码:

int accelerate_flow(const t_param params, t_speed* cells, int* obstacles)
{
  register int ii,jj;     /* generic counters */
  register float w1,w2;  /* weighting factors */
  /* compute weighting factors */
  w1 = params.density * params.accel * oneover9;
  w2 = params.density * params.accel * oneover36;

  int i;

  /* modify the first column of the grid */
  jj=0;

  for(ii=0;ii<params.ny;ii++)
  {

      if( !obstacles[ii*params.nx] && (cells[ii*params.nx].speeds[3] > w1 &&
          cells[ii*params.nx].speeds[6] > w2 && cells[ii*params.nx].speeds[7] > w2))  
      {
          /* increase 'east-side' densities */
          cells[ii*params.nx].speeds[1] += w1;
          cells[ii*params.nx].speeds[5] += w2;
          cells[ii*params.nx].speeds[8] += w2;
         /* decrease 'west-side' densities */
         cells[ii*params.nx].speeds[3] -= w1;
         cells[ii*params.nx].speeds[6] -= w2;
         cells[ii*params.nx].speeds[7] -= w2;
      }
  }

return EXIT_SUCCESS;

}

这是我使用 MPI 的尝试:

int accelerate_flow(const t_param params, t_speed* cells, int* obstacles, int myrank, int ntasks)
{
    register int ii,jj = 0;;     /* generic counters */
    register float w1,w2;  /* weighting factors */
    int recvSize;
    int cellsSendTag = 123, cellsRecvTag = 321;
    int size = params.ny / ntasks, i;
    MPI_Request* cellsSend, *cellsRecieve;
    MPI_Status *status;

    /* compute weighting factors */
    w1 = params.density * params.accel * oneover9;
    w2 = params.density * params.accel * oneover36;

    t_speed* recvCells = (t_speed*)malloc(size*sizeof(t_speed)*params.nx);

    MPI_Scatter(cells, sizeof(t_speed)*params.nx*params.ny, MPI_BYTE, recvCells, 
      size*sizeof(t_speed)*params.nx, MPI_BYTE, 0, MPI_COMM_WORLD);

    for(ii= 0;ii < size;ii++)
    {
        if( !obstacles[ii*params.nx] && (recvCells[ii*params.nx].speeds[3] > w1 &&
             recvCells[ii*params.nx].speeds[6] > w2 && recvCells[ii*params.nx].speeds[7] > w2))
        {

           /* increase 'east-side' densities */
           recvCells[ii*params.nx].speeds[1] += w1;
           recvCells[ii*params.nx].speeds[5] += w2;
           recvCells[ii*params.nx].speeds[8] += w2;
           /* decrease 'west-side' densities */
           recvCells[ii*params.nx].speeds[3] -= w1;
           recvCells[ii*params.nx].speeds[6] -= w2;
           recvCells[ii*params.nx].speeds[7] -= w2;
        }
   }

MPI_Gather(recvCells, size*sizeof(t_speed)*params.nx, MPI_BYTE, cells, params.ny*sizeof(t_speed)*params.nx, MPI_BYTE, 0, MPI_COMM_WORLD);

 return EXIT_SUCCESS;

}

这里是t_speed 结构:

typedef struct {
float speeds[NSPEEDS];
} t_speed;

params.nx = 300, params.ny = 200

非常感谢任何帮助。谢谢。

最佳答案

MPI_Scatter 的第一个计数参数是要发送到每个进程 的元素数,而不是总数。在这里,发送计数和接收计数相同,并且是 nx*ny/ntasks;所以你会有类似的东西

int count=params.nx*params.ny/ntasks;

MPI_Scatter(cells,    sizeof(t_speed)*count, MPI_BYTE, 
            recvCells,sizeof(t_speed)*count, MPI_BYTE, 0, MPI_COMM_WORLD);

请注意,这仅在 ntasks 平均划分 nx*ny 时有效,否则您将不得不使用 Scatterv

关于c - MPI_Scatter() 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12130329/

相关文章:

C 指针和内存地址的澄清

c - 数组接收的 MPI 总和仅适用于一个级别

c - MPI_Comm_size 始终返回 1

java - OpenMPI Java 绑定(bind)行为差异(锁定、累积、获取)

c - 为什么在 C 程序中在 #include 指令的 fileName 之后写入任何内容不会给出任何错误?

c - 当子进程调用函数时丢失输出

c++ - MPI_Allreduce 加倍

Cygwin 或 Gnuwin32 或 MYSYS?

c - 如何编写具有多个源文件和头文件的检查测试 makefile.am?

mpi - MPI_Allgather 和 MPI_Allgatherv 的区别