Op-level的快速算法
十岁的小男孩
本文为终端移植的一个小章节。
目录
引言
FFT Conv2d (7x7, 9x9)
Winograd Conv2d (3x3, 5x5)
引言
本节针对CNN进行加速计算的,主要有以下两种方法,FFT和Winograd两种方法。
FFT Conv2d (7x7, 9x9)
FFT(Fast Fourier Transformation)是离散傅氏变换(DFT)的快速算法。即为快速傅氏变换。它是根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。
FFT加速convolution,按照Convolution Theorem,时域上的卷积可以转成空间域的傅立叶变换进行。
lecun的文章就是通过把卷积变成傅立叶变换实现加速的。从实验里看到,加速比2倍左右。目前这部分有代码开源,但是好像并没有merge到caffe中,原因可能是因为加速比例有限,再者消耗空间。猜测主要是加速比例问题吧,因为加速过程中,由于其原理,当卷积核小,是没什么加速的,当核是3或者5时,速度有的更慢或者相当,而在cnn中卷积的核大多数比较小,起到的加速作用很小,而基于图像处理本身目前的任务来说,卷积核一般不会太大,googlenet用7X7已经是爆炸天了。而从另外一方面来说,对caffe实现多GPU卡的加速或者多机的加速,则是实打实的加速,无论你的卷积核多大,你都能加速。
lecun他们又出了一篇新的文章,facebook的,Fast Convolutional Nets With fbfft: A GPU Performance Evaluation。caffe上已经有人实现了,加速1.4(3X3)到14.5倍。从他们的文章中看到,卷积核小的时候也是实现了加速了。
参考:Duan2baka的博客
Winograd Conv2d (3x3, 5x5)
Winograd 方法简单讲, 就是用更多的加法计算来减少乘法计算. 因此, 一个前提就是, 在处理器中, 乘法计算的时钟周期数要大于加法计算的时钟周期数.
参考文献:
知识应该是开源的,欢迎斧正,929994365@qq.com
Op-level的快速算法的更多相关文章
- MinFilter(MaxFilter)快速算法C++实现
目录 1.算法简述 1.1.MinFilter(MaxFilter) 算法简述 1.2.MinFilter(MaxFilter) 快速算法简述 2.实现代码 2.1.MinFilterOneRow 单 ...
- 从大整数乘法的实现到 Karatsuba 快速算法
Karatsuba 快速乘积算法是具有独特合并过程(combine/merge)的分治算法(Karatsuba 是俄罗斯人).此算法主要是对两个整数进行相乘,并不适用于低位数(如 int 的 32 位 ...
- Layer-level的快速算法
十岁的小男孩 本文为终端移植的一个小章节. Sparse Block Net 本节为优化加速的第二章节,主要介绍Sparse-block net.上章节为OP算子层的加速,本节为层级间的加速,主要针对 ...
- 自动色彩均衡(ACE)快速算法
ACE算法源自retinex算法,可以调整图像的对比度,实现人眼色彩恒常性和亮度恒常性,通过差分来计算目标点与周围像素点的相对明暗关系来校正最终像素值,有很好的增强效果.但是计算复杂度非常高,本文提出 ...
- 产生N个不重复的随机数的快速算法
//seed array ,,,,,,,,,}; //随机数个数 ; //结果存放在里面 ]; ; i < N; i++) { //从剩下的随机数里生成 , startArray.length ...
- 多项式相乘快速算法原理及相应C代码实现---用到fft
最近认真研究了一下算法导论里面的多项式乘法的快速计算问题,主要是用到了FFT,自己也实现了一下,总结如下. 1.多项式乘法 两个多项式相乘即为多项式乘法,例如:3*x^7+4*x^5+1*x^2+5与 ...
- 求素数的一个快速算法 Python 快速输出素数算法
思想 以100以内为例. 生成一个全是True的101大小的数组 2开始,遇到2的倍数(4,6,8,10...)都赋值为False 因为这些数字都有因子 2 3开始,遇到3的倍数(6,9,12...) ...
- 图像处理之基础---卷积及其快速算法的C++实现
头文件: /* * Copyright (c) 2008-2011 Zhang Ming (M. Zhang), zmjerry@163.com * * This program is free so ...
- 快速傅里叶变换(FFT)算法【详解】
快速傅里叶变换(Fast Fourier Transform)是信号处理与数据分析领域里最重要的算法之一.我打开一本老旧的算法书,欣赏了JW Cooley 和 John Tukey 在1965年的文章 ...
随机推荐
- linux下socket的连接队列的 backlog的分析
建立socket连接的过程 1:client发syn请求给server 2:server收到后把请求放在syn queue中,这个半连接队列的最大值是系统参数tcp_max_syn_backlog定义 ...
- Linq中的left join
left join var custs = from c in db.T_Customer join u in db.Sys_User on c.OwnerId equals u.Id into te ...
- 美团面试-canvas实现放射图
一个nice的面试官对面试经验匮乏者的温暖To snow peak,哈哈 drawRadial(100, 100, 30, 10) /** *@description *用canvas画放射图 * * ...
- 【CentOS】Tomcat的安装
文件上传方式(推荐) # 解压 tar zxvf apache-tomcat-9.0.1.tar.gz # 进入bin目录启动 ./startup.sh # 进入log目录查看日志信息 tail -f ...
- ubuntu14.04配置face_recognition环境
Github项目地址:https://github.com/MiChongGET/face_collection 环境搭建 1. 环境 ubuntu14.04 LTS python2.7 pip ...
- python异常处理的两种写法
(1)第一种写法 需要注意的是 在抛出异常的时候,HTTPError必须写在URLError之前,因为只有这样前者才能抛出异常,不然的话就会被后者拦截,提前抛出异常. from urllib.requ ...
- C++虚函数总结
为什么使用虚函数?什么是虚函数?虚函数是为了解决什么问题? 面向对象的三大特征: 封装 多态 继承 普通虚函数 虚析构函数 纯虚函数 抽象类 接口类 隐藏 vs 覆盖 隐藏与覆盖之间的关系 早绑定和晚 ...
- ES6学习笔记五(promise异步)
知识点1:rosolve是执行下一步then() // Promise { let ajax=function(){ console.log('执行2'); return new Promise(fu ...
- 题解-USACO18DEC Sort It Out
Problem 洛谷5156 题意概要:给定一个长为\(n\)的排列,可以选择一个集合\(S\)使这个集合内部元素排到自己在整个序列中应该在的位置(即对于集合\(S\)内的每一个元素\(i\),使其排 ...
- Vue-cli 搭建web服务介绍
Node.js 之 npm 包管理 - Node.js 官网地址:点我前往官网 - Node.js 中文镜像官网: 点我前往```` Node.js 是一个基于 Chrome V8 引擎的 JavaS ...