SIMD编程

时间:2010-09-11 11:31:17

标签: sse simd

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

我的问题是“是SIMD的全部吗?”。设I1,a2,a3,a4,a5,a6,a7,a8和b1,b2,b3,b4,b5,b6,b7,b8。设A1,A2为向量寄存器。现在,A1&lt;&lt;&lt; (a1,a2,a3,a4) 和B1 <&lt;&lt; (b1,b2,b3,b4)和add(A1,B1)将执行向量加法。

设A2 <&lt;&lt;&lt; (a5,a6,a7,a8),B2 <&lt;&lt; (b5,b6,b7,b8)。是否有添加指令可以同时添加(A1,B1)和添加(A2,B2)。

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

非常感谢与此相关的任何其他信息来源。

3 个答案:

答案 0 :(得分:3)

  • 不,没有任何单一的SSE指令可以做到这一点。您需要发出两条指令。你在想像x86字符串指令和REP前缀吗?没有SSE等价物。

  • 在所有现代处理器都是高度流水线的意义上,两个4宽矢量操作执行。第二条指令将在第一条指令后面的一个循环(假设这两条指令不是相互依赖的,在你的例子中就是这种情况),因此它们的执行将在时间上重叠,除了那一个循环。

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

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

  • 您应该研究AVX,这是一个新的指令集扩展,可以发展SSE以支持更宽的向量单位。

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

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

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

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,但也有一些很好的一般信息。