(八)向量化

public class Foo {

    public void foo(byte[] src,byte[] dst){

        for(int i=0;i<src.length/4;i+=4){
            dst[i]=src[i];
            dst[i+1]=src[i+1];
            dst[i+2]=src[i+2];
            dst[i+3]=src[i+3];
        }
    }
}

由于 X86_64 不支持内存间的直接移动,所以 dst[i]=src[i] 必须有两条指令才能完成:

1、把 src[i] 中的值写入寄存器。

2、把寄存器中的值写入 dst[i]。

因此上面代码中的一个循环迭代需要 8 条指令才能完成。由于数组中元素的地址是连续的,从 src[i] 元素的地址起,接下来的 32 位内存中分别对应 src[i]、src[i+1]、src[i+2]、src[i+3] 的值,所以我们可以一次读取32位内容至寄存器中,然后从 dst[i] 地址处写入32位内容就完成了一个循环迭代。

所有上面的代码可以优化成:

for(int i=0;i<src.length/4;i+=4){

   dst[i:i+3]=src[i:i+3]
}

SIMD 指令 

在上面的例子中,byte 只占一个字节,4个元素占 4 个字节,如果是 4 个long 元素,超过了指令总线的宽度(X86_64 体系的通用寄存器只有64位),因此 Java 即时编译器需要够借助能存储更长的 XMM 寄存器。

所谓的 XMM 寄存器,是由 SSE(Streaming SIMD Extensions)指令集所引入的。它们一开始仅为 128 位。自从 X86 平台上的 CPU 开始支持 AVX(Advanced Vector Extensions)指令集后(2011 年),XMM 寄存器便升级为 256 位,并更名为 YMM 寄存器。原本使用 XMM 寄存器的指令,现将使用 YMM 寄存器的低 128 位。

SSE 指令集以及之后的 AVX 指令集都涉及了一个重要的概念,那便是单指令流多数据流(Single Instruction Multiple Data,SIMD),即通过单条指令操控多组数据的计算操作。这些指令我们称之为 SIMD 指令。

 

举例说明:128 位的XMM 寄存器的值,可以看作 16 个 byte 值组成的向量,  8 个short 值组成的向量,4 个 int 值组成的向量和 2 个 long 值组成的向量。而 SIMD 指令 PADDB、PADDW、PADDD、PADDQ ,将分别实现 byte 值、short 值、int 值或者 long 值的向量加法。

void foo(int[] a, int[] b, int[] c) {
  for (int i = 0; i < c.length; i++) {
    c[i] = a[i] + b[i];
  }
}

上面这段代码经过向量化优化后,将使用 PADDD 指令来实现 c[i:i+3] = a[i:i+3] + b[i:i+3] 。其执行过程中的数据流如下图所示,图片源自 Vladimir Ivanov 的演讲 。下图中内存的右边是高位,寄存器的左边是高位,因此数组元素的顺序是反过来的。

也就是说,理论上(现实中,C2 还将考虑缓存行对齐等因素,导致能够应用向量化加法的仅有数组中间的部分元素)原来需要 length 次加法操作,现在最少只需要 length/4 次向量加法即可完成。 

 

HotSpot Intrinsic 

HotSpot 虚拟机提供了 Java 层面的 intrinsic 方法,这些 intrinsic 方法的语义要比单个 SIMD 指令复杂得多。在运行过程中,HotSpot 虚拟机将根据当前体系架构来决定是否将对该 intrinsic 方法的调用替换为另一高效的实现。如果不,则使用原本的 Java 实现。

另外,这些 intrinsic 方法只能做到点覆盖,在不少情况下,应用程序并不会用到这些 intrinsic 的语义,却又存在向量化优化的机会。这个时候,我们便需要借助即时编译器中的自动向量化(auto vectorization)。

 

