最近读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的更多相关文章

  1. 如何使用矩阵乘法加速动态规划——以[SDOI2009]HH去散步为例

    对这个题目的最初理解 开始看到这个题,觉得很水,直接写了一个最简单地动态规划,就是定义 f[i][j]为到了i节点路径长度为j的路径总数, 转移的话使用Floyd算法的思想去转移,借助这个题目也理解了 ...

  2. 『公交线路 状压dp 矩阵乘法加速』

    公交线路 Description 小Z所在的城市有N个公交车站,排列在一条长(N-1)km的直线上,从左到右依次编号为1到N,相邻公交车站间的距离均为1km. 作为公交车线路的规划者,小Z调查了市民的 ...

  3. [模板][题解][Luogu1939]矩阵乘法加速递推(详解)

    题目传送门 题目大意:计算数列a的第n项,其中: \[a[1] = a[2] = a[3] = 1\] \[a[i] = a[i-3] + a[i - 1]\] \[(n ≤ 2 \times 10^ ...

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

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

  5. P3193 [HNOI2008]GT考试(KMP+矩阵乘法加速dp)

    P3193 [HNOI2008]GT考试 思路: 设\(dp(i,j)\)为\(N\)位数从高到低第\(i\)位时,不吉利数字在第\(j\)位时的情况总数,那么转移方程就为: \[dp(i,j)=dp ...

  6. 矩阵乘法加速fib数列

    考虑矩阵(1,1)(1,0) #include<cstdio> #include<cstring> #include<iostream> using namespa ...

  7. HDU 5607 graph(DP+矩阵乘法)

    [题目链接] http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=663&pid=1002 [题意] 给定一个有向 ...

  8. BZOJ_1009_[HNOI2008]GT考试_KMP+矩阵乘法

    BZOJ_1009_[HNOI2008]GT考试_KMP+矩阵乘法 Description 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考 ...

  9. 题解——洛谷P1962 斐波那契数列(矩阵乘法)

    矩阵乘法加速线性递推的典型 大概套路就是先构造一个矩阵\( F \)使得另一初始矩阵\( A \)乘以\( F^{x} \)能够得出第n项 跑的飞快 虽然我也不知道那个矩阵要怎么构造 或许就像我使用了 ...

随机推荐

  1. sql server 2014 序列號

    亲测可用 27HMJ-GH7P9-X2TTB-WPHQC-RG79R

  2. 在mvc4中多语言建站的实例

    环境:vs2012 asp.net mvc4. 实现方式:resource 资源文件,根据路由规则中Lang参数来判断载入哪种语言方式 在网上找到了相关资料,顺便自己做了个练习,新建工程之类的步骤就免 ...

  3. WebGL常用数学公式

    1.三角函数 坐标轴采用右手法则,沿Z轴的逆时针方向为正角度,假设原始点为p(x,y,z),a是X轴旋转到点p的角度,r是从原始点到p点的距离.用这两个变量计算出点p的坐标,等式如下: x = rco ...

  4. classpath路劲

    1.指的是tomcat下的web-if下的classes路劲 2. 发布时,红框中的文件全都会放到classes下,并且如果出现重名,下面的有可能会覆盖上面的文件

  5. VS2017 Pro未能找到路径“……\bin\roslyn\csc.exe”的解决方案

    VS2017改用roslyn编译的,新的roslyn编译器,支持c# 6.0语法.它放到bin里面去是为了支持asp.net应用的动态编译. 它是通过nuget的包Microsoft.CodeDom. ...

  6. RHEL5 yum更新源

    1.检查yum是否安装 rpm -qa |grep yum 2.利用CentOS的yum更新源来实现RHEL5的YUM功能 vi /etc/yum.repos.d/CentOS-Base.repo [ ...

  7. eclipse中设置文件的编码格式为utf-8

    1.可以在 eclipse 中配置 workspace 项下 text file encoding 属性的值来决定此工作区间下所有的 eclipse 项目的文档的编码属性. Window-->P ...

  8. 用XYNTService把Python程序变为服务

    1. XYNTService的使用 1.1. 介绍 1.2. XYNTService 2. 用XYNTService把Python程序变为服务 1. XYNTService的使用 1.1. 介绍 通常 ...

  9. RPM常用命令解释

    RPM软件包管理器,英文:RPM Package Manager(原Red Hat Package Manager,现在是一个递归缩写) -i安装rpm包 -u升级rpm包 -q查询已安装的软件信息 ...

  10. SpringBoot thymeleaf模板版本,thymeleaf模板更换版本

    SpringBoot thymeleaf模板版本 thymeleaf模板更换版本 修改thymeleaf模板版本 ================================ ©Copyright ...