zoukankan      html  css  js  c++  java
  • [转]基于SSE指令集的程序设计简介

    http://dev.gameres.com/Program/Other/sseintro.htm

    SSE技术简介


    Intel公司的单指令多数据流式扩展(SSE,Streaming SIMD Extensions)技术能够有效增强CPU浮点运算的能力。Visual Studio .NET 2003提供了对SSE指令集的编程支持,从而允许用户在C++代码中不用编写汇编代码就可直接使用SSE指令的功能。MSDN中有关SSE技术的主题[1]有可能会使不熟悉使用SSE汇编指令编程的初学者感到困惑,但是在阅读MSDN有关文档的同时,参考一下Intel软件说明书(Intel Software manuals)[2]会使你更清楚地理解使用SSE指令编程的要点。
    SIMDsingle-instruction, multiple-data)是一种使用单道指令处理多道数据流的CPU执行模式,即在一个CPU指令执行周期内用一道指令完成处理多个数据的操作。考虑一下下面这个任务:计算一个很长的浮点型数组中每一个元素的平方根。实现这个任务的算法可以这样写:


        for each f in array //对数组中的每一个元素
            f = sqrt(f) //计算它的平方根


    为了了解实现的细节,我们把上面的代码这样写:


        for each f in array
        {
            把f从内存加载到浮点寄存器
            计算平方根
            再把计算结果从寄存器中取出放入内存
        }


    具有Intel SSE指令集支持的处理器有8个128位的寄存器,每一个寄存器可以存放4个(32位)单精度的浮点数。SSE同时提供了一个指令集,其中的指令可以允许把浮点数加载到这些128位的寄存器之中,这些数就可以在这些寄存器中进行算术逻辑运算,然后把结果放回内存。采用SSE技术后,算法可以写成下面的样子:


        for each 4 members in array //对数组中的每4个元素
        {
           把数组中的这4个数加载到一个128位的SSE寄存器中
           在一个CPU指令执行周期中完成计算这4个数的平方根的操作
           把所得的4个结果取出写入内存
        }


    C++编程人员在使用SSE指令函数编程时不必关心这些128位的寄存器,你可以使用128位的数据类型“__m128”和一系列C++函数来实现这些算术和逻辑操作,而决定程序使用哪个SSE寄存器以及代码优化是C++编译器的任务。当需要对很长的浮点数数组中的元素进行处理的时候,SSE技术确实是一种很高效的方法。


    SSE程序设计详细介绍


    包含的头文件:
    所有的SSE指令函数和__m128数据类型都在xmmintrin.h文件中定义:
        #include <xmmintrin.h>
    因为程序中用到的SSE处理器指令是由编译器决定,所以它并没有相关的.lib库文件。


    数据分组(Data Alignment
    由SSE指令处理的每一个浮点数数组必须把其中需要处理的数每16个字节(128位二进制)分为一组。一个静态数组(static array)可由__declspec(align(16))关键字声明:
        __declspec(align(16)) float m_fArray[ARRAY_SIZE];
    动态数组(dynamic array)可由_aligned_malloc函数为其分配空间:
        m_fArray = (float*) _aligned_malloc(ARRAY_SIZE * sizeof(float), 16);
    由_aligned_malloc函数分配空间的动态数组可以由_aligned_free函数释放其占用的空间:
        _aligned_free(m_fArray);


    __m128 数据类型
    该数据类型的变量可用做SSE指令的操作数,它们不能被用户指令直接存取。_m128类型的变量被自动分配为16个字节的字长。


    CPUSSE指令集的支持
    如果你的CPU能够具有了SSE指令集,你就可以使用Visual Studio .NET 2003提供的对SSE指令集支持的C++函数库了,你可以查看MSDN中的一个Visual C++ CPUID的例子[4],它可以帮你检测你的CPU是否支持SSE、MMX指令集或其它的CPU功能。


    编程实例
    以下讲解了SSE技术在Visual Studio .NET 2003下的应用实例,你可以在http://www.codeproject.com/cpp/sseintro/SSE_src.zip下载示例程序压缩包。该压缩包中含有两个项目,这两个项目是基于微软基本类库(MFC)建立的Visual C++.NET项目,你也可以按照下面的讲解建立这两个项目。


    参考文档:
    [1]MSDN, SSE技术主题:
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/vcrefstreamingsimdextensions.asp
    [2]Intel软件说明书(Intel Software manuals):
    http://developer.intel.com/design/archives/processors/mmx/index.htm
    [3] Kris Jearakul的瀑布状图表控件:http://www.codeguru.com/controls/Waterfall.shtml
    [4] Microsoft Visual C++ CPUID示例:
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcsample/html/vcsamcpuiddeterminecpucapabilities.asp
    [5] Matt Pietrek在Microsoft Systems Journal 1998年2月刊上的评论文章:
    http://www.microsoft.com/msj/0298/hood0298.aspx 。

  • 相关阅读:
    pytest_04
    pytest_03
    pytest_02
    CF 1416C XOR Trie
    CF 1413D
    ZOJ 3725 概率dp
    ZOJ 3726
    位运算
    CF1439C 线段树
    unordered_set
  • 原文地址:https://www.cnblogs.com/pulas/p/2550300.html
Copyright © 2011-2022 走看看