原文链接:GPU-based Acceleration of Deep Convolutional Neural Networks on Mobile Platforms

github地址:CNNDroid

1.前置知识 移动GPU架构

现在的移动GPU一般由多个平行计算单元SC(shader core)组成。每个SC又由多个平行算数逻辑单元ALU(arithmetic and logic unit)组成。

例如,Samsung Exynos 5433芯片架构如上图。芯片由ARM Cortex-A53/A57 CPU 和 Mali T-760 GPU构成。每个T-760 GPU中的SC包含两个128-bit的ALU。每个128-bit的ALU能够执行SIMD(single instruction multiple data)计算。例如,每个128-bit的ALU能够同时执行两个64-bit,或4个32-bit,或8个16-bit的计算。而PowerVR GPU的每个SC由多个16-bit和32-bit的ALU构成。

移动GPU和电脑上的有很大不同。其有很大的面积限制,因此移动GPU都被设计为只有较少的核心。然而,较少的核心让并行线程管理更加简单。例如,在某些移动GPU的每个线程中都有其自己的程序计数器,因此branch divergence不是问题。另一个主要不同是,电脑上CPU 和 GPU 都有单独的内存,而移动芯片CPU和GPU共用同一块主内存。因而,不会有在CPU和GPU间复制数据的限制。

2.CNN on Mobile GPU

以下均基于图片识别任务的cnn网络

优化效果见下图

2.1. GPU-Based Basic Parallel Acceleration

basic parallel acceleration方法是仍然按照序列计算每幅图片,但在对每幅图片卷积时采用并行计算。当存在ReLU层时,它的计算就被嵌入到两次卷积操作之间,而没有明显的耗时。这是通过利用CPU的空闲达到的。当GPU在卷积计算第i幅图片时,第(i-1)幅图的ReLU层就会被CPU计算。因此CPU与GPU同时处于工作状态。

2.2. GPU-Based Basic SIMD Acceleration

在前面的GPU架构中有提到,每个GPU的SC都包含多个SIMD ALU。每个ALU都能在一个时钟周期中处理多个计算操作。例如128-bit的SIMD ALU能同时执行4个32-bit的浮点计算。我们使用这个特性加速性能。

通常的卷积核尺寸都是单数,不能被4整除。因此,为了能完全利用SIMD单元,我们对输入的卷积层做了如下操作。因为输入矩阵的channel数能被4整除(RGBA),所以我们重新排列矩阵的维度,将channel移动到最低维,而height和width移动到更高维度(即[W,H,C]->[C,W,H])。考虑到我们进行的图片的维度变换,因此在计算时需要沿着chanel轴进行计算。(我的理解是同时对4个channel进行卷积)

2.3. GPU-Based Advanced SIMD Acceleration

在上个方法中,尽管读取数据时通过4维的向量,但每个线程只有一个元素在输出时计算。为了减少线程数,以减少帧与卷积核加载到GPU缓存的次数。我们每次在每个线程中同时计算多个元素(4个或8个)。

流程:

1. 解析net.txt 文件,生成多个卷积网络计算图。每一个网络层生成对应的层对象,放入一个ArrayList中

root_directory: "/sdcard/Cifar10/"allocated_ram: 20execution_mode: "parallel"auto_tuning: "off"layer {type: "Convolution"name: "conv1"parameters_file: "model_param_conv1.msg"pad: 2stride: 1group: 1
}layer {type: "Pooling"name: "pool1"pool: "max"kernel_size: 3pad: 0stride: 2
}layer {type: "ReLU"name: "ReLU1"
}layer {type: "Convolution"name: "conv2"parameters_file: "model_param_conv2.msg"pad: 2stride: 1group: 1
}

2. 在生成Convolution层和FullyConnected层时,会通过其中的parameters_file找到对应的权重参数文件,并将其赋值到层对应的权重矩阵中

        float[][][][] inputBatch = new float[1][3][mWidthPixel][mHeightPixel];ImageView img = (ImageView) findViewById(R.id.imageView);TextView text = (TextView) findViewById(R.id.textView);// 读取图像源文件 并缩放到预定大小(32)Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.airplane);Bitmap bmp1 = Bitmap.createScaledBitmap(bmp, imgSize, imgSize, true);Bitmap bmp2 = Bitmap.createScaledBitmap(bmp, mWidthPixel, mHeightPixel, false);img.setImageBitmap(bmp1);for (int j = 0; j < mWidthPixel; ++j) {for (int k = 0; k < mHeightPixel; ++k) {// 读取图像的pixel值,并归一化 means矩阵由网络初始化时读取mean.msg生成// 注意生成的矩阵顺序为 [batch, channel, width, height]int color = bmp2.getPixel(j, k);inputBatch[0][0][k][j] = (float) (android.graphics.Color.blue(color)) - mean[0][j][k];inputBatch[0][1][k][j] = (float) (android.graphics.Color.blue(color)) - mean[1][j][k];inputBatch[0][2][k][j] = (float) (android.graphics.Color.blue(color)) - mean[2][j][k];}}// 调用网络计算float[][] output = (float[][]) myConv.compute(inputBatch);

