关于Intel处理器架构中AVX2里Gather特性的说明

在Intel Haswell架构里引入了Gather特性。它使得CPU可以使用向量索引存储器编址从存储器取非连续的数据元素。这些gather指令引入了一种新的存储器寻址形式,该形式由一个基地址寄存器(仍然是通用目的寄存器)和通过一个向量寄存器(XMM或YMM)所指定的多个索引构成。数据元素大小支持32位与64位,并且数据类型支持浮点型和整型。

我们先回顾一下普通的x86寻址方式:[<base register> + <index register> * <scale> + <offset>]

在AT&T形式下表达为:<offset>(<base register>, <index register>, <scale>)

其中,<base register>为基地址寄存器;<index register>为索引寄存器;<scale>为刻度因子,它是一个立即数,并仅支持0,1,2,4,8这几个值;<offset>表示偏移量,它是一个立即数。

那么下面我们就先来谈谈上面所提到的向量存储器寻址。

向量SIB(VSIB)存储器寻址

在AVX2中,跟在ModR/M字节后面的SIB(S表示Scale;I表示Index;B表示Base)字节可以支持对一组线性地址的VSIB存储器寻址。VSIB寻址仅在AVX2指令的子集中支持。VSIB存储器寻址要求32位或64位的有效寻址。在32位模式下,当地址大小属性被重载为16位时,VSIB寻址不被支持。在16位保护模式下,VSIB寻址是被允许的,若地址大小属性被重载为32位的话。此外,VSIB存储器寻址仅伴随VEX前缀而被支持。

在VSIB存储器寻址中,SIB字节由以下部分组成:

●  刻度域(位7:6)指定了刻度因子。

●  索引域(位5:3)指定了向量索引寄存器的寄存器编号,该向量存储器中的每个元素都指定了一个索引。

●  基地址域(位2:0)指定了基地址寄存器的编号。

比如:

vgatherdpd    %xmm0, 128(%rdi, %xmm2, 4), %xmm3

上述指令中,基地址寄存器为RDI,索引寄存器为XMM2,刻度因子是4,偏移量是128。而指令vgatherdpd是将索引寄存器的元素作为双字(即4字节)进行划分,然后乘上刻度因子后加到基地址上。而偏移量则作用于每个基地址元素。

下面我们将提供一个比较完整的示例代码来描述VGATHERDPD指令。

先看汇编指令:

_InstTest:

    // 设置索引寄存器的每个元素
    mov     $4, %eax
    // 前一个索引为4
    movd    %eax, %xmm2
    mov     $8, %eax
    // 后一个索引为8
    pinsrd  $1, %eax, %xmm2

    // 将两个double元素的mask全都置1
    mov     $0xffffffffffffffff, %rax
    movq    %rax, %xmm0
    punpcklqdq  %xmm0, %xmm0

    vgatherdpd    %xmm0, 8(%rdi, %xmm2, 2), %xmm3

    ret

这里,rdi寄存器作为第一个输入参数,存放了基地址。

下面是C函数的调用:

int main(void)
{
    extern void InstTest(void *p);

    unsigned __attribute__((aligned(64))) buffer[] = { 0x01020304, 0x05060708, 0x090a0b0c, 0x10121314, 0x15161718, 0x191a1b1c, 0x20212223, 0x24252627 };

    InstTest(buffer);

    return 0;
}

我们通过在return 0;这条语句设置断点,然后通过lldb调试器可以发现XMM3寄存器的最后内容为:

xmm3 = {0x18 0x17 0x16 0x15 0x1c 0x1b 0x1a 0x19 0x23 0x22 0x21 0x20 0x27 0x26 0x25 0x24}

以上代码的编译环境为:OS X 10.9.3, Xcode 5.1, Apple LLVM 5.1

运行环境为:MacBook Air 2013版,Intel Core i7 4650U, 8GB DDR3。

关于Intel处理器架构中AVX2里Gather特性的说明,布布扣,bubuko.com

时间: 2024-10-15 07:02:40

关于Intel处理器架构中AVX2里Gather特性的说明的相关文章

处理器架构——从RISC与CISC到x86、ARM、MIPS

1.CISC(Complex Instruction SetComputer,复杂指令集计算机) 复杂指令集(CISC,Complex Instruction Set Computer)是一种微处理器指令集架构(ISA),每个指令可执行若干低阶操作,诸如从内存读取.储存.和计算操作,全部集于单一指令之中. CISC特点: 1.指令系统庞大,指令功能复杂,指令格式.寻址方式多: 2.绝大多数指令需多个机器周期完成: 3.各种指令都可访问存储器: 4.采用微程序控制: 5.有专用寄存器,少量: 6.

对于流程优化的处理器架构

