最近在学mpi程序设计,经常要用的mpi的接口函数,故整理如下:
int MPI_Init(
int* argc_p /* in/out */,
char *** argv_p /* in/out */);
该函数告知MPI系统进行必要的初始化设置,参数argc_p和argv_p分别是指向argc和argv的指针,可以直接设置为NULL;返回值为int型错误码,大多数情况下可以忽略这些错误码。在调用MPI_Init()之前,不应该调用其他MPI函数。
int MPI_Finalize(void);
该函数告诉MPI系统MPI已经使用完,可以释放所有为MPI分配的资源了。在该函数之后,不应再调用MPI函数。
int MPI_Comm_size(
MPI_Comm comm /* in */,
int* comm_sz /* out */);
该函数获取给定通信子中线程的数目,comm传入给定通信子,comm_sz传出线程数目。
int MPI_Comm_rank(
MPI_Comm comm /* in */,
int* my_rank /* out */);
该函数获取给定通信子中该进程的进程号,comm传入给定通信子,my_rank传出进程号。
int MPI_Send(
void* msg_buffer_p /* in */,
int msg_size /* in */,
MPI_Datatype msg_type /* in */,
int dest /* in */,
int tag /* in */,
MPI_Comm comm /* in */);
该函数在进程间发送消息。msg_buffer_p是一个指向包含消息内容的内存块的指针;msg_size表示数据长度;msg_type表示数据类型;dst表示目的进程号;tag是个非负int型,标签,同一标签才能被接受;comm是通信子,所有涉及通信的MPI函数都有通信子参数。
该函数有两种可能性:
MPI 数据类型 | C语言数据类型 | MPI数据类型 | C语言数据类型 |
---|---|---|---|
MPI_CHAR | signed char | MPI_UNSIGNED | unsigned int |
MPI_SHORT | signed short int | MPI_UNSIGNED_LONG | unsigned long int |
MPI_INT | signed int | MPI_FLOAT | float |
MPI_LONG | signed long int | MPI_DOUBLE | double |
MPI_LONG_LONG | signed long long int | MPI_LONG_DOUBLE | long double |
MPI_UNSIGNED_CHAR | unsigned char | MPI_BYTE | |
MPI_UNSIGNED_SHORT | unsigned short int | MPI_PACKED |
int MPI_Recv(
void* msg_buffer_p /* out */,
int msg_size /* in */,
MPI_Datatype msg_type /* in */,
int source /* in */,
int tag /* in */,
MPI_Comm comm /* in */,
MPI_Status* status_p /* out */);
该函数在进程间接收消息。该函数的参数与MPI_Send()的参数相似,不同之处在于source为源进程号,status_p在大多数情况下不使用,赋予MPI_STATUS_IGNORE就行。
MPI提供特殊的常量MPI_ANY_SOURCE和MPI_ANY_TAG用来统配所有源进程号和所有标签,但是,只有MPI_Recv()可以使用,MPI_Send()必须制定目的进程号和标签。
该函数总是阻塞的,直到接收到一条匹配消息。
int MPI_Get_count(
MPI_Status* status_p /* in */,
MPI_Datatype recv_type /* in */,
int* count_p /* out */);
该函数返回接收到的元素数量。MPI_Status类型是一个至少含有三个成员的结构:MPI_SOURCE、MPI_TAG和MPI_ERROR,可以获得发送者、标签和错误类型。元素数量将存在count_p所指向的空间中。
int MPI_Reduce(
void* input_data_p /* in */,
void* output_data_p /* out */,
int count /* in */,
MPI_Datatype datatype /* in */,
MPI_Op operator /* in */,
int dest_process /* in */,
MPI_Comm comm /* in */);
规约函数。input_data_p是源数据的地址,output_data_p是存放目的数据的地址,两者都既可以是标量,也可以是向量;count>1,表示input_data和output_data是向量;operator是规约操作符。
参数output_data_p只用在dest_process上,但是所有进程都需要传递一个与output_data_p相对应的实际参数,即使是NULL.
运算符值 | 含义 | 运算符值 | 含义 |
---|---|---|---|
MPI_MAX | 求最大值 | MPI_LOR | 逻辑或 |
MPI_MIN | 求最小值 | MPI_BOR | 按位或 |
MPI_SUM | 求累加和 | MPI_LXOR | 逻辑异或 |
MPI_PROD | 求累乘积 | MPI_BXOR | 按位异或 |
MPI_LAND | 逻辑与 | MPI_MAXLOC | 求最大值和最大值所在位置 |
MPI_BAND | 按位与 | MPI_MINLOC | 求最小值和最小值所在位置 |
int MPI_Reduce(
void* input_data_p /* in */,
void* output_data_p /* out */,
int count /* in */,
MPI_Datatype datatype /* in */,
MPI_Op operator /* in */,
MPI_Comm comm /* in */);
全局规约函数,规约结果会保存在所有进程中。
int MPI_Bcast(
void* data_p /* in/out */,
int count /* in */,
MPI_Datatype datatype /* in */,
int source_process /* in */,
MPI_Comm comm /* in */);
该函数用于广播。在一个集合通信中,如果属于同一个进程的数据被发送到通信子中的所有进程,这样的集合通信被称为广播。source_process进程中data_p指向的数据将会存在该通信子中所有进程的data_p指向的空间中。
int MPI_Scatter(
void* send_buffer_p /* in */,
int send_count /* in */,
MPI_Datatype send_type /* in */,
void* recev_buffer_p /* out */,
int recev_count /* in */,
MPI_Datatype recev_type /* in */,
int source_process /* in */,
MPI_Comm comm /* in */);
散射函数,用于分发数据,该函数将send_buffer_p所引用的数据分为comm_sz份,第一份给0号进程,第二份给1号进程,以此类推。send_count表示发送给每个进程的数据量。
int MPI_Gather(
void* send_buffer_p /* in */,
int send_count /* in */,
MPI_Datatype send_type /* in */,
void* recev_buffer_p /* out */,
int recev_count /* in */,
MPI_Datatype recev_type /* in */,
int dest_process /* in */,
MPI_Comm comm /* in */);
聚集函数。0号进程中,由send_buffer_p所引用的内存区的数据存储在recev_buffer_p的第一个块中;1号进程中,由send_buffer_p所引用的内存区的数据存储在recev_buffer_p的第二个块中;一次类推。recev_count表示接收到每个进程的数据量,而不是所有数据量的总和。
MPI_Gather()和MPI_Scatter()有如下限制:数据使用块划分法,且每个块大小相同。
int MPI_AllGather(
void* send_buffer_p /* in */,
int send_count /* in */,
MPI_Datatype send_type /* in */,
void* recev_buffer_p /* out */,
int recev_count /* in */,
MPI_Datatype recev_type /* in */,
MPI_Comm comm /* in */);
全局聚集函数,该函数将所有进程的send_buffer_p内容串联起来,存储在每个进程的recev_buffer_p参数中。
double MPI_Wtime(void);
返回从某一特定时刻开始所经过的秒数。