【问题标题】:SIMD ProgrammingSIMD 编程
【发布时间】:2011-04-11 02:06:15
【问题描述】:

我正在使用 Core2Duo 处理器(编译器 gcc 4.4.1)中提供的 SSE 扩展。我看到有 16 个寄存器可用,每个寄存器都是 128 位长。现在,我可以在一个寄存器中容纳 4 个整数值,在另一个寄存器中容纳 4 个整数值,并且使用内在函数我可以将它们添加到一条指令中。明显的优势是这种方式我只需要 1 条指令而不是 4 条。

我的问题是“这就是 SIMD 的全部内容吗?”。让我有 a1、a2、a3、a4、a5、a6、a7、a8 和 b1、b2、b3、b4、b5、b6、b7、b8。令 A1、A2 为向量寄存器。现在,A1

令 A2

core2duo 中有多少向量功能单元可用,我在哪里可以获得这些信息?

高度赞赏与这些相关的任何其他信息来源。

【问题讨论】:

    标签: sse simd


    【解决方案1】:
    • 不,没有任何单一的 SSE 指令可以做到这一点。您需要发出两条指令。您是否在考虑 x86 字符串指令和 REP 前缀之类的东西?没有 SSE 等价物。

    • 两个 4 宽向量操作在所有现代处理器都高度流水线化的意义上同时执行。第二条指令将在第一条指令之后仅一个周期通过管道(假设两者不相互依赖,在您的示例中就是这种情况),因此它们的执行将在时间上重叠,除了那个周期。

    • 多核处理器的每个核心都有自己的矢量功能单元。您必须编写多线程代码才能利用这一点。

    • 有些 CPU 每个内核有 1 个向量单元,有些只有 1/2!在后一种情况下,向量单元只有 64 位宽,并且一次只执行一半的 SSE 指令。一分钱一分货。

    • 您应该研究一下 AVX,它是一种新的指令集扩展,它使 SSE 发展为支持更广泛的向量单元。

    • 或者您可以使用 OpenCL 或 Cuda 在 GPU 上研究真正的矢量编程。

    【讨论】:

      【解决方案2】:

      我不认为有一个单一的指令可以做到这一点(除非他们偷偷进入最新版本的 SSE)。

      但是,由于您正在执行的操作是独立的,因此编译器可以在第一个 add 指令完成之前发出第二个 add 指令。所以时间线看起来像

      begin C1 = A1 + B1
      begin C2 = A2 + B2
      wait
      end C1 = A1 + B1
      end C2 = A2 + B2
      

      因此,即使您使用了两条指令,也不一定要花费两倍的时间。等待的实际持续时间取决于处理器和您使用的特定指令的延迟。

      这里有更详细的流水线解释:http://en.wikipedia.org/wiki/Instruction_pipeline

      对于 SIMD 编程的一般帮助,Apple's SSE page 非常好。它有点适合将应用程序从 PowerPC 迁移到 SSE 的人,但那里也有一些很好的一般信息。

      【讨论】:

        【解决方案3】:

        英特尔网站包含您需要的所有信息!

        http://www.intel.com/products/processor/manuals/

        编辑以回答评论:所有信息都在上面链接的链接中,但不是。您可以将 8 个 16 位整数打包到 1 个寄存器中,从而执行 8 个同时添加,但没有 SSE 不允许添加 2 个寄存器同时。

        【讨论】:

        • 你能至少给出第一个问题的答案吗?那就是相同的加法指令是否可以将两组不同的4个整数相加。
        猜你喜欢
        • 2010-11-27
        • 2017-11-14
        • 2015-10-16
        • 1970-01-01
        • 1970-01-01
        • 2013-02-01
        • 1970-01-01
        • 2012-02-21
        相关资源
        最近更新 更多