MPI编程学习
on Learning
张永东老师的《高性能计算》课程代码 |
MPI编程
6.同步
int MPI_Barrier(MPI_Comm comm)
// MPI_Comm comm 通信子
实例
#include<stdio.h>
#include<mpi.h>
int main(int argc, char **argv)
{
int myid, numprocs;
double start, finish;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &myid);
MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
//your code here
MPI_Barrier(MPI_COMM_WORLD);
//阻止调用直到communicator中所有进程已经完成调用,就是说,任意一次进程的调用只能在所有communicator中的成员已经开始调用之后进行。
//end of your code
start = MPI_Wtime();
printf("The precision is: %f\n", MPI_Wtick());
finish = MPI_Wtime();
printf("Hello World!I'm rank %d of %d, running %f seconds.\n", myid, numprocs, finish-start);
MPI_Finalize();
return 0;
}
7.消息传递
int MPI_Send(void* msg_buf_p, int msg_size, MPI_Datatype msg_type, int dest, int tag, MPI_Comm comm)
int MPI_Recv(void* msg_buf_p, int buf_size, MPI_Datatype msg_type, int source, int tag, MPI_Comm communicator, MPI_Status *status_p)
void* msg_buf_p : 发送缓冲区的起始地址; int buf_size : 缓冲区大小; MPI_Datatype msg_type : 发送信息的数据类型; int dest :目标进程的id值; int tag : 消息标签; MPI_Comm communicator : 通信子;
#include <stdio.h>
#include <mpi.h>
int main(int argc, char **argv)
{
int myid, numprocs, source;
MPI_Status status;
char message[100];
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &myid);
MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
if(myid != 0) {
strcpy(message, "hello world!");
//your code here
MPI_Send(message, strlen(message)+1, MPI_CHAR, 0, 99, MPI_COMM_WORLD);
//end of your code
}
else { //myid == 0
for(source=1; source<numprocs; source++) {
//your code here
MPI_Recv(message, 100, MPI_CHAR, source, 99, MPI_COMM_WORLD, &status);
//end of your code
printf("%s\n", message);
}
}
MPI_Finalize();
return 0;
}
8. 地址偏移量
int MPI_Address(void* location, MPI_Aint *address)
用法: MPI_Address(&a, &address1);
9. 数据打包
int MPI_Pack(void* inbuf, int incount, MPI_datatype datatype, void *outbuf, int outcount, int *position, MPI_Comm comm) void* inbuf : 输入缓冲区地址; int incount :输入数据项数目; MPI_datatype datatype :数据项的类型; void *outbuf :输出缓冲区地址; int outcount :输出缓冲区大小; int *position :缓冲区当前位置; MPI_Comm comm :通信子;
int MPI_Unpack(void* inbuf, int insize, int *position, void *outbuf, int outcount, MPI_Datatype datatype, MPI_Comm comm) void* inbuf : 输入缓冲区地址; int insize :输入数据项数目; MPI_datatype datatype :数据项的类型; void *outbuf :输出缓冲区地址; int outcount :输出缓冲区大小; int *position :缓冲区当前位置; MPI_Comm comm :通信子;
#include <stdio.h>
#include <mpi.h>
int main(int argc, char **argv)
{
int myid, numprocs, source;
MPI_Status status;
int i, j, position;
int k[2];
int buf[1000];
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &myid);
MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
i = 1;
j = 2;
if(myid == 0) {
position = 0 ;
// your code here
MPI_Pack(&i, 1, MPI_INT, buf, 1000, &position, MPI_COMM_WORLD);
MPI_Pack(&j, 1, MPI_INT, buf, 1000, &position, MPI_COMM_WORLD);
// end of your code
MPI_Send(buf, position, MPI_PACKED, 1, 99, MPI_COMM_WORLD);
}
else if (myid == 1){
MPI_Recv(k, 2, MPI_INT, 0, 99, MPI_COMM_WORLD, &status);
position = 0 ;
MPI_Unpack(k, 2, &position, &i, 1, MPI_INT, MPI_COMM_WORLD);
MPI_Unpack(k, 2, &position, &j, 1, MPI_INT, MPI_COMM_WORLD);
printf("The number is %d and %d", i, j);
}
MPI_Finalize();
return 0;
}