加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

MPI 多维数组发送与接收

(2011-05-25 10:05:24)
标签:

杂谈

分类: Research

    在设计并行程序的时候,经常要用到数据并行和任务并行。数据并行需要进行数据分解和发散,任务并行需要数据广播。大多数并行程序既有数据并行也有任务并行。
    不论是哪种,都要把数据发送到其它多个进程中。Mpi中的发送、接收、发散、收集、广播等的操作一般只支持向量或一维数组,对于多维数组,上述操作可能需要按某一维进行多次才能完成任务。但是如果仔细观察mpi函数,我们会发现,实际上mpi函数支持的不仅是向量或一维数组,它支持的是所有地址连续存放的数据。只要是地址连续存放的数据,上述mpi操作就能一次完成任务。所以,需要把多维数组按地址连续存储,方便操作。下面以前二维数据为例:
动态定义10*10二维数组的方式通常如下:
double** A=new double*[10];
for (int i=0;i<10;i++)
     A[i]=new double[10];
    我们看到这里通过多次new操作分配内存,如此定义的二维一般不可能所有元素恰好连续存储,并且A是一个二维指针,本身也需要额外的存储空间。为了连续存储数据,我们可以想到用一维数组来存放二维数据,但不方便操作。为了便于操作,可以另外再定义一个二维指针指向一维数组。方法如下:
double* A_storage=new double[10*10];
double** A=new double*[10];
for (int i=0;i<10;i++)
    A[i]=&A_storage[i*10];
    此时,数组元素就以行为主连续存储了。对数组的通常操作可以用A,与动态定义的二维数据没有任何区别。而Mpi中的发送、接收、发散、收集、广播等操作则使用A_storage,一步操作即可完成任务。

(本文转载自CSDN,特此声明。

  原文链接:http://blog.csdn.net/qshpeng/archive/2007/08/13/1741283.aspx

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有