c++的矩阵乘法加速trick

最近读RNNLM的源代码,发现其实现矩阵乘法时使用了一个trick,这里描述一下这个trick。

首先是正常版的矩阵乘法(其实是矩阵乘向量)

void matrixXvector(float* destvect, float* srcmatrix, int srcmatrix_rownum, int srcmatrix_colnum, float* srcvect, int srcvect_size){for(int row=0;row<srcmatrix_rownum;++row){destvect[row]=0;for(int col=0;col<srcmatrix_colnum;++col){destvect[row]+=srcmatrix[row*srcmatrix_colnum+col]*srcvect[col];}}
}

就是最简单的for循环,逐行逐列遍历。

接下来是RNNLM中实现的trick版本

void matrixXvector2(float* destvect, float* srcmatrix, int srcmatrix_rownum, int srcmatrix_colnum, float* srcvect, int srcvect_size){int row, col;float val1, val2, val3, val4;float val5, val6, val7, val8;for(row=0;row<srcmatrix_rownum/8;++row){val1 = 0;val2 = 0;val3 = 0;val4 = 0;val5 = 0;val6 = 0;val7 = 0;val8 = 0;for(col=0;col<srcmatrix_colnum;++col){val1+=srcmatrix[(row*8+0)*srcmatrix_colnum+col]*srcvect[col];val2+=srcmatrix[(row*8+1)*srcmatrix_colnum+col]*srcvect[col];val3+=srcmatrix[(row*8+2)*srcmatrix_colnum+col]*srcvect[col];val4+=srcmatrix[(row*8+3)*srcmatrix_colnum+col]*srcvect[col];val5+=srcmatrix[(row*8+4)*srcmatrix_colnum+col]*srcvect[col];val6+=srcmatrix[(row*8+5)*srcmatrix_colnum+col]*srcvect[col];val7+=srcmatrix[(row*8+6)*srcmatrix_colnum+col]*srcvect[col];val8+=srcmatrix[(row*8+7)*srcmatrix_colnum+col]*srcvect[col];}destvect[row*8+0]+=val1;destvect[row*8+1]+=val2;destvect[row*8+2]+=val3;destvect[row*8+3]+=val4;destvect[row*8+4]+=val5;destvect[row*8+5]+=val6;destvect[row*8+6]+=val7;destvect[row*8+7]+=val8;}for(row=row*8;row<srcmatrix_rownum;++row){for(col=0;col<srcmatrix_colnum;++col){destvect[row]+=srcmatrix[row*srcmatrix_colnum+col]*srcvect[col];    }}
}

对比普通版,trick版把遍历行的for循环分成了8份,同时进行列遍历。

实际测试中,这个trick版比普通版快了接近2倍~这是编译器优化造成的么……?

参考:http://www.cnblogs.com/plwang1990/p/4139357.html

c++的矩阵乘法加速trick相关推荐

  1. 基于PYNQ-Z2开发板实现矩阵乘法加速详细流程

    基于PYNQ-Z2开发板实现矩阵乘法加速 主要内容 1.在Vivado HLS中生成矩阵乘法加速的IP核. 2.在Vivado中完成Block Design. 3.在Jupyter Notebook上 ...

  2. BZOJ 1009 GT考试 (AC自动机 + 矩阵乘法加速dp)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1009 题意: 准考证号为\(n\)位数\(X_1X_2....X_n(0<=X_ ...

  3. 利用硬件实现矩阵乘法加速

    对于绝大多数程序员来说,优化程序往往是在算法方面.但了解一定的计算机硬件知识后,可以隐式地优化程序.下面以矩阵乘法为例,探讨计算机硬件在程序优化中的作用. 原理 学过计算机组成原理的都知道,CPU访问 ...

  4. P1306-斐波那契公约数【矩阵乘法,数论】

    正题 题目链接: https://www.luogu.org/problemnew/show/P1306 题目大意 求出第x项和第y项斐波那契额数的最大公约数. 解题思路 首先第x项和第y项斐波那契额 ...

  5. SPOJ 1676 矩阵乘法+DP

    题意: 给定N (1 ≤ N ≤ 10)个长度不超过6的单词,求由大写字母组成长度为L的包含至少一个给定单词的字符串有多少种,答案 mod 10007,(1 ≤ L ≤ 10^6). 题解: 这个题最 ...

  6. 【矩阵乘法】JZOJ_4787 数格子

    题意 求出用 2 × 1 2\times 1 2×1的牌填满 4 × N 4\times N 4×N的矩形方案数% M M M. 思路 可以打表,得出 1 , 5 , 11 , 36 , 95 1,5 ...

  7. jzoj4787-[NOIP2016提高A组模拟9.17]数格子【矩阵乘法】

    正题 题目大意 求 1 × 2 1\times 2 1×2的方块铺满 4 × n 4\times n 4×n的方格方案总数. 解题思路 首先 当计算 f n f_n fn​时, 显然最后一排可以 ( ...

  8. bzoj2126 排斥反应 矩阵乘法

    发现p很小而q很大..矩阵乘法这么明显的提示. 不过转化还是很巧妙的.将所有的数变成p行q列的矩阵,然后就变成求从中取出一些点使得没有点相邻(包括同一行的最前面和最后面也算相邻). 首先可以得到某一列 ...

  9. 矩阵乘法(超详细!!!)

    矩阵是什么? 是一个数字阵列,一个二维数组,n行r列的阵列称为n*r矩阵.如果n==r则称为方阵. 2×3矩阵 5×5方阵 特殊的单位矩阵,除了对角线为1,其他位置为0的矩阵.类似乘法中的1. 3×3 ...

最新文章

  1. 《数据结构》之数组结构和链表
  2. 我对STL的一些看法(一)初步认识STL
  3. jqGrid专题:jqGrid原理
  4. 树莓派外接显示器黑屏_解决树莓派使用HDMI-VGA转换器黑屏的方案
  5. 地下迷宫探索 (30 分)(DFS)
  6. 囧。。。不知不觉破解了IDMan。。。木有注意最后一步咋破的。。。
  7. scala 如何读取 csv 文件
  8. java gdal开源库_基于GDAL库,读取.grd文件(以海洋地形数据为例)Java版
  9. 哪个求职App最容易找到好工作?2019在线求职招聘市场研究报告
  10. 便宜好用积分兑换商城系统必须具备这些功能
  11. js实现整体,局部刷新
  12. BYTE,WORD,DWORD
  13. 数学建模|预测方法:马尔科夫预测
  14. 用MATLAB的函数scatter()绘制散点图
  15. ILRuntime篇:前言
  16. mysql删除大表更快的drop table办法(转老金)
  17. 【已解决】连接被重置
  18. SPI全双工通信解读和调试问题分析汇总
  19. 计算机应用轨道交通bim,BIM大赛获奖案例—上海轨道交通13号线建设阶段BIM技术的应用...
  20. 用Runnable 方式和 继承 Thread方式实现火车站买票

热门文章

  1. 剑指 Offer 43. 1~n整数中1出现的次数
  2. 计算机组装安装与维护作业,计算机组装与维护的作业.pdf
  3. c语言编程显示单月日历,任意年月日历输出-题解(C语言代码)
  4. java dateformat类_JAVA--常量池,Date类,SimpleDateFormat类与Calendar类
  5. Java代码实现执行Linux服务器命令
  6. python sanic部署_Sanic框架配置操作分析
  7. 我是如何做到的:不切换 Git 分支,同时在多个分支上工作的?
  8. 最强代码生成器平台,杀疯了!
  9. 每日一皮:学会说话很重要...
  10. 每日一皮:经历过的Bug修复过程...