哪儿有分布式多进程编程实例?

yuwei1978 2003-09-12 11:37:18
最近学习分布式系统,对MPI想有更进一步的了解,想知道哪儿有这样的实例,我可以拿来学习一下,如;在多台机器上并行计算矩阵乘法,或如何求π值等用到多进程的简单实例!
希望高手指点迷津,谢谢!
...全文
94 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuwei1978 2003-09-25
  • 打赏
  • 举报
回复
谢谢老兵朋友!
tw829 2003-09-14
  • 打赏
  • 举报
回复
关注ing
zhhuang2002 2003-09-14
  • 打赏
  • 举报
回复
呵呵,第一次看到csdn还有搞并行计算的朋友,本人用过PVM,建议去国外的网站找,比如:
http://www-unix.mcs.anl.gov/mpi/
http://www.pdc.kth.se/training/Tutor/MPI/Templates/

下面是矩阵乘法的例子
/******************************************************************************
* FILE: mm.c
* DESCRIPTION:
* In this template code, the master task distributes a matrix multiply
* operation to numtasks-1 worker tasks.
* NOTE1: C and Fortran versions of this code differ because of the way
* arrays are stored/passed. C arrays are row-major order but Fortran
* arrays are column-major order.
* AUTHOR for MPL version: Ros Leibensperger / Blaise Barney
* LAST MPL REVISED: 09/14/93 for latest API changes. Blaise Barney
* CONVERTED TO MPI: 11/12/94 by Xianneng Shen
******************************************************************************/

#include <stdio.h>
#include "mpi.h"
#define NRA 62 /* number of rows in matrix A */
#define NCA 15 /* number of columns in matrix A */
#define NCB 7 /* number of columns in matrix B */
#define MASTER 0 /* taskid of first task */
#define FROM_MASTER 1 /* setting a message type */
#define FROM_WORKER 2 /* setting a message type */

MPI_Status status;
main(int argc, char **argv)
{
int numtasks, /* number of tasks in partition */
taskid, /* a task identifier */
numworkers, /* number of worker tasks */
source, /* task id of message source */
dest, /* task id of message destination */
nbytes, /* number of bytes in message */
mtype, /* message type */
intsize, /* size of an integer in bytes */
dbsize, /* size of a double float in bytes */
rows, /* rows of matrix A sent to each worker */
averow, extra, offset, /* used to determine rows sent to each worker */
i, j, k, /* misc */
count;
double a[NRA][NCA], /* matrix A to be multiplied */
b[NCA][NCB], /* matrix B to be multiplied */
c[NRA][NCB]; /* result matrix C */

intsize = sizeof(int);
dbsize = sizeof(double);

MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &taskid);
MPI_Comm_size(MPI_COMM_WORLD, &numtasks);
numworkers = numtasks-1;

/**************************** master task ************************************/
if (taskid == MASTER) {
printf("Number of worker tasks = %d\n",numworkers);
for (i=0; i<NRA; i++)
for (j=0; j<NCA; j++)
a[i][j]= i+j;
for (i=0; i<NCA; i++)
for (j=0; j<NCB; j++)
b[i][j]= i*j;

/* send matrix data to the worker tasks */
averow = NRA/numworkers;
extra = NRA%numworkers;
offset = 0;
mtype = FROM_MASTER;
for (dest=1; dest<=numworkers; dest++) {
rows = (dest <= extra) ? averow+1 : averow;
printf(" sending %d rows to task %d\n",rows,dest);
MPI_Send(&offset, 1, MPI_INT, dest, mtype, MPI_COMM_WORLD);
MPI_Send(&rows, 1, MPI_INT, dest, mtype, MPI_COMM_WORLD);
count = rows*NCA;
MPI_Send(&a[offset][0], count, MPI_DOUBLE, dest, mtype, MPI_COMM_WORLD);
count = NCA*NCB;
MPI_Send(&b, count, MPI_DOUBLE, dest, mtype, MPI_COMM_WORLD);

offset = offset + rows;
}

/* wait for results from all worker tasks */
mtype = FROM_WORKER;
for (i=1; i<=numworkers; i++) {
source = i;
MPI_Recv(&offset, 1, MPI_INT, source, mtype, MPI_COMM_WORLD, &status);
MPI_Recv(&rows, 1, MPI_INT, source, mtype, MPI_COMM_WORLD, &status);
count = rows*NCB;
MPI_Recv(&c[offset][0], count, MPI_DOUBLE, source, mtype, MPI_COMM_WORLD,
&status);

}

/* print results */
printf("Here is the result matrix\n");
for (i=0; i<NRA; i++) {
printf("\n");
for (j=0; j<NCB; j++)
printf("%6.2f ", c[i][j]);
}
printf ("\n");

} /* end of master section */



