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倍~这是编译器优化造成的么……?
c++的矩阵乘法加速trick的更多相关文章
- 如何使用矩阵乘法加速动态规划——以[SDOI2009]HH去散步为例
对这个题目的最初理解 开始看到这个题,觉得很水,直接写了一个最简单地动态规划,就是定义 f[i][j]为到了i节点路径长度为j的路径总数, 转移的话使用Floyd算法的思想去转移,借助这个题目也理解了 ...
- 『公交线路 状压dp 矩阵乘法加速』
公交线路 Description 小Z所在的城市有N个公交车站,排列在一条长(N-1)km的直线上,从左到右依次编号为1到N,相邻公交车站间的距离均为1km. 作为公交车线路的规划者,小Z调查了市民的 ...
- [模板][题解][Luogu1939]矩阵乘法加速递推(详解)
题目传送门 题目大意:计算数列a的第n项,其中: \[a[1] = a[2] = a[3] = 1\] \[a[i] = a[i-3] + a[i - 1]\] \[(n ≤ 2 \times 10^ ...
- BZOJ 1009 GT考试 (AC自动机 + 矩阵乘法加速dp)
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1009 题意: 准考证号为\(n\)位数\(X_1X_2....X_n(0<=X_ ...
- P3193 [HNOI2008]GT考试(KMP+矩阵乘法加速dp)
P3193 [HNOI2008]GT考试 思路: 设\(dp(i,j)\)为\(N\)位数从高到低第\(i\)位时,不吉利数字在第\(j\)位时的情况总数,那么转移方程就为: \[dp(i,j)=dp ...
- 矩阵乘法加速fib数列
考虑矩阵(1,1)(1,0) #include<cstdio> #include<cstring> #include<iostream> using namespa ...
- HDU 5607 graph(DP+矩阵乘法)
[题目链接] http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=663&pid=1002 [题意] 给定一个有向 ...
- BZOJ_1009_[HNOI2008]GT考试_KMP+矩阵乘法
BZOJ_1009_[HNOI2008]GT考试_KMP+矩阵乘法 Description 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考 ...
- 题解——洛谷P1962 斐波那契数列(矩阵乘法)
矩阵乘法加速线性递推的典型 大概套路就是先构造一个矩阵\( F \)使得另一初始矩阵\( A \)乘以\( F^{x} \)能够得出第n项 跑的飞快 虽然我也不知道那个矩阵要怎么构造 或许就像我使用了 ...
随机推荐
- vue获取dom元素注意问题
mounted(){ setTimeout(()=>{ this.contentToggle(); },1000) }, methods:{ contentToggle(){ console.l ...
- backbone学习笔记:模型(Model)(2)属性验证
Backbone的属性验证有2种方法: 1.Backbone自带简单的验证方法,但是验证规则需要自己实现 通过validate()方法进行验证,验证规则写在此方法里. var RoomModel = ...
- Mac 使用 launchctl 定时运行程序(转载)
摘要: 在linux下可以用crontab来定时执行任务,在mac下可以用launchctl来定时执行任务. 在linux下可以用crontab来定时执行任务,在MAC下可以用launchctl来定时 ...
- 【PHP代码审计】 那些年我们一起挖掘SQL注入 - 1.什么都没过滤的入门情况
0x01 背景 首先恭喜Seay法师的力作<代码审计:企业级web代码安全架构>,读了两天后深有感触.想了想自己也做审计有2年了,决定写个PHP代码审计实例教程的系列,希望能够帮助到新人更 ...
- 执行RF测试只生成output.xml文件,不生成log和report文件
命令格式: -l --log file HTML log file. Can be disabled by giving a special value `NONE`. Default: log.ht ...
- CookieUtils工具类
package com.taotao.common.util; import java.io.UnsupportedEncodingException; import java.net.URLDeco ...
- transformNative_libsWithStripDebugSymbolForDebug
local.properties #ndk.dir=C\:\\My_other\\Android_SDK\\ndk-bundle 把NDK注释掉就ok了
- phpStorm中使用xdebug断点调试php代码
配置好xdebug,也能使得phpstorm像java哪像跑断点调试,爽的一笔!!! 下载xdebug并配置 [XDebug] zend_extension=php_xdebug-2.4.0rc3-5 ...
- (iOS)判断GPS坐标是否在中国
博文转载至 http://blog.csdn.net/cuibo1123/article/details/45691631 火星坐标经纬度范围 由于火星坐标问题,所以需要判断一下经纬度是否在中国. 基 ...
- audio_policy.conf说明(翻译)
自己记着当笔记,水平有限,仅供参考 # # Audio policy configuration for generic device builds (goldfish audio HAL - emu ...