MPI用MPI_Send, MPI_Recv实现MPI_Alltoall的块方法
来源:互联网 发布:获取淘宝买家手机号 编辑:程序博客网 时间:2024/06/03 19:36
用了一个多小时,终于搞定用MPI_Send, MPI_Recv实现MPI_Alltoall,网上的类似的源码都是转置单个元素,想按块转置真不容易。首先科普一下什么是MPI_Alltoall, MPI的n个进程,一个进程有n个块,如果块只包含一个元素,则形成N*N的矩阵,MPI_Alltoall要做的是转置这个矩阵,即第i 个进程的第j块发送到第j个进程的第i块。废话不多,上源码。
#include "mpi.h"#include "stdio.h"int My_Alltoall(void *sendBuffer,int sendcnt,MPI_Datatype sendtype, void *receiveBuffer,int recvcnt,MPI_Datatype recvtype,MPI_Comm comm,int rank,int size){ int i,j; MPI_Status status; for(i=0;i<size;i++) { if(rank==i) { MPI_Sendrecv(sendBuffer+(sendcnt*i)*sizeof(sendtype),sendcnt,sendtype,i,99,receiveBuffer+(recvcnt*i)*sizeof(recvtype),recvcnt,recvtype,i,99,comm,&status); } } for(i=0;i<size;i++) { if(rank!=i) { MPI_Send(sendBuffer+(sendcnt*i)*sizeof(sendtype),sendcnt,sendtype,i,i,comm); } } for(i=0;i<size;i++) { if(rank!=i) { MPI_Recv(receiveBuffer+(recvcnt*i)*sizeof(recvtype),recvcnt,recvtype,i,rank,comm,&status); } }return 1;}int main (int argc, char *argv[]){ int i, myrank, size; int *send_buffer; int *recv_buffer; MPI_Init (&argc, &argv); MPI_Comm_rank (MPI_COMM_WORLD, &myrank); MPI_Comm_size (MPI_COMM_WORLD, &size); size = size *2; send_buffer = (int *) calloc (size, sizeof (int)); recv_buffer = (int *) calloc (size, sizeof (int)); for (i = 0; i < size; i++) send_buffer[i] = i+myrank*size; My_Alltoall (send_buffer, 2, MPI_INT, recv_buffer, 2, MPI_INT, MPI_COMM_WORLD,myrank,size/2); for(i=0;i<size;i++){ printf("myrank=%d,sendbuf[%d]=%d\n",myrank,i,send_buffer[i]); } for (i = 0; i < size; i++) printf ("myrank = %d, recv_buffer[%d] = %d\n", myrank, i, recv_buffer[i]); free (recv_buffer); free (send_buffer); MPI_Finalize (); return 0;}
0 0
- MPI用MPI_Send, MPI_Recv实现MPI_Alltoall的块方法
- 采用MPI_Send 和MPI_Recv 编写代码来实现包括MPI_Bcast、MPI_Alltoall、MPI_Gather、MPI_Scatter 等MPI 群集通信函数的功能
- MPI程序例子 test_8_1_2.c -- 对等模式的MPI程序,Jacobi迭代 (MPI_Send、MPI_Recv)
- MPI程序例子:对等模式的MPI程序,Jacobi迭代 (MPI_Send、MPI_Recv)
- 用MPI_Send和MPI_Recv实现简单集群通信函数
- 我的并行计算之路(二)MPI点对点通信MPI_Send和MPI_Recv
- 采用 MPI_Send 和 MPI_Recv 编写代码来实现 MPI_Allgather 的功能
- Example-2-MPI_Scatterv,MPI_Send,MPI_Recv
- 关于MPI_Send与MPI_Recv语义
- MPI_Send和MPI_Recv影响下程序的执行顺序是怎样的?
- MPI_Send和MPI_Recv(初识1)
- mpi中MPI_Isend()与MPI_Send()的一点区别
- MPI_Alltoall
- MPI_Recv
- MPI矩阵乘法的两种实现方法
- MPI_Send的缓冲区大小问题
- 枚举排序的MPI实现
- FOX算法的MPI实现
- Unity3d 一个优秀的程序必备的几种设计模式
- LUA和C/C++交互-注册回调函数
- android--欢迎界面
- mysql + sql Server 存储过程
- MZ Training 2014 #5 D题
- MPI用MPI_Send, MPI_Recv实现MPI_Alltoall的块方法
- 撰拙纂组宗坠奏桌走谆卓字纂仔柞妆妆浊
- 简易电老鼠整个流程
- 关于大端和小端的起源
- SSH配置
- EasyMock 单元测试过程中模拟相关类的实例
- 基于注解的Spring MVC 框架搭建及配置详解
- 关节会发出响声
- svn常用命令