#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矩阵。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)