一个多线程计算矩阵程序
2014-04-19 23:05
232 查看
文章引用了部分代码;http://www.cnblogs.com/zhangchaoyang/articles/1853822.html
以下是我的代码
1、多线程的代码
下面是测试结果,矩阵1000乘1000
以下是我的代码
1、多线程的代码
#include<stdio.h> #include<time.h> #include<pthread.h> #include<stdlib.h> #include<unistd.h> #include<memory.h> /*定义矩阵中元素的上限,避免相乘后溢出*/ #define RANGE 100 /*矩阵A有M行N列,矩阵B有N行M列*/ #define M 1000 #define N 1000 #define P 500 int pthred_count=8; void gene_matrix(); void read_matrix(); void *a11_b11();//1 void *a12_b21();//2 void *a11_b12();//3 void *a12_b22();//4 void *a21_b11();//5 void *a22_b21();//6 void *a21_b12();//7 void *a22_b22();//8 void output_result(); int matrixA[M] ; int matrixB [M]; int matrixResult1[M] ={0}; int matrixResult2[M] ={0}; //int arr[pthred_count][M] ; void *func(void *arg); main() { gene_matrix(); //用随机数产生两个待相乘的矩阵,并分别存入两个文件中 read_matrix(); //从两个文件中读出数据赋给matrixA和matrixB clock_t start=clock(); //开始计时 int res[M] ={0}; //保存矩阵相乘的结果。非全局变量一定要显示初始化为0,否则为随机的一个数 int i=0,j,k; pthread_t tids[8]; pthread_create(&tids[0],NULL,a11_b11,NULL); pthread_create(&tids[1],NULL,a12_b21,NULL); pthread_create(&tids[2],NULL,a11_b12,NULL); pthread_create(&tids[3],NULL,a12_b22,NULL); pthread_create(&tids[4],NULL,a21_b11,NULL); pthread_create(&tids[5],NULL,a22_b21,NULL); pthread_create(&tids[6],NULL,a21_b12,NULL); pthread_create(&tids[7],NULL,a22_b22,NULL); for(i=0;i<8;i++) pthread_join(tids[i],NULL); //合之前一定要等所有的子线程计算结束 int ii,jj; for(ii=0;ii<M;ii++) for(jj=0;jj<N;jj++) matrixResult1[ii][jj]+=matrixResult2[ii][jj]; //output_result(); //输出最后的计算结果 clock_t finish=clock(); //结束计算时的时间 printf("time is %.2f seconds\n",(long)(finish-start)/1E6); exit(0); } //下面的八个函数分别计算两个矩阵相乘时的每一个块 void *a11_b11()//1 { int i,j,k; for(i=0;i<P;i++) for(j=0;j<P;j++) for(k=0;k<P;k++) matrixResult1[i][j]+=matrixA[i][k]*matrixB[k][j]; } void *a12_b21()//2 { int i,j,k; for(i=0;i<P;i++) for(j=0;j<P;j++) for(k=0;k<P;k++) matrixResult2[i][j]+=matrixA[i][k+P]*matrixB[k+P][j]; } void *a11_b12()//3 { int i,j,k; for(i=0;i<P;i++) for(j=0;j<P;j++) for(k=0;k<P;k++) matrixResult1[i][j+P]+=matrixA[i][k]*matrixB[k][j+P]; } void *a12_b22()//4 { int i,j,k; for(i=0;i<P;i++) for(j=0;j<P;j++) for(k=0;k<P;k++) matrixResult2[i][j+P]+=matrixA[i][k+P]*matrixB[k+P][j+P]; } void *a21_b11()//5 { int i,j,k; for(i=0;i<P;i++) for(j=0;j<P;j++) for(k=0;k<P;k++) matrixResult1[i+P][j]+=matrixA[i+P][k]*matrixB[k][j]; } void *a22_b21()//6 { int i,j,k; for(i=0;i<P;i++) for(j=0;j<P;j++) for(k=0;k<P;k++) matrixResult2[i+P][j]+=matrixA[i+P][k+P]*matrixB[k+P][j]; } void *a21_b12()//7 { int i,j,k; for(i=0;i<P;i++) for(j=0;j<P;j++) for(k=0;k<P;k++) matrixResult1[i+P][j+P]+=matrixA[i+P][k]*matrixB[k][j+P]; } void *a22_b22()//8 { int i,j,k; for(i=0;i<P;i++) for(j=0;j<P;j++) for(k=0;k<P;k++) matrixResult2[i+P][j+P]+=matrixA[i+P][k+P]*matrixB[k+P][j+P]; } void gene_matrix() { FILE *file1,*file2; if((file1=fopen("/home/matrixA","w+"))==NULL) { perror("fopen"); exit(1); } if((file2=fopen("/home/matrixB","w+"))==NULL) { perror("fopen"); exit(1); } int i,j; srand((unsigned)time(NULL)); for(i=0;i<M;i++) { for(j=0;j<N;j++) fprintf(file1,"%-8d",rand()%RANGE); fprintf(file1,"\n"); } fclose(file1); for(i=0;i<N;i++) { for(j=0;j<M;j++) fprintf(file2,"%-8d",rand()%RANGE); fprintf(file2,"\n"); } fclose(file2); } void read_matrix() { FILE *file1,*file2; if((file1=fopen("/home/matrixA","rt"))==NULL) { perror("fopen"); exit(1); } if((file2=fopen("/home/matrixB","rt"))==NULL) { perror("fopen"); exit(1); } int i,j; for(i=0;i<M;i++) for(j=0;j<N;j++) fscanf(file1,"%d",&matrixA[i][j]); fclose(file1); for(i=0;i<N;i++) for(j=0;j<M;j++) fscanf(file2,"%d",&matrixB[i][j]); fclose(file2); } //输出最后的计算结果 void output_result() { int ii,jj; for(ii=0;ii<M;ii++) {for(jj=0;jj<N;jj++) printf("%d ",matrixResult1[ii][jj]); printf("\n");} }2、串行代码
#include<stdio.h> #include<time.h> #include<pthread.h> #include<stdlib.h> #include<unistd.h> #include<memory.h> /*定义矩阵中元素的上限,避免相乘后溢出*/ #define RANGE 100 /*矩阵A有M行N列,矩阵B有N行M列*/ #define M 1000 #define N 1000 void gene_matrix(); void read_matrix(); int matrixA[M] ; int matrixB [M]; //int arr[M][M] ; //void *func(void *arg); main() { gene_matrix(); //用随机数产生两个待相乘的矩阵,并分别存入两个文件中 read_matrix(); //从两个文件中读出数据赋给matrixA和matrixB clock_t start=clock(); //开始计时 int res[M] ={0}; //保存矩阵相乘的结果。非全局变量一定要显示初始化为0,否则为随机的一个数 int i,j,k; for(i=0;i<M;i++) for(j=0;j<M;j++) for(k=0;k<N;k++) res[i][j]+=matrixA[i][k]*matrixB[k][j]; clock_t finish=clock(); //结束计算 printf("time is %.2f seconds\n",(long)(finish-start)/1E6); exit(0); } void gene_matrix() { FILE *file1,*file2; if((file1=fopen("/home/matrixA","wt"))==NULL) { perror("fopen"); exit(1); } if((file2=fopen("/home/matrixB","wt"))==NULL) { perror("fopen"); exit(1); } int i,j; srand((unsigned)time(NULL)); for(i=0;i<M;i++) { for(j=0;j<N;j++) fprintf(file1,"%-8d",rand()%RANGE); fprintf(file1,"\n"); } fclose(file1); for(i=0;i<N;i++) { for(j=0;j<M;j++) fprintf(file2,"%-8d",rand()%RANGE); fprintf(file2,"\n"); } fclose(file2); } void read_matrix() { FILE *file1,*file2; if((file1=fopen("/home/matrixA","rt"))==NULL) { perror("fopen"); exit(1); } if((file2=fopen("/home/matrixB","rt"))==NULL) { perror("fopen"); exit(1); } int i,j; for(i=0;i<M;i++) for(j=0;j<N;j++) fscanf(file1,"%d",&matrixA[i][j]); fclose(file1); for(i=0;i<N;i++) for(j=0;j<M;j++) fscanf(file2,"%d",&matrixB[i][j]); fclose(file2); }
下面是测试结果,矩阵1000乘1000
相关文章推荐
- 稀疏矩阵A和B,其行数和列数对应相等,编写一个程序,计算A和B之和,假设稀疏矩阵采用三元组表示
- 一个根据断点续传原理而实现的多线程下载的程序
- 在同一个根目录下,给出一个〖参照路径〗,计算〖当前程序目录〗与〖参照路径〗的相对路径
- 设M 是一个m×n 的矩阵,其中每行的元素从左到右单增有序,每列的元素从上到下单增有序。 给出一个分治算法计算出给定元素x 在M 中的位置或者表明x 不在M 中。分析算法的时间复杂性。
- 一个世界上最懒惰的程序员写的Cache也能让你的复杂计算程序(数据库程序)大大提高速度
- 一个很牛的计算pi的c程序!
- 一个不能编译通过的多线程示例程序
- 问题:设计一个大学教师和学生管理程序, 教师包括 编号、姓名、职称和教研室 数据的输入输出; 大学生包括编号、姓名、性别、班号、英语、高等数学和数据结构三门课程成绩的输入输出和计算平均分; 研究生包
- 一个文本字符串相似度计算的小程序
- 开源:给每个文档计算一个指纹,然后用指纹进行相似度的计算 含源码和可执行程序
- 一个字母频率分析计算小程序
- 黑马程序员—编写程序,该程序启动后用户可以按“yyyy-MM-dd”的格式输入一个日期, *程序计算这一天是星期几,并且计算出是一年中的第几天。 */
- 1.已知接口ComputerAverage,和主类Estimator,编写程序完成SongGame和School类。SongGame类能够根据歌手得分去掉一个最高分,去掉一个最低分,计算其余得分的平均
- 一个Nodejs的简单计算測试程序
- 编写一个程序,实现设置上月、本月电表读数,显示上月、本月电表读数,计算并显示本月用电数。 假设每度电的价格为1.2元,计算并显示本月电费
- 编写一个在1,2,…,9(顺序不能变)数字之间插入+或-或什么都不插入,使得计算结果总是100的程序,并输出所有的可能性。例如:1 + 2 + 34–5 + 67–8 + 9 = 100。
- selenium:7.一个超级简单的多线程程序
- mahout计算一个简单的推荐程序的准确率和召回率
- 每日一个C++小程序(五)--根据坐标求矩阵面积
- 编写一个在1,2,…,9(顺序不能变)数字之间插入+或-或什么都不插入,使得计算结果总是100的程序,并输出所有的可能性。