请问要怎样用并行运算实现矩阵乘法?

请问要怎样用并行运算实现矩阵乘法?,第1张

OpenMP版本:

#include <stdlib.h>

#include <stdio.h>

#include <omp.h>

#include <time.h>

#define A 1024

#define B 1024

#define C 1024

//第一个A*B矩阵

int mat1[A][B]

//第二个B*C矩阵的转置(转置是为了更高的cache hit rate)

int mat2inv[C][B]

//保存结果的运清漏矩阵

int matret[A][C]

int nThreads=omp_get_num_procs()

//保存第一个矩阵数据的文件名

char file1name[] = "i1"

//保存第二个矩阵数据的文件名

char file2name[] = "i2"

int main(){

omp_set_num_threads(nThreads)

printf("nThreads=%d\n",nThreads)

//读入正行数据

printf("Reading files...")

FILE* f =fopen(file1name,"rb")

fread((void*)mat1,sizeof(int),A*B,f)

fclose(f)

f = fopen(file2name,"rb")

for (int b=0b<Bb++){

for (int c=0c<Cc++){

fread((void*)&(mat2inv)[c][b],sizeof(int),1,f)

}

}

fclose(f)

printf("ok\n")

//计算

printf("Computing...")

clock_t clk = clock()

int temp

#pragma omp parallel

{

//针对第一个矩阵的行并行

#pragma omp for private(temp)

for (int a=0a<Aa++){

for (int c=0c<Cc++){

temp=0

for (int b=0b<Bb++){

temp+=mat1[a][b]*mat2inv[c][b]

}

matret[a][c]=temp

}

}

}

clock_t clke = clock()

printf("ok within %ld ms\n",(clke-clk)*1000/CLOCKS_PER_SEC)

//写回文件

printf("Writing to file..."旁烂)

f = fopen("o","wb")

fwrite((void*)matret,sizeof(int),A*C,f)

fclose(f)

printf("ok\n")

return 0

}

1、程序运行输入数据时,第一辩基行为A矩阵的行列数和B矩阵的行列数,接着分别输入A、B两个矩阵的值。

2、首先,定义6个整型变量,保存A、B矩阵的行和列,以及控制循环的变量,k则用于实现矩阵的乘法

3、接着,定义三个整型二维数组,保存A、B和C矩阵的各元素。

4、输入三个矩阵的行数和列数,保存在变量a、b、c中。

5、输入矩阵A的各元素,保存在数组X中。

6、输入矩阵B的各元素,保存在数组Y中。

7、将二维数组Z的各元素,初始化为0。

8、携旁谨用两层for循环,控制矩阵的乘法,并输出乘法所得的结果。

9、计算A矩阵和B矩阵的乘法,结果保存在数组Z中。

10、最后,输出启唯乘法所得的结果,即输出Z数组中的所有元素。

11、运行程序,输入矩阵A和B的行数和列数,以及A矩阵和B矩阵的所有元素,电脑就会计算出乘积C矩阵的所有元素,并输出C矩阵。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8283649.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-15
下一篇 2023-04-15

发表评论

登录后才能评论

评论列表(0条)

保存