/**************************** worker task ************************************/
if (taskid > MASTER) {
mtype = FROM_MASTER;
source = MASTER;
printf ("Master =%d, mtype=%d\n", source, mtype);
MPI_Recv(&offset, 1, MPI_INT, source, mtype, MPI_COMM_WORLD, &status);
printf ("offset =%d\n", offset);
MPI_Recv(&rows, 1, MPI_INT, source, mtype, MPI_COMM_WORLD, &status);
printf ("row =%d\n", rows);
count = rows*NCA;
MPI_Recv(&a, count, MPI_DOUBLE, source, mtype, MPI_COMM_WORLD, &status);
printf ("a[0][0] =%e\n", a[0][0]);
count = NCA*NCB;
MPI_Recv(&b, count, MPI_DOUBLE, source, mtype, MPI_COMM_WORLD, &status);
printf ("b=\n");
for (k=0; k<NCB; k++)
for (i=0; i<rows; i++) {
c[i][k] = 0.0;
for (j=0; j<NCA; j++)
c[i][k] = c[i][k] + a[i][j] * b[j][k];
}

mtype = FROM_WORKER;
printf ("after computer\n");
MPI_Send(&offset, 1, MPI_INT, MASTER, mtype, MPI_COMM_WORLD);
MPI_Send(&rows, 1, MPI_INT, MASTER, mtype, MPI_COMM_WORLD);
MPI_Send(&c, rows*NCB, MPI_DOUBLE, MASTER, mtype, MPI_COMM_WORLD);
printf ("after send\n");

} /* end of worker */
MPI_Finalize();
} /* of main */

