MPI_BUFFER_DEATTACH
MPI_BUFFER_DETACH( buffer, size)
OUT buffer 缓冲区初始地址(可选数据类型)
OUT size 以字节为单位的缓冲区大小(整型)
int MPI_Buffer_detach( void** buffer, int* size)
MPI_BUFFER_DETACH( BUFFER, SIZE, IERROR)
<type>BUFFER(*) INTEGER SIZE, IERROR
讲解:
MPI_BUFFER_DETACH将提交的大小为size的缓冲区buffer收回。该调用是阻塞调用,它一直等到使用该缓存的消息发送完成后才返回。这一调用返回后用户可以重新使用该缓冲区或者将这一缓冲区释放。
下面的例子首先用缓存模式发送包含5个双精度类型的数据,再发送一个双精度类型的数据。而接收操作仍然使用标准的接收。
#include <stdio.h>
#include <stdlib.h>
#include "mpi.h"
#define SIZE 6
/*总的数据大小*/
static int src = 0;
static int dest = 1;
void Generate_Data ( double *, int );
/* 产生发送的数据*/
void Normal_Test_Recv ( double *, int );
/*标准接收*/
void Buffered_Test_Send ( double *, int );
/*缓存发送*/
void Generate_Data(buffer, buff_size)
double *buffer;
int buff_size;
{
int i;
for (i = 0; i < buff_size; i++)
buffer[i] = (double)i+1;
}
void Normal_Test_Recv(buffer, buff_size)
double *buffer;
int buff_size;
{
int i, j;
MPI_Status Stat;
double *b;
b = buffer;
/* 先接收buff_size - 1个连续的双精度数 */
MPI_Recv(b, (buff_size - 1), MPI_DOUBLE, src,
2000, MPI_COMM_WORLD, &Stat);
fprintf(stderr,"standard receive a message of %d data\n",buff_size-1);
for (j=0;j<buff_size-1;j++)
fprintf(stderr," buf[%d]=%f\n",j,b[j]);
b += buff_size - 1;
/* 再接收一个双精度数 */
MPI_Recv(b, 1, MPI_DOUBLE, src, 2000, MPI_COMM_WORLD, &Stat);
fprintf(stderr,"standard receive a message of one data\n");
fprintf(stderr,"buf[0]=%f\n",*b);
}
void Buffered_Test_Send(buffer, buff_size)
double *buffer;
int buff_size;
{
int i, j;
void *bbuffer;
int size;
fprintf(stderr,"buffered send message of %d data\n",buff_size-1);
for (j=0;j<buff_size-1;j++)
fprintf(stderr,"buf[%d]=%f\n",j,buffer[j]);
/*先用缓存方式方式发送buff_size - 1个双精度的数*/
MPI_Bsend(buffer, (buff_size - 1), MPI_DOUBLE, dest, 2000,
MPI_COMM_WORLD);
buffer += buff_size - 1;
fprintf(stderr,"buffered send message of one data\n");
fprintf(stderr,"buf[0]=%f\n",*buffer);
/*再用缓存方式方式发送1个双精度数*/
MPI_Bsend(buffer, 1, MPI_DOUBLE,
dest, 2000, MPI_COMM_WORLD);
/* 强制收回发送缓冲,这样也保证了该操作返回后消息已经送出*/
MPI_Buffer_detach( &bbuffer, &size );
/*再重新递交发送缓存*/
MPI_Buffer_attach( bbuffer, size );
}
|