首页 > 解决方案 > C - MPI - Bsend no work with buffer attach

问题描述

我希望在开始接收之前缓冲区已满。它让我感觉缓冲区大小不是必需的

我按照文档进行操作,但看不到错误 https://www.mpich.org/static/docs/v3.1/www3/MPI_Buffer_attach.html

在某些情况下,它让我感觉使用特定的缓冲区大小,我可以执行比理论上允许的更多的 bsend

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

int main(int argc, char *argv[])
   {
   int rank, size, tag=0;
   MPI_Status status;
   MPI_Request request;
   int flag;
   
   MPI_Init(&argc, &argv);
   MPI_Comm_rank(MPI_COMM_WORLD, &rank);
   MPI_Comm_size(MPI_COMM_WORLD, &size);

   int bsends_totales=1000000;
   if (rank!=0) //Nodos esclavos
      {
      int size_bsend;
      MPI_Pack_size( 1, MPI_INT, MPI_COMM_WORLD, &size_bsend );
     
      int size_buffer=bsends_totales*(size_bsend+MPI_BSEND_OVERHEAD);
      int * buffer = malloc(size_buffer);
      memset(buffer,0,size_buffer);
      MPI_Buffer_attach(buffer,size_buffer); //Buffer saliente
     
      int enviar=4;
      int sends_realizados=0;
      for (int i=0;i<bsends_totales;i++)
        {
        printf("BSENDS realizados... %d\n",sends_realizados);
        MPI_Bsend(&enviar,1,MPI_INT,0,tag,MPI_COMM_WORLD);
        sends_realizados=sends_realizados+1;
        }
      printf("BSENDS TOTALES REALIZADOS: %d\n",sends_realizados);

      MPI_Barrier(MPI_COMM_WORLD);
      MPI_Buffer_detach(&buffer,&size_buffer);
      free(buffer);
      printf("TERMINE\n");
      }
   else //Master
      {
      int recibido;
      
      MPI_Barrier(MPI_COMM_WORLD);
      for (int i=0;i<bsends_totales;i++)
         {
         MPI_Recv(&recibido,1,MPI_INT,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&status);
         }
      
      }
   
   MPI_Finalize();
   return 0;
   }

在能够填充缓冲区之前出现错误

OUTPUT:
BSENDS realizados... 119696
BSENDS realizados... 119697
BSENDS realizados... 119698
BSENDS realizados... 119699
BSENDS realizados... 119700
code exit 11

标签: cmpi

解决方案


推荐阅读