3.  循环存储网络层的ArrayList,依次处理输入数组,得到对应的输出矩阵。

例子:例子

CnnDroid 优化加速原理相关推荐

  1. APG(Accelerate Proximal Gradient)加速近端梯度算法 和 NAG(Nesterov accelerated gradient)优化器原理 (二)

    文章目录 前言 NAG优化器 APG 与 NAG的结合 Pytorch 代码实现 总结 附录 公式(11)推导 引用 前言 近期在阅读Data-Driven Sparse Structure Sele ...

  2. APG(Accelerate Proximal Gradient)加速近端梯度算法 和 NAG(Nesterov accelerated gradient)优化器原理 (一)

    文章目录 前言 APG(Accelerate Proximal Gradient)加速近端梯度算法[^1] PGD (Proximal Gradient Descent)近端梯度下降法推导[^2] E ...

  3. 搜索引擎优化学习原理_如何使用数据科学原理来改善您的搜索引擎优化工作

    搜索引擎优化学习原理 Search Engine Optimisation (SEO) is the discipline of using knowledge gained around how s ...

  4. 深入理解FPGA加速原理——不是随便写个C代码去HLS一下就能加速的

    不要写代码做无意义的操作 写这篇文章的起因是前段时间有人在网上问了我一个HLS的问题,他写的C代码HLS时报错,问我是咋回事.可惜的是由于我水平低,没玩过HLS,所以我也不知道是咋回事.不过我扫了一眼 ...

  5. 解密AI芯片的加速原理

    网上对AI芯片的剖析实在太少,这里对一些论文和大佬的研究做一个总结,希望对读者有所帮助. AI 芯片的诞生 讲到半导体,不得不从摩尔定律说起.从Intel创始人戈登·摩尔提出摩尔定律到现在已经53年了 ...

  6. 【GPU】Nvidia CUDA 编程基础教程——利用基本的 CUDA 内存管理技术来优化加速应用程序

    博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 本人就职于国际知名终端厂商,负责modem芯片研发. 在5G早期负责终端数据业务层.核心网相关的开发工作,目前牵头6G ...

  7. GPU加速原理浅析及代码实现

    GPU加速原理浅析及代码实现 一.CUDA简介 二.GPU架构特点 三.CUDA线程模型 四.CUDA内存模型 五.CUDA编程规范 **第一个要掌握的编程要点**:**我们怎么写一个能在GPU跑的程 ...

  8. TensorRT加速原理

    TensorRT能够加速的原因主要有两点,一方面是支持INT8和FP16的计算:另一方面是对网络结构进行了重构和优化. TensorRT支持INT8和FP16的计算 深度学习网络在训练时,通常使用 3 ...

  9. 六、网络加速原理-CDN

    CDN 加速原理 热衷京东平台的朋友大部分是被他极致的物流体验折服的,因为京东买东西经常第二天就到了,更有甚者上午买下午就到.而同样知名的淘宝则很难做到这点,这是由于京东在全国的各个城市都有自己的仓库 ...

最新文章

  1. Ubuntu16.04 pip3 install 报错 working_set.find(moduleOrReq) or require(str(moduleOrReq))[0]
  2. LDA-math-MCMC 和 Gibbs Sampling
  3. 推荐算法 之协同过滤
  4. 太棒了!想学英语的好好留着!
  5. 程序员是终身学习的职业,应该怎么学习?
  6. Azure 部署 Asp.NET Core Web App
  7. dakai微信小程序 ios_iOSAPP跳转微信小程序
  8. sql语句php不执行mysql执行_为什么我写的php代码不执行sql语句呢,请大侠指点。...
  9. 斯坦福NLP名课带学详解 | CS224n 第14讲 - Transformers自注意力与生成模型(NLP通关指南·完结)
  10. 双边滤波器和高斯滤波器
  11. 中国最顶级的一批程序员,从首富到首负!
  12. env: bash\r: No such file or directory
  13. rm -rf /* 数据恢复记录
  14. elasticsearch forcemerge
  15. Eigenvalue of random matrix
  16. 完美解决!无法启动此程序,因为计算机中丢失libmysql.dll解决方案(详细版!)
  17. Stata:市场调整模型(MA)计算的并购事件的累积超额回报(CAR)
  18. 8月第2周业务风控关注 |电商平台卖家自爆家丑 一天要刷2000单
  19. 收集一些网页模板/素材的网站
  20. Debian10中使用deb包安装WineHQ(鬼畜依赖解决)

热门文章

  1. Java精品项目源码第53期流浪动物管理系统
  2. 永远不要和沙雕一样的人去争论,争论最后你会发现你也是一个沙雕
  3. 写了placement new也要写placement delete——条款52
  4. 飞思卡尔单片机PLL时钟总线模块
  5. Android锁屏状态下点亮屏幕并弹窗提醒
  6. jqury实现异步文件上传
  7. CTF-安卓手机文件分析取证(陌陌发送的图片)
  8. Avoid mutating a prop directly子传父报错解决
  9. 【Linux】好玩的Linux命令(二)
  10. 世界药王再遭“无间道”,药企如何保护自己的数据