博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
矩阵乘法-分块计算
阅读量:5952 次
发布时间:2019-06-19

本文共 2207 字,大约阅读时间需要 7 分钟。

将整个矩阵分解为这样的小块,每次完成一对小块的计算,以提高Cache的命中率。

提示:
 

图中n=N/m
计算次序为A11*B11, A11*B12,…, A11*B1n,,由于反复使用A11,因此可以提高Cache的命中率。

/*矩阵分开计算C=A*B  --- C(i,j)等于A的第i行乘以第j列*/#include 
#include
#include
#include
#include
/* 生成n*n矩阵*/void GenerateMatrix(float *m, int n);void PrintMatrix(float *p, int n);void GeneralMul(float *A, float *B, float *C, int n);void ClearMatrix(float *m, int n);/* 矩阵分块计算*/void BlockCacul(float *A, float *B, float *C, int n, int thread_num, int m);/* 两个矩阵的误差*/float diff(float *C1, float *C0, int n);struct ARG { float *A; int ax, ay; float *B; int bx, by; float *C; int cx, cy; int m; int n;};int main(int argc, char **argv){ if (argc != 4) { printf("Usage: %s N thread_num M\n", argv[0]); return 0; } int n=atoi(argv[1]); int thread_num = atoi(argv[2]); int m = atoi(argv[3]); float *A = new float[n*n]; float *B = new float[n*n]; float *C = new float[n*n]; float *C0 = new float[n*n]; GenerateMatrix(A, n); GenerateMatrix(B, n); clock_t start; float time_used; ClearMatrix(C0, n); start=clock(); GeneralMul(A, B, C0, n); time_used = static_cast
(clock() - start)/CLOCKS_PER_SEC*1000; printf("General: time = %f\n", time_used); ClearMatrix(C, n); start=clock(); BlockCacul(A, B, C, n, thread_num, m); time_used = static_cast
(clock() - start)/CLOCKS_PER_SEC*1000; printf("Block: time = %f\n", time_used); printf("Difference of two result: %f\n", diff(C0, C, n)); delete [] A; delete [] B; delete [] C; delete [] C0; return 0;}void ClearMatrix(float *m, int n){ for (int i=0; i
A; float *B = p->B; float *C = p->C; int m = p->m; int n = p->n; for (int i=0; i
cx)*n+p->cy+j; for (int k=0; k
ax+i)*n+p->ay+k]*B[(p->bx+k)*n+p->by+j]; } } } return 0;}void BlockCacul(float *A, float *B, float *C, int n, int thread_num, int m){ //m = static_cast
(sqrt(m)); struct ARG *args = new struct ARG[thread_num]; HANDLE *handle = new HANDLE[thread_num]; int t=0; int i; for (i=0; i
(rand())/ (static_cast
(rand())+ static_cast
(0.55)); p++; }}float diff(float *C1, float *C0, int n){ float rst=0.0; float t; for (int i=0; i

 

转载地址:http://zboxx.baihongyu.com/

你可能感兴趣的文章
使用Remix编译和部署以太坊智能合约
查看>>
浏览器同源策略,及跨域解决方案
查看>>
响应式编程在Android 中的一些探索
查看>>
Node连接MySQL并封装其增删查改
查看>>
是时候该了解一波Protocol Buffers了[Java]
查看>>
查找算法:顺序查找
查看>>
RxSwift中Observable的各种创建方法
查看>>
【刘文彬】 Controller:EOS区块链核心控制器
查看>>
大数据开发套件DataIDE使用教程
查看>>
react-navigation使用介绍及UI组件外实现统一跳转
查看>>
RN与原生交互(二)——数据传递
查看>>
程序员必备技能-科学砍需求
查看>>
《记》rxjs分流操作符简单实现
查看>>
阿里开源 iOS 协程开发框架 coobjc源码分析
查看>>
【译】Effective TensorFlow Chapter11——在TensorFlow中调试模型
查看>>
Oracle · 一些实用语法
查看>>
源码阅读:SDWebImage(五)——SDWebImageFrame
查看>>
Webpack 10分钟入门
查看>>
自定义元素探秘及构建可复用组件最佳实践
查看>>
如何做好数据分析师的职业规划?
查看>>