MPI_BCAST(buffer,count,datatype,root,comm)
IN/OUTbuffer通信消息缓冲区的起始地址(可选数据类型)
INcount 将广播出去/或接收的数据个数(整型)
INdatatype广播/接收数据的数据类型(句柄)
INroot广播数据的根进程的标识号(整型)
INcomm通信域(句柄)
int MPI_Bcast(void* buffer,int count,MPI_Datatype datatype,int root, MPI_Comm comm)
MPI_BCAST(BUFFER,COUNT,DATATYPE,ROOT,COMM,IERROR)
<type>   BUFFER(*)
INTEGER COUNT,DATATYPE,ROOT,COMM,IERROR

MPI_BCAST是一对多组通信的典型例子,它完成从一个标识为root的进程将一条消息广播发送到组内的所有其它的进程,同时也包括它本身在内。在执行该调用时组内所有进程(不管是root进程本身还是其它的进程)都使用同一个通信域comm和根标识root,其执行结果是将根进程通信消息缓冲区中的消息拷贝到其他所有进程中去。
一般说来,数据类型datatype可以是预定义数据类型或派生数据类型,其它进程中指定的通信元素个数count、数据类型datatype必须和根进程中的指定的通信元素个数count、数据类型datatype保持一致。即对于广播操作调用,不管是广播消息的根进程,还是从根接收消息的其它进程,在调用形式上完全一致,即指明相同的根,相同的元素个数以及相同的数据类型。除MPI_BCAST之外,其它完成通信功能的组通信调用都有此限制。

广播前后各进程缓冲区中数据的变化

下面的程序首先由ROOT进程从键盘读如一个整数,然后广播到其它所有的进程,各进程打印出收到的数据。若该数据非负,则循环执行上面的步骤。

 #include "mpi.h"
#include "test.h"
#include <stdlib.h>
#include <stdio.h>
int main( int argc, char **argv )
{
int rank, size, i;
int *table;
int errors=0;
MPI_Aint address;
MPI_Datatype type, newtype;
int lens;
MPI_Init( &argc, &argv );
MPI_Comm_rank( MPI_COMM_WORLD, &rank );
MPI_Comm_size( MPI_COMM_WORLD, &size );
/* Make data table */
table = (int *) calloc (size, sizeof(int));
table[rank] = rank + 1; /*准备要广播的数据*/
MPI_Barrier ( MPI_COMM_WORLD );
/* 将数据广播出去*/
for ( i=0; i<size; i++ )
MPI_Bcast( &table[i], 1, MPI_INT, i, MPI_COMM_WORLD );
/* 检查接收到的数据的正确性 */
for ( i=0; i<size; i++ )
if (table[i] != i+1) errors++;
MPI_Barrier ( MPI_COMM_WORLD );/*检查完毕后执行一次同步*/
...
/*其它的计算*/
MPI_Finalize();
}