我使用的是Core2Duo processor (编译器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指令可以同时执行add(A1,B1)和add(A2,B2)。
core2duo中有多少个向量函数单元,我可以从哪里获得这些信息?
任何其他与这些相关的信息来源都将受到高度赞赏。
发布于 2010-09-11 22:56:16
发布于 2010-09-11 19:32:52
英特尔网站包含了您需要的所有信息!
http://www.intel.com/products/processor/manuals/
编辑以回答评论:所有的信息都在链接到上面的链接,但没有。您可以将8个16位整数打包到1个寄存器中,从而同时执行8个加法,但没有SSE不允许同时添加2个寄存器。
发布于 2010-09-11 21:29:29
我认为没有一条指令可以做到这一点(除非他们将一个指令偷偷放入最新版本的SSE中)。
但是,由于您正在执行的操作是独立的,因此编译器可以在第一条指令完成之前发出第二条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
要获得有关单指令多数据编程的一般帮助,Apple's SSE page是相当不错的。它在某种程度上是面向将应用程序从PowerPC迁移到上交所的人,但也有一些很好的一般信息。
https://stackoverflow.com/questions/3690817
复制相似问题