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项 跑的飞快 虽然我也不知道那个矩阵要怎么构造 或许就像我使用了 ...
随机推荐
- 《HTTP权威指南》学习笔记——HTTP报文
HTTP报文 HTTP:互联网的信使 HTTP报文:信使用来搬东西的包裹 1.报文流 HTTP报文:HTTP应用程序之间发送的数据块 组成:元信息开头(文本形式,描述报文的内容和含义)+可选的数据部分 ...
- 1 最简单的hello world
preface 今天我开始自学flask了,由此记录学习中的点点滴滴. 有问题请联系我(Mr.Leo 18500777133@sina.cn) include: 简介flask hello world ...
- lua 时间戳和时间互相转换
1.时间戳转换成时间 local t = 1412753621000 function getTimeStamp(t) return os.date("%Y%m%d%H", ...
- matlab矩阵内存预分配
matlab矩阵内存预分配就意味着,划定一个固定的内存块,各数据可直接按"行.列指数"存放到对应的元素中.若矩阵中不预配置内存.则随着"行.列指数"的变大.MA ...
- HTTP API接口测试利器PostMan介绍
一.什么是API接口测试? API接口有多种,个人将其划分为三类.第一种是函数级别的,测试需要对接口的各个参数进行测试,如:Int getResult(String key, String ID, I ...
- Java的多线程
Java使用Thread代表线程,所有的线程对象都必须是Thread类或其子类的实例.每个线程的作用就是执行一段程序流(完成一定的任务). Java使用线程执行体来代表这段程序流. 1. 继承Thre ...
- 脚本控制animation的事件
由于动作设计经常修改动作,所以每次改完都要再添加一次animation的事件,所以就直接写了个脚本,当然以后可以做成表格,然后用脚本从表格中读取,然后生成对应的animation事件.在Assets/ ...
- C语言char*字符串数组和unsigned char[]数组的相互转换
#include <iostream> #include <string> using namespace std; void convertUnCharToStr(char* ...
- phpStorm中使用xdebug断点调试php代码
配置好xdebug,也能使得phpstorm像java哪像跑断点调试,爽的一笔!!! 下载xdebug并配置 [XDebug] zend_extension=php_xdebug-2.4.0rc3-5 ...
- 使用java发送QQ邮件
使用java发送邮件的时候,需要先下载两个jar包,连接如下: JavaMail mail.jar 1.4.5 JAF(版本 1.1.1) activation.jar 然后将这连个包导入,博主用的是 ...