🤥码带为了Neon - Part1:Load and Stores

技术标签: Neon

转自ARM官网 https://developer.arm.com/architectures/instruction-sets/simd-isas/neon

  Arm的Neon技术是一种64/128位混合SIMD架构,旨在加速多媒体和信号处理应用程序的性能,包括视频编解码、音频编解码、3D图形、语音和图像处理。
  本文是系列文章的第一部分,教大家如何用汇编语言为Neon编写SIMD(Single Instruction Multiple Data单指令集多数据)代码。本系列将涵盖None的入门、高效使用,以及为更有经验的码农提供指示。我们将从内存操作开始,以及如何使用灵活的加载和存储置换指令。

An Example

  给你一个24位的RGB图像,像素在内存中排列为RGBRGB...,现在需要做一个简单的图像处理操作,例如交换红色和蓝色通道。如何使用Neon高效地做到这一点?
  用一个加载操作将RGB数据从内存线性地拉到寄存器,这种交换红/蓝的方式看起来很愚蠢。
在这里插入图片描述
  对于这种RGB排列的输入,编写通道交换的代码不会很优雅,例如掩码(masks)、位移(shifting)、组合(combing)等,不太可能有效率。
  Neon提供了结构化加载和存储指令,为上述情况提供帮助。它们从内存中提取数据,将这些值同时分离到不同的寄存器中。对于这个例子你可以用VLD3指令,在加载红、绿、蓝的同时将它们拆分。
在这里插入图片描述
  然后使用指令VSWP d0, d2交换红色和蓝色寄存器,再用类似命名的存储指令(VST3),将交织后的数据写回内存。

The Details

Overview(概述)

  Neon结构将这些从内存中读取的数据,加载到64位Neon寄存器中,同时可以选择性地将数据交织(deinterleaving)(如上面的例子)。存储的工作原理也类似,在写入内存之前,交织(reinterleaving)来自寄存器的数据。
在这里插入图片描述

Syntax(语法)

  结构加载和存储指令的语法由5个部分组成。
在这里插入图片描述

  • 助记指令符(Instruction mnemonic)VLD表示加载,VST表示存储。
  • 数字交织模式(Interleave pattern),在每个结构中,对应元素之间的间隔。
  • 元素类型(Element type),指定被访问元素的位数。
  • 一组要读或者写的Neon寄存器列表(Neon register list),最多可以列出4个寄存器,主要看交织模式的选择。
  • Arm地址寄存器(Arm address register),包含了内存中要访问的地址。访问后可以更新地址。

Interleave Pattern(交织模式)

  指令可以用于加载、存储和解交错(deinterleave)一块结构,结构中包含1到4个大小相等的元素(也就是寄存器列表的数量?),这些元素通常是Neon支持的8、16、32位宽度数据。

  • VLD1,是最简单的形式,它从内存中加载1到4个寄存器的数据,没有解交错(deinterleaving)。处理一组没有交错(non-interleaved)的数据的时候使用这种模式。
  • VLD2,加载2到4个寄存器的数据,将偶数和奇数元素解交错(deinterleaving)到这些寄存器中。使用此选项可将立体声音频数据分为左右声道。
  • VLD3,加载3个寄存器的数据,并且解交错(deinterleaving),用于将RGB像素分割为通道。
  • VLD4,加载4个寄存器的数据,并且解交错(deinterleaving),用于处理ARGB的图像数据。

  存储指令支持同样的选项,并且在写入内存之前,交错(interleave)来自寄存器的数据。

Element Types(元素类型)

  根据指令指定的大小,加载或存储交错的元素。例如用VLD 2 .16加载2个Neon寄存器的数据,会在第一个寄存器中产生4个16位元素,在第二个寄存器中产生4个16位元素,相邻的一对(奇和偶)分离到每个寄存器中。(看图↓↓↓)

在这里插入图片描述
  若将元素大小改为32位(以上图为例把16位改成32位),则会加载同样数量的数据,但是每个Neon寄存器里面只有2个元素,同时又分奇数和偶数元素。(看图↓↓↓)
在这里插入图片描述
  元素大小也会影响字节序处理。通常,如果为加载和存储指令指定了正确的元素大小,则将以适当的顺序从内存中读取字节,以同样的代码在大端或者小端系统上运行。(这段不知道想讲什么,反正要注意大小端系统的字节顺序)。
  最后,元素的大小会影响指针对其。与元素大小对其通常可以提供更好的性能,或者你的目标操作系统要求这样做。例如,加载32位元素的时候,第一个元素的地址至少对齐到32位。

Single or Multiple Elements(单个或多个元素)

  除了加载多个元素外,结构加载还可以通过解交织(deinterleaving)从内存中读取单个元素,将其读取到Neon寄存器的所有通道或者单个通道,而其它通道保持完整。
在这里插入图片描述
  当你需要根据分散在内存中的数据构造向量时,后一种形式很有用。
在这里插入图片描述
  存储也相似,通过交错(interleaving),为写入单个或多个元素提供支持。

Addressing(寻址)

  结构加载和存储指令支持3种形式,用于指定寻址。

  • 寄存器:[{,:}]
    这是最简单的形式,数据将会被加载或者存储到指定的地址。
  • 后面加个叹号:[{,:}]!
    这种方式在加载或存储数据后更新指针,准备加载或存储下一个元素。指针增量等于指令加载或存储的字节数。
  • 后面加个逗号:[{,:}],
    在内存访问后,指针的增量等于Rm寄存器的值。在读取或写入以固定宽度分隔的一组元素时,这种方式很有效。例如,读取一张图像中的垂直线。

  你还可以使用可选的“:”参数,为Rn寄存器中的指针指定对齐方式,这通常会加速内存访问。

