• 大小: 198KB
    文件类型: .zip
    金币: 2
    下载: 0 次
    发布日期: 2024-01-27
  • 语言: 其他
  • 标签: 矩阵相乘  

资源简介

矩阵相乘并行程序设计与实现,可以实现多个线程,基于MPI平台

资源截图

代码片段和文件信息

#include “stdio.h“
#include “stdlib.h“
#include “mpi.h“

#define intsize sizeof(int)
#define floatsize sizeof(float)
#define charsize sizeof(char)
#define A(xy) A[x*K+y]
#define B(xy) B[x*N+y]
#define C(xy) C[x*N+y]
#define a(xy) a[x*K+y]
#define b(xy) b[x*n+y]
#define buffer(xy) buffer[x*n+y] /* 此宏用来简化对标号为奇数的处理器内的缓冲空间的访问 */
#define c(lxy) c[x*N+y+l*n]

float *a*b*c*buffer;
int s;
float *A*B*C;            /* A[MK]B[PN].正确的情况下K应该等于P否则无法进行矩阵相乘 */
int MNKP ;
int mn;
int myid;
int p;                     /* 保存工作站集群中处理器数目,也即通信子大小 */
FILE *dataFile;            /* 用于读取输入文件内容和将计算结果输出到结果文件的临时文件指针 */
MPI_Status status;
double time1;
double starttimeendtime;

/*
 * 函数名: readData
 * 功能:  此函数被rankID为0的进程调用,负责从dataIn.txt文件中读入
 *         A[MK]B[PN]两个相乘矩阵的数据,并为结果矩阵C[MN]分配空间。
 *         其中C[NN]=A[MK]*B[PN]
 * 输入:  无
 * 返回值:无
 */
void readData()
{
    int ij;
    starttime = MPI_Wtime();

    dataFile=fopen(“dataIn.txt““r“);
    fscanf(dataFile“%d%d“ &M &K);              /* 读取矩阵A的行,列数MK */
    A=(float *)malloc(floatsize*M*K);             /* 为矩阵A分配空间 */
    for(i = 0; i < M; i++)                        /* 读入矩阵A的各元素 */
    {
        for(j = 0; j < K; j++)
        {
            fscanf(dataFile“%f“ A+i*K+j);
        }
    }

    fscanf(dataFile“%d%d“ &P &N);              /* 读取矩阵B的行,列数PN */
    if (K!=P)                                     /* K应该等于P否则矩阵无法相乘 */
    {
        printf(“the input is wrong\n“);
        exit(1);
    }
    B=(float *)malloc(floatsize*K*N);             /* 为矩阵B分配空间 */
    for(i = 0; i < K; i++)                        /* 从文件中读入矩阵B的各元素 */
    {
        for(j = 0; j < N; j++)
        {
            fscanf(dataFile“%f“ B+i*N+j);
        }
    }
    fclose(dataFile);

    printf(“Input of file \“dataIn.txt\“\n“);
    printf(“%d\t %d\n“M K);                     /* 输出A矩阵的维数 */
    for(i=0;i    {
        for(j=0;j        printf(“\n“);
    }
    printf(“%d\t %d\n“K N);                     /* 输出B矩阵的维数 */
    for(i=0;i    {
        for(j=0;j        printf(“\n“);
    }

    C=(float *)malloc(floatsize*M*N);             /* 为结果矩阵C[MN]分配空间 */

}

/*
 * 函数名: gcd
 * 功能:  此函数用来返回两个整数的不大于group_size的最大公因子
 * 输入:  MN:要求最大公因数的两个整数
 *         group_size所求公因子必须小于此参数,此参数代表用户指定的通信子大小
 * 返回值:M和N的不大于group_size的最大公因子
 */
int gcd(int Mint Nint group_size)
{
    int i;
    for(i=M; i>0; i--)
    {
        if((M%i==0)&&(N%i==0)&&(i<=group_size))
            return i;

    }
    return 1;
}


/*
 * 函数名: printResult
 * 功能:此函数被rankID为0的进程调用,用来将ABC矩阵打印输出给用户,
 *       并输出用于分发数据和并行计算的时间
 * 输入:无
 * 返回值:无
 */
void printResult()
{
    int ij;
    printf(“\nOutput of Matrix C = AB\n“);
    for(i=0;i    {
        for(j=0;j        printf(“\n“);
    }

    endtime=MPI_Wtime();
    printf(“\

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件       86693  2017-11-03 21:42  matrix\dataIn - 副本.txt
     文件      381648  2017-11-03 22:01  matrix\dataIn.txt
     文件       86693  2017-11-03 21:42  matrix\dataIn128.txt
     文件        9506  2017-09-04 17:16  matrix\matrix.c
     文件         675  2017-09-04 17:16  matrix\readme.txt
     文件       20267  2017-11-04 01:10  matrix\时间分析表.xlsx
     目录           0  2017-11-04 01:10  matrix\

评论

共有 条评论