至于单进程排序时间变少,应该是因为你用的机器的性能太好,排序 *** 作所花费的时间相对与进程通信所花费的时间并不明显,于是就出现了多进程处理比单进程处理花费的时间大很多的表象。
#include <mpi.h>#include <stdio.h>
#include <math.h>
#define SIZE 10
void main(int argc, char *argv)
{
int myid, numprocs
int data[SIZE], i, x, low, high, myresult, result
char fn[255]
char *fp
MPI_Init(&argc,&argv)
MPI_Comm_size(MPI_COMM_WORLD,&numprocs)
MPI_Comm_rank(MPI_COMM_WORLD,&myid)
if (myid == 0) { /* Open input file and initialize data */
strcpy(fn,getenv("HOME"))
strcat(fn,"/data")
if ((fp = fopen(fn,"r")) == NULL) {
printf("Can’t open the input file: %s\n\n", fn)
exit(1)
}
for(i = 0i <SIZEi++) fscanf(fp,"%d", &data[i])
}
/* broadcast data */
MPI_Bcast(data, SIZE, MPI_INT, 0, MPI_COMM_WORLD)
/* Add my portion Of data */
x = SIZE/numprocs
low = myid * x
high = low + x
if(myid == numprocs - 1) high = SIZE
myresult = 0
for(i = lowi <highi++)
myresult += data[i]
/* Compute global sum */
MPI_Reduce(&myresult, &result, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD)
if (myid == 0) printf("The sum is %d.\n", result)
MPI_Finalize()
}
并行编程模式
对等模式—程序的各个部分地位相同,功能和代码基本一致,只是处理的数据或对象不同;主从模式—程序通信进程之间的一种主从或依赖关系 。
点对点通信模式
阻塞—发送完成的数据已经拷贝出发送缓冲区,即发送缓冲区可以重新分配使用,阻塞接受的完成意味着接收数据已经拷贝到接收缓冲区,即接收方已可以使用。非阻塞—在必要的硬件支持下,可以实现计算和通信的重叠。4种通信模式:标准通信模式、缓存通信模式、同步通信模式、就绪通信模式 。
组通信
一个特定组内所有进程都参加全局的数据处理和通信 *** 作 。
功能:通信—组内数据的传输;同步—所有进程在特定的点上取得一致;计算—对给定的数据完成一定的 *** 作 。
类型:1)数据移动:广播(mpi bcast) 收集(mpi gather) 散射(mpi scater)组收集(mpi all gather)全交换(all to all);2)聚集:规约(mpi reduce)将组内所有的进程输入 缓冲区中的数据按,定 *** 作OP进行运算,并将起始结果返回到root进程的接收缓冲区扫描(mpi scan)要求每一个进程对排在它前面的进程进行规约 *** 作,结果存入自身的输出缓冲区;3)同步:路障(mpi barrier)实现通信域内所有进程互相同步,它们将处于等待状态,直到所有进程执行它们各自的MPI-BARRIER调用 。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)