话说MPICH2貌似最多只能支持10000个处理器啊,可是作业里要好多好多个,怎么办。。
//参考教程:http://mpitutorial.com/tutorials/
MPI_Init(
int* argc,
char*** argv)
MPI_Comm_size(
MPI_Comm communicator,
int* size)
MPI_Comm_rank(
MPI_Comm communicator,
int* rank)
MPI_Get_processor_name(
char* name,
int* name_length)
MPI_Finalize() //结束MPI环境,在此之后不能再进行MPI编程
MPI_Send(
void* data,
int count,
MPI_Datatype datatype,
int destination,
int tag,
MPI_Comm communicator)
MPI_Recv(
void* data,
int count,
MPI_Datatype datatype,
int source,
int tag,
MPI_Comm communicator,
MPI_Status* status)
MPI_Get_count(
MPI_Status* status,
MPI_Datatype datatype,
int* count)
//和MPI_Recv函数很像,除了不接收message,跟MPI_Recv函数一模一样,可用来获得message的MPI_Status,结合MPI_Get_count可以在接受信息之前获得message的长度。
MPI_Probe(
int source,
int tag,
MPI_Comm comm,
MPI_Status* status)
//设置了一个barrier,只有当所有processor都调用了这个函数,这些processor才能继续工作。
MPI_Barrier(MPI_Comm communicator)
//如果有N个处理器,时间复杂度是O(logN)
MPI_Bcast(
void* data,
int count,
MPI_Datatype datatype,
int root,
MPI_Comm communicator)
MPI_Wtime()//返回一个浮点数,表示过了多少时间,单位是秒
//分发
MPI_Scatter(
void* send_data,
int send_count,
MPI_Datatype send_datatype,
void* recv_data,
int recv_count,
MPI_Datatype recv_datatype,
int root,
MPI_Comm communicator)
//聚集
MPI_Gather(
void* send_data,
int send_count,
MPI_Datatype send_datatype,
void* recv_data,
int recv_count,
MPI_Datatype recv_datatype,
int root,
MPI_Comm communicator)
//color表示新的communicator的标识,相同的color会被放到同样的communicator,key表示processor在新的communicator中的rank
MPI_Comm_split(
MPI_Comm comm,
int color,
int key,
MPI_Comm* newcomm)
//从一个group里的ranks[]复制到另外一一个group
MPI_Group_incl(
MPI_Group group,
int n,
const int ranks[],
MPI_Group* newgroup)
//名字很坑爹,其实不是创建一个group而是创建一个新的communicator,包含了group里的所有processor
MPI_Comm_create_group(
MPI_Comm comm,
MPI_Group group,
int tag,
MPI_Comm* newcomm)
)
MPI_Group_intersection(
MPI_Group group1,
MPI_Group group2,
MPI_Group* newgroup)
MPI_Group_union(
MPI_Group group1,
MPI_Group group2,
MPI_Group* newgroup)
MPI笛卡尔拓扑构造(ref:http://micro.ustc.edu.cn/Linux/MPI/MPICH/)
int MPI_Cart_create(MPI_Comm comm_old, int ndims, int *dims, int *periods,
int reorder, MPI_Comm *comm_cart)
IN comm_old 输入通信子(句柄)
IN ndims 笛卡尔网格的维数(整数)
IN dims 大小为ndims的整数矩阵,说明了每一维的进程数
IN periods 大小为ndims的逻辑矩阵,说明了在每一维上网格是否是周期性 的(true)或非周期性的(false)
IN reorder 标识数可以重排序(true)或不能(false)(logical)
OUT comm_cart 带有新的笛卡尔拓扑的通信子(handle)
//看不懂
int MPI_Cart_shift(MPI_Comm comm, int direction, int disp, int *rank_source, int *rank_dest)
IN comm 带有笛卡尔结构的通信子(句柄)
IN direction 轮换的坐标维(整数)
IN disp 偏移(>0:向上轮换,<0:向下偏移)(整数)
OUT rank_source 源进程的标识数(整数)
OUT rank_dest 目标进程的标识数(整数)