Other Loads and Stores(其它加载和存储)

  在本文中,我们仅讲述了加载和存储,Neon还提供了:

  • VLDRVSTR
    加载和存储单个寄存器(以64位值)。
  • VLDMVSTM
    以64位值加载多个寄存器。对于从栈上存取寄存器很有用。

  有关支持的加载和存储操作的更多详细信息,请参见[《 Arm Architecture参考手册》](https://developer.arm.com/documentation/ddi0406/b/)。 有关说明的详细循环计时信息,请参见每个内核的《技术参考手册》。

  原文链接:Coding for Neon - Part 1: Load and Stores

来源:网络


智能推荐

Accelerating Android AOSP and Embedded Linux Builds, Part 1

https://electric-cloud.com/blog/accelerating-android-aosp-and-embedded-linux-builds-part-1/   Accelerating Android AOSP and Embedded Linux Builds: Introduction Embedded Linux is everywhere today....

Deep Learning 101 - Part 1: History and Background

转自:http://beamandrew.github.io/deeplearning/2017/02/23/deep_learning_101_part1.html The first in a multipart series on getting started with deep learning. In this part we will cover the history of dee...

QA Systems and Deep Learning Technologies – Part 1

1. Introduction The automatic question and answering (QA) system has been in use for decades now. However, Siri's and Watson's success in 2011 has captured the whole industry's attention. Since the su...

Games101 Z-Buffer and shading part 1

Games101 Shading 画家算法 Z-buffer 深度缓冲的算法(Z - Buffer Algorithm) 深度缓冲的时间复杂度(Z - Buffer Complexity) Shading Shading 一个简单的着色模型(Blinn - Phong Relectance Model) 着色点的光照 光照具有局部性(Shading is Local) 漫反射(Diffuse Re...

TSAP(3) : Load Data and

TSAP : TimeSeries Analysis with Python Month #Passengers 0 1949-01 112 1 1949-02 118 2 1949-03 132 #Passengers Year Month Date 1949-01 112 1949 01 1949-02 118 1949 02 1949-03 132 1949 03 #Passengers Y...

猜你喜欢

White matter hyperintensity and stroke lesion segmentation and differentiation using cnn_part1_2017

作者:R. Guerrero ∗1 , C. Qin ∗1 , O. Oktay 1 这篇主要介绍网络部分,下一篇介绍评估方法 Abstract 最近,一些方法被提出来自动分割WMH区域。这些方法大多分割MRI图像的WHM,但是不能区分WMH和中风。其他能够区分脑部MRI图像不同病理的方法,不能同时分割大脑WMH和中风。这篇论文提出一种卷积神经网络,能过分割高信号,并且...

场效应管放大电路

金属-氧化物-半导体(MOS)场效应管 N沟道增强型MOSFET 栅源加电压,在电场作用下产生沟道。产生沟道的门限开启电压VT。 漏源加电压,产生电压梯度,导致沟道夹断。预夹断的临界条件 输出特性 特性方程 可变电阻区                         &...

【响应式】foundation栅格布局的“尝鲜”与“填坑”

  提到响应式,就不得不提两个响应式框架——bootstrap和foundation。在标题上我已经说明白啦,今天给大家介绍的是foundation框架。 何为“尝鲜”?就是带大伙初步一下foundation的灵活和强大 何为“踩坑”?就是我把我使用的时候踩过的坑给标个记号,这样大伙用的时候就可以“绕道而...

word2vec笔记

word2vec 词向量 one hot Distributed representation CBOW&Skip-Gram CBOW Skip-Gram sigmoid函数 Huffman树 基于Hierarchical Softmax的模型 基于Negative Sampling的模型 本文基于word2vec原理CBOW与Skip-Gram模型基础 CBOW与Skip-Gram的模型...

2021-03-14

官网:https://router.vuejs.org/zh/guide/essentials/navigation.html 一、安装路由 npm install vue-router --save-dev 在src目录下创建router目录 使用 vuecli3创建项目选择路由会自动创建route目录 在main.js引入router 二、配置路由 1、 hash: 使用 URL hash 值...

问答精选

SQL, update command not ending properly

It keeps saying : ORA-00933: SQL command not properly ended Pls help me or give me a link to a solution You can use a correlated subquery instead:...

How can I escape $.each loop with my data?

I'm doing an Json call to retrieve an a list of locations with information details for each location. longitude and latitude are included in this info. I am using Google's distance matrix api to get t...

How to display all the columns (and their type) in all tables of all schemas in a database?

Suppose you have a database which has an 'n' number of schemas with an 'n' number of tables each. Each of these contain an 'n' number of columns. How would I print all this data along with the data ty...

How to set the java.library.path in intelliJ Idea

Could anyone please help how do I solve this error: I am using IDEA IDE as a first time, and have been using Resin_4.0.37 as a server to test my work. As soon as I start my lcoal server in debug mode ...

How to calculate mouse coordinate based on resolution c#

i am trying to develop a remote desktop apps with c#. so i have couple of question regarding mouse coordinate calculation based on picture box suppose i have picture box and i want to capture mouse co...

相关问题

相关文章

热门文章

推荐文章

相关标签

推荐问答