自动向量化

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RCNN系列算法 SSD算法 YOLO系列算法 8.3 8.1 8.2 第章 目标检测 人工智能-第章全文共18页,当前为第1页。 区域选择 分类器 目标检测 三个阶段 遍历图像确定可能存在目标的候选区域 提取候选区域相关的视觉特征 对选取的目标进行识别 rcnn系列算法 特征提取 人工智能-第章全文共18页,当前为第2页。 R-CNN是一种基于卷积神经网络的目标检测算法,它在卷积神经网络上应用区域推荐的策略,形成自底向上的目标定位模型,摒弃了传统的滑动窗口(通过多尺度滑动窗口确定所有可能的目标区域)和人工选取特征的方法,将候选区域算法和卷积神经网络相结合,使得检测速度和精度明显提升。 RCNN fast-RCNN faster-RCNN rcnn系列算法 人工智能-第章全文共18页,当前为第3页。 R-CNN 利用选择性搜索算法在图像中提取2000个左右的候选框; 把所有候选框缩放成固定大小(227*227),并进行归一化后输入CNN(AlexNet)网络,提取特征; 提取到的CNN特征使用SVM来分类,用线性回归来微调边框位置与大小,其中每个类别单独训练一个边框回归器; 非极大值值抑制(NMS)来滤除重叠的候选框 存在问题 训练时间长 测试时间长 占用磁盘空间大 卷积出来的特征数据还需要单独保存 rcnn算法 人工智能-第章全文共18页,当前为第4页。 R-CNN Fast R-CNN 1.输入为整张图像并提取特征图。 2. RoI池化层从特征图中提取固定长度的特征向量。 3.使用多任务损失函数,分别进行softmax分类和边框回归。 fast-rcnn算法 人工智能-第章全文共18页,当前为第5页。 faster-rcnn模型结构 1 2 3 特征提取 粗分类+定位 NMS去重 精分类+定位 NMS去重 faster-rcnn算法 人工智能-第章全文共18页,当前为第6页。 anchor框 特征图的每个像素点生成三种不同尺度大小的anchor框,每种框的宽高比分别为:1:1,2:1,1:2,即特征图上的每个像素点共生成9个不同大小的anchor框。 特征图 faster-rcnn算法 人工智能-第章全文共18页,当前为第7页。 RPN网络 遍历特征图上的每个像素点,然后根据不同位置和宽高的anchor框从原图上生成候选框。 faster-rcnn算法 特征图 人工智能-第章全文共18页,当前为第8页。 1.第一阶段 CNN网络提取特征 2.第二阶段(RPN网络) 使用锚框生成候选框,初步实现目标的粗分类和边框回归 3.第三阶段 实现目标的精分类和边框回归 faster-rcnn算法 faster-rcnn 人工智能-第章全文共18页,当前为第9页。 YOLO 结构简单,属于单阶段的检测方法 速度快、资源消耗少 精度较高 YOLO(You Only Look Once):创造性地将目标区域推荐和识别这两个阶段合二为一,同时完成目标定位和分类。 YOLO系列算法 人工智能-第章全文共18页,当前为第10页。 YOLOv1算法 YOLOv1的模型结构比较简单,与常规的CNN分类模型最大的差异是最后输出层用线性函数做激活函数,从而实现预测bounding box的位置。 人工智能-第章全文共18页,当前为第11页。 每个点的维度: 类别概率: 置信度: 边框信息: YOLOv1算法 人工智能-第章全文共18页,当前为第12页。 损失函数 YOLOv1算法 人工智能-第章全文共18页,当前为第13页。 使用聚类生成的锚点代替手工设计的锚点; 在高分辨率图像上进行迁移学习,提升网络对高分辨图像的响应能力 训练过程图像尺寸不再固定,提升网络对不同训练数据的泛化能力 YOLOv2 YOLOv2算法 人工智能-第章全文共18页,当前为第14页。 yolov3改进策略 1.使用Darknet-53主干网络 2.使用k-means聚类9种尺度的先验框 3.多尺度特征进行目标检测 YOLOv3算法 人工智能-第章全文共18页,当前为第15页。 SSD采用VGG作为主干网络,输入图像大小为300*300,采用了特征金字塔结构进行检测,即分别在6个不同大小的特征图上生成目标候选框。 SSD算法 人工智能-第章全文共18页,当前为第16页。 1.以特征图上每个点的中心为中心(偏移量为0.5)生成一系列同心的prior box 。 2.正方形prior box最小边长为min_size ,最大边长为min_size max_size。 3.每设置一个aspect_ratio,会生成1个长宽为aspect_ratio minsize和1aspect_ minsize的长方形。 SSD算法 人工智能-第章全文共18页,

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值