1

我正在使用 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 <<< (a1, a2, a3, a4) 和 B1 <<< (b1, b2, b3, b4) 和 add (A1, B1) 将执行向量加法。

令 A2 <<< (a5, a6, a7, a8), B2 <<< (b5, b6, b7, b8)。是否有可以同时执行 add(A1, B1) 和 add(A2, B2) 的添加指令。

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

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

4

3 回答 3

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

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

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

  • 有些 cpu 每个核心有 1 个向量单元,有些只有 1/2!在后一种情况下,向量单元只有 64 位宽,并且一次只执行一半的 SSE 指令。你得到你所付出的。

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

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

于 2010-09-11T14:56:15.880 回答
0

我不认为有一个单一的指令可以做到这一点(除非他们偷偷进入最新版本的 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 的 SSE 页面非常好。它有点面向将应用程序从 PowerPC 迁移到 SSE 的人,但那里也有一些很好的一般信息。

于 2010-09-11T13:29:29.363 回答
0

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

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

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

于 2010-09-11T11:32:51.760 回答