MPI群通信与矩阵乘法的Fox算法实现

本文介绍了在Windows上使用Intel MPI Library实现矩阵乘法的Fox算法。虽然MPI通常关联于Linux,但Intel的库使得在Windows上同样可以高效运行。Fox算法要求输入矩阵为方阵且进程数为平方数,通过MPI的高级语句如MPI_Bcast和MPI_Isend/MPI_Irecv提升性能,并利用MPI_Cart_create进行进程逻辑划分,简化通信子域间的交互。提供的代码示例展示了这一实现过程。
摘要由CSDN通过智能技术生成

原本以为,MPI天生只能在Linux上运行。但这次却发现了Intel MPI Library 这个好用的东西。基本不需要设置,安上之后,用自己能登录windows的帐号和密码注册就行了。虽然不是局域网上的机器,但也可以让我的双核CPU达到100%(平时开个Matlab什么的都才是50%,软件优化真是关键啊)。

FOX算法有一些恶心的要求:输入的矩阵必须是方阵,而且进程必须为平方数,方阵必须能均匀划分给每个进程。其实方阵的条件并不一定必须,只是会增加编程复杂性。

MPI中,虽然最精华的就6条语句,但仅用这6条,还是比较麻烦的。使用一些高级语句,能提高程序性能或是简化代码。

MPI_Bcast,这个是必须要提的。能把这样的语句 if (task_id == root) { send to child_id } else { recieve from root} 仅用个bcast就替换了。

MPI_Isend/MPI_Irecv是异步发送和接收的语句,显然比MPI_Send/MPI_Recv这样的阻塞语句更可能提高性能。另外,还可以避免循环死锁。当然,避免循环死锁的方法还有使用奇偶法、MPI_Sendrecv等。

虽然,理解MPI_Cart_create等一系列的笛卡尔结构操作还是有些难度的,但却是十分有用的进程逻辑功能划分方法。特别在FOX算法中,每行是个通信子域,每列也是。这样就会有n+n个子域(尽管有划分重叠),每个域的进程都仅与域中的其它进程有信息交换,这样仅用bcast一语就能传完数据。

以下是代码。比较简单。就不说明了。

//  MatrixMulFox.cpp
//  Jarod 2007.12.3

#include 
" mpi.h "

#include 
< algorithm >
#include 
< fstream >
#include 
< cmath >

const   int  root_id  =   0 ;
const   int  max_procs_size  =   16 ;

int  main( int  argc, char   * argv[])
{
    
double start_time, end_time, time;
    
int procs_id, procs_size;
    MPI_Status status;
    MPI_Request reqSend, reqRecv;
    MPI_Init(
&argc,&argv);
    start_time 
= MPI_Wtime();
    MPI_Comm_size(MPI_COMM_WORLD,
&procs_size);
    MPI_Comm_rank(MPI_COMM_WORLD,
&procs_id);

    
// 参数检查
    int N=0;
    
{
        
for (int i=1; i<argc; ++i ) {
            
char * pos =strstr(argv[i], "-N=");
            
if ( pos!=NULL) 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值