我正在使用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,B4,B5,B6,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)。是否有添加指令可以同时添加(A1,B1)和添加(A2,B2)。

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

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

有帮助吗?

解决方案

  • 不,没有任何SSE指令可以这样做。您需要发布两个说明。您是否想到X86字符串指令和代表前缀之类的东西?没有SSE等效。

  • 两个四宽矢量操作 将要 在所有现代处理器都高度管道的意义上,一致执行。第二个指令将仅在第一个循环之后的1个周期降低(假设两者不是相互依存的,在您的示例中就是这种情况),因此除了那个周期之外,他们的执行时间将与时间重叠。

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

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

  • 您应该查看AVX,这是发展SSE以支持更宽向量单元的新指令集扩展程序。

  • 或者,您可以在使用OpenCL或CUDA的GPU上查看实际矢量编程。

其他提示

我认为没有一个指令可以执行此操作(除非他们将其陷入了最新版本的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编程的帮助, 苹果的SSE页面 很好。这有点针对人们从PowerPC迁移到SSE的应用程序,但是那里也有一些不错的一般信息。

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top