在过去的两年里,我学到了很多的代码优化方法的同事,在此汇总了什么. 优化处理器架构可以从下面几个方向展开:高速缓存命中.指令预测.数据预取,数据对齐,内存拷贝优化,ddr访问延迟.硬件内存管理优化,指令优化.叙述工具. 缓存未命中是处理器的主要性能瓶颈之中的一个.在FSL的powerpc上,訪问一级缓存是3个时钟周期,二级是12个,3级30多个.内存100个以上.一级缓存和内存訪问速度差30多倍. 我们能够算一下,假设仅仅有一级缓存和内存,100条存取指令.100%命中和95%命中.前者300周

Android4.2.2下Stagefright多媒体架构中的A31的OMX插件和Codec组件

本文均属自己阅读源码的点滴总结,转账请注明出处谢谢. 欢迎和大家交流.qq:1037701636 email: [email protected] 在前面的博文中提到,AwesomePlayer::onPrepareAsyncEvent()开始进行Codec解码器组件的获取以及创建,这里和大家分享. 1.以解码器实例作为切入点 status_t AwesomePlayer::initVideoDecoder(uint32_t flags) { ATRACE_CALL(); ...... ALOG

处理器架构简介

一.主要有如下架构 1)IA-32架构 英特尔32位元架构(英语:Intel Architecture, 32-bit,缩写为IA-32),常被称为i386.x86-32或是x86,由英特尔公司推出的指令集架构,至今英特尔最受欢迎的处理器仍然采用此架构.它是x86架构的32位元延伸版本,首次应用在Intel 80386芯片中,用来取代之前的x8616位元架构(x86-16),包括8086.80186与80286芯片. IA-32属于复杂指令集. 2)IA-64架构 IA-64是英特尔公司与惠普公

演进架构中的领域驱动设计

from:http://www.infoq.com/cn/articles/ddd-evolving-architecture   领域驱动设计能非常容易地应用于稳定领域,其中的关键活动适合开发人员对用户脑海中的内容进行记录和建模.但在领域本身不断变化和发展的情况下,领域驱动 设计变得更具有挑战性.这在敏捷项目中很普遍,在业务本身试图演进的时候也会发生.本文分析了在反思.重建guardian.co.uk这一为期两年的计 划背景下我们是如何利用DDD的.我们展示了如何确保在软件架构中反映最终用户演

ARM 处理器架构【转】

ARM 处理器架构 转自:http://www.arm.com/zh/products/processors/instruction-set-architectures/index.php ARM 架构是构建每个 ARM 处理器的基础.ARM 架构随着时间的推移不断发展,其中包含的架构功能可满足不断增长的新功能.高性能需求以及新兴市场的需要.有关最新公布版本的信息,请参阅 ARMv8 架构. ARM 架构支持跨跃多个性能点的实现,并已在许多细分市场中成为主导的架构.ARM 架构支持非常广泛的性能

VS2012 处理器架构“x86”不匹配 通过配置管理器更改您的项目的目标处理器架构

在VS2012中新建一个项目.然后引用之前VS2010写的一个基础类库. VS2012编译通过但是出现警告. 所生成项目的处理器架构"MSIL"与引用"E:\work\C#\Dt.Utility\bin\Debug\Dt.Utility.exe"的处理器架构"x86"不匹配.这种不匹配可能会导致运行时失败.请考虑通过配置管理器更改您的项目的目标处理器架构,以使您的项目与引用间的处理器架构保持一致,或者为引用关联一个与您的项目的目标处理器架构相符的

PC处理器装机中的认识 三

PC装机的总结:   l 如何辨识该处理器属于哪个系列? 1. )字母G开头,只能是intel的低端处理器,为赛扬系列或奔腾系列,主频小于3.0GHZ的为赛扬,大于或等于为奔腾 2. )字母i开头的一定是intel处理器的酷睿系列 3. )字母E开头的一定是intel处理器中的至强系列 4. )直接用三位数字表示的,一定是AMD中的速龙系列 5. )字母A开头的都是AMD系列中的APU 6. )字母FX开头的一定是AMD中的推土机系列 7. )用字母R开头的为AMD中的最新锐龙系列 8. )当前

Java生鲜电商平台-SpringCloud微服务架构中网络请求性能优化与源码解析

Java生鲜电商平台-SpringCloud微服务架构中网络请求性能优化与源码解析 说明:Java生鲜电商平台中,由于服务进行了拆分,很多的业务服务导致了请求的网络延迟与性能消耗,对应的这些问题,我们应该如何进行网络请求的优化与处理呢? 到底有没有一些好的建议与方案呢? 下面这个文章将揭晓上面的问题,让你对SpringCloud微服务网络请求性能有一个全新的认识. 目录简介 01.网络请求异常分类 02.开发中注意问题 03.原始的处理方式 04.如何减少代码耦合性 05.异常统一处理步骤 06