代码之家  ›  专栏  ›  技术社区  ›  Liran Orevi

SSE入门

  •  43
  • Liran Orevi  · 技术社区  · 16 年前

    我想进一步了解如何使用 SSE .

    除了明显的阅读 Intel® 64 and IA-32 Architectures Software Developer's Manuals ?

    主要是我有兴趣和 GCC X86 Built-in Functions .

    3 回复  |  直到 7 年前
        1
  •  45
  •   Peter Cordes    7 年前

    首先,我不建议使用内置函数——它们不可移植(跨同一架构的编译器)。

    使用 intrinsics 海湾合作委员会 does a wonderful job 将SSE内部函数优化为更优化的代码。您可以随时查看程序集,了解如何充分利用SSE。

    内部函数很简单-就像普通函数调用一样:

    #include <immintrin.h>  // portable to all x86 compilers
    
    int main()
    {
        __m128 vector1 = _mm_set_ps(4.0, 3.0, 2.0, 1.0); // high element first, opposite of C array order.  Use _mm_setr_ps if you want "little endian" element order in the source.
        __m128 vector2 = _mm_set_ps(7.0, 8.0, 9.0, 0.0);
    
        __m128 sum = _mm_add_ps(vector1, vector2); // result = vector1 + vector 2
    
        vector1 = _mm_shuffle_ps(vector1, vector1, _MM_SHUFFLE(0,1,2,3));
        // vector1 is now (1, 2, 3, 4) (above shuffle reversed it)
        return 0;
    }
    

    使用 _mm_load_ps _mm_loadu_ps 从数组中加载数据。

    当然,还有更多的选择,上证所是真正强大的,在我看来,相对容易学习。

    也见 https://stackoverflow.com/tags/sse/info 有关参考线的某些链接。

        2
  •  40
  •   Diego Pino    11 年前

    既然你要求资源:

    A practical guide to using SSE with C++ :关于如何有效地使用SSE的良好概念概述,包括示例。

    MSDN Listing of Compiler Intrinsics :全面参考您的所有内在需求。它是msdn,但这里列出的几乎所有内部函数都由gcc和icc支持。

    Christopher Wright's SSE Page :快速参考SSE操作码的含义。我想英特尔手册也可以提供同样的功能,但速度更快。

    最好用intrinsics编写大部分代码,但一定要检查编译器输出的objdump,以确保它生成高效的代码。SIMD代码生成仍然是一种相当新的技术,在某些情况下编译器很可能会出错。

        3
  •  7
  •   tomByrer Simon Lang    13 年前

    我发现Agner Fog博士的研究和优化指南非常有价值!他还有一些我还没有尝试过的库和测试工具。 http://www.agner.org/optimize/

    推荐文章