本书是衡量所有其他分布式系统教材的标准。 --Amazon.co.uk评 本书前版已被爱丁堡大学、伊利诺伊大学、卡内基-梅隆大学、南加州大学、得克萨斯A&M大学、多伦多大学、罗切斯特理工学院、北京大学等世界众多名校采纳为高级操作系统、计算机网络、分布式系统课程的教材。 本书旨在全面介绍因特网及其他常用分布式系统的原理、体系结构、算法和设计,内容涵盖分布式系统的相关概念、安全、数据复制、组通信、分布式文件系统、分布式事务等,以及相关的前沿主题,包括web服务、网格、移动系统和无处不在系统等。   本书素材丰富、内容充实、深入浅出,每章后都有相关的习题,并有配套网站提供本书的学习和教学资源。本书可作为相关专业本科生及研究生的分布式系统课程的教材,也可供广大技术人员参考。 本书提供作译者介绍 库劳里斯,伦敦大学皇后玛利学院荣誉教授,剑桥大学计算机实验室的资深客座研究员。 在因特网和Web走向成熟、能够支持多种分布式系统之际,本书的第4版问世了。如今,分布式系统的规模已远远超过了本书第3版出版时的预期。. 本书旨在介绍因特网和其他分布式系统所蕴涵的原理、体系结构、算法和设计。前两章是概念上的简介,概括分布式系统的特征和必须在设计中解决的挑战:可伸缩性、异构性、安全性和故障处理。这两章也给出了理解进程交互、故障和安全的抽象模型。后续几章关注连网、进程间通信、远程调用和中间件、操作系统和命名。 接着,我们论及一些比较成熟的主题,包括安全、数据复制、组通信、分布式文件系统、分布式事务、CORBA、分布式共享内存和多媒体系统。此外,还会讨论一些新的主题:Web服务、XML、网格、对等、移动和无处不在系统。与这些主题相关的算法将在相关主题中讨论。我们还将另辟几章讨论时序、协调和协定。 目的和读者群 本书可作为本科生教材和研究生的入门教材,也可作为自学教材。本书采用自顶向下的方法,首先叙述在分布式系统设计中要解决的问题,然后,通过抽象模型、算法和对广泛使用的系统实例进行详细研究的方式,描述成功开发系统的方法。本书覆盖的领域有足够的宽度和广度,使得读者在读完本书后能继续研究分布式系统文献中的大多数研究论文。 本书希望读者具有面向对象编程、操作系统以及基本的计算机体系结构知识。本书涵盖与分布式系统有关的计算机网络的知识,包括因特网、广域网、局域网和无线网的基本技术。本书中的大部分算法和接口用Java描述,有一小部分用ANSI C描述。为了表述上的简洁明了,还将使用一种从Java/C中派生出来的伪代码。 本书的组织 下图表明本书的各章可划分为六个主题。它说明了本书的结构,为教师、读者提供了一个推荐的导航路径,以便于他们理解分布式系统设计中的不同子领域。 参考文献 因特网的存在改变了书(比如本书)与源材料(包括研究论文、技术规约和标准)的连接方式。现在许多源文档可从Web上获取,有一些文档甚至只能从Web上获得。出于简洁和可读性方面的考虑,本书对Web参考材料采用了一种类似于URL的特殊的格式,诸如[www.omg.org]和[www.rasecurity.com I)指的是仅能从Web上获得的文档。在本书的参考文献中可以找到它们,但是完整的URL仅在本书参考文献的联机版本(www.cdk4.net/ref3)上给出。两个版本的参考文献都有对这种机制的详细解释。 第4版所做的修改 在开始编写新版之前,我们对使用本书第3版的老师做了一个调查。我们根据调查结果来确定新内容和要做的修改。为此,编写了全新的三章,并在书中插入了很多新内容。所有的章都做了改动,以反映所描述系统可用的新信息。不过,为了帮助使用本书第3版的老师,我们仍采用了已有章节的结构。下表给出了新的章和包含实质性改变的地方。第4版删除了Mach实例研究一章,但它和其他几个从本书第2版和第3版删除的实例均可从本书的网站上获得。 致谢.. 感谢下列老师参与了我们的调查:Kay Robbins、Kohei Honda、Stefan Leue和Ian Wakeman。 感谢下列人员审阅了新增的章节或提供了其他有实质性的帮助:John Barton、Arne Glenstmp、Roy Logie、Friedemann Mattern、Christian Mortensen、Anthony Rowstron、Bo Sanden、DaveScott、Ben Smyth、Mirjana Spasojevic、Salman Taherian、Andrew Twigg、Jim Waldo、EikoYoneki、Kan Zhang和Ben Zhao。 伦敦大学Queen Mary学院计算机科学系承担了本书第3版的Web站点的建设工作,也同意承担第4版的Web站点的建设。感谢该系提供的支持以及Keith Clarke和系统小组对建立和维护网站所提供的帮助。 最后,感谢Pearson Education/Addison-Wesley的公司Simon Plumtree、Bridget Allen、MaryLince和Owen Knight为本书的出版付印全过程提供的支持。 本书网站 和以往一样,本书提供配套的网站,其中包含大量的材料,以便教师和读者教学和学习之用。读者可通过下列URL访问该网站:www.cdk4.net和www.pearsoned.co.uk/coulouris。 该Web网站包括以下内容: .1)教师指南,内容包括: ·本书的全部插图(PowerPoint文件)。 ·练习的答案(需要密码,仅对注册的教师开放)。 ·每章的教学提示。 ·建议的实验室项目。 2)参考文献列表:本书结尾的参考文献列表也可在本书网站上找到。参考文献列表的Web版本包含可联机获得的材料的Web连接。读者也可登录华章网站www.hzbook.com下载参考文献。 3)勘误表:给出书中的错误和改正清单。和本书第3版一样,错误会在再次印刷时更正,每次印刷会提供一个单独的勘误表。 4)补充材料:我们为每一章提供一套补充材料,包括书中程序的源代码和相关的阅读材料,主要是本书上一版有的但在本版中因为篇幅的缘故而被删除的内容。补充材料在本书中用类似www.cdk4.net/ipc的链接表示。 5)为使用本书的课程建立的Web网站的链接:本书第3版的Web站点包括使用本书的15个课程的链接,这样可获得大量有用的课件、幻灯片、练习和实验室项目。我们希望获得教师的允许将这些参考资料放到本书的网站中。使用本书的其他教师可向我们告知URL,以便包含在我们的链接列表中。... George Coulouris Jean Dollimore Tim Kindberg 伦敦,Bristol,2005年3月 (authors@cdk4.net)

4,356

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