c - 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
解决方案
推荐阅读
- javascript - React Hooks useState Array 为空,在组件中呈现状态
- python - 返回已发送电子邮件的时间和日期 - IMAP
- c# - C# 使用数据库值更新组合框
- prolog - 如果序言中不存在事实,请使用规则?
- python - Pyspark - 连接两个数据框并连接一个数组列
- c# - 实体框架 LINQ 等效于 TSQL,包括子记录计数
- reactjs - Enzyme setState() 如何作用于浅层组件?
- html - 锚标记内的图像使不需要的水平空间也可点击链接
- node.js - Express Js 无限端点调用
- javascript - 如何使用 PHP 和/或 JavaScript 将用户的分数存储在我网站上的变量中?