zoukankan      html  css  js  c++  java
  • 关于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。

  • 相关阅读:
    C# 使用 Microsoft.Feeds 组件获取 RSS 全文
    使用 Jquery 做类似搜索引擎效果
    ASP.NET MVC 利用 IHttpModule 实现路由调试
    Python 爬虫类库 Selenium 的常用方法介绍
    C# 中 New 关键词的几种用法
    ASP.NET 使用 IIS URL Rewrite 模块实现伪静态
    Java 源码分析之 HashTable
    Java 类中代码块和构造方法的执行顺序
    C# 中使用 FFmpeg.NET
    C# 项目中使用 ServiceStack.Redis 操作 Redis
  • 原文地址:https://www.cnblogs.com/zenny-chen/p/3807284.html
Copyright © 2011-2022 走看看