资源简介
通过减少问题规模形式,做并行计算,求解矩阵相乘问题,mpi,MPI,思想是将第一个矩阵分块,每个进程只计算矩阵的几行,最终传给主进程吗、,主进程输出结果
代码片段和文件信息
#include
#include
#include
#include
#include
#include
#define N 8192 //矩阵的阶数
#define MASTER 0 //主进程号
#define FROM_MASTER 1 //设置消息类型
#define FROM_WORKER 2 //设置消息类型
MPI_Status status;
void main(int argcchar **argv)
{
int numtasks //进程总数
taskid //进程标识
numworkers //从进程数目
source //消息源
dest //消息目的地
nbytes
mtype //消息类型
rows
averowextraoffset //从进程所分的行数
ijkt
count;
double A[N][N]B[N][N];
long long C[N][N];
long long sumand = 0; //求的乘积矩阵的所有元素的和
double starttimeendtime;
MPI_Init(&argc&argv); // 初始化MPI环境
MPI_Comm_rank(MPI_COMM_WORLD&taskid);//标识各个MPI进程 ,告诉调用该函数进程的当前进程号
MPI_Comm_size(MPI_COMM_WORLD&numtasks);//用来标识相应进程组中有多少个进程
numworkers = numtasks-1; //从进程数目
/* 程序采用主从模式,以下为主进程程序 */
if(taskid==MASTER)
{
printf(“--------主进程开始对矩阵A、B初始化\n“);
//对A矩阵B矩阵 进行初始化赋值
for(i=0;i {
t = i + 1;
for(j=0;j {
A[i][j]= t ++ ;
B[i][j]= 1;
}
}
printf(“--------主进程开始对从进程发送数据\n“);
starttime = MPI_Wtime();
/*将数据(A矩阵B矩阵)发送到从进程*/
averow=N/numworkers; // 每个从进程所得到的行数
extra=N%numworkers;
offset=0;
mtype=FROM_MASTER;
for(dest=1;dest<=numworkers;dest++)
{
rows=(dest<=extra)? averow+1:averow;
//发送标识每个从进程开始寻找数据矩阵的偏移地址
MPI_Send(&offset1MPI_INTdestmtypeMPI_COMM_WORLD);
//发送每个从进程需要计算的行数
MPI_Send(&rows1MPI_INTdestmtypeMPI_COMM_WORLD);
//发送每个从进程 count=rows*N 比特流偏移量
count=rows*N;
//发送 矩阵 A
MPI_Send(&A[offset][0]countMPI_DOUBLEdestmtypeMPI_COMM_WORLD);
- 上一篇:scidavis 的中文汉化包
- 下一篇:基于鱼群算法优化BP神经网络
评论
共有 条评论