首页
学习
活动
专区
圈层
工具
发布

SIMD编程
EN

Stack Overflow用户
提问于 2010-09-11 19:31:17
回答 3查看 1.6K关注 0票数 1

我使用的是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中有多少个向量函数单元,我可以从哪里获得这些信息?

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-09-11 22:56:16

  • 不,没有任何单一的SSE指令可以做到这一点。您需要发出两条指令。你在想像x86字符串指令和REP前缀这样的东西吗?在所有现代处理器都是高度流水线的意义上,没有SSE equivalent.
  • The两个4宽的向量操作将被令人担忧地执行。第二条指令只比第一条指令慢一个周期(假设这两条指令不是相互依赖的,就是你的例子中的情况),所以它们的执行在时间上会重叠,除了这一个周期。
  • 你的多核处理器的每个核心都有它自己的向量函数单元。你必须编写多线程代码来利用这一点。
  • 一些cpus每个核心有1个向量单元,有些只有1/2!在后一种情况下,向量单元只有64位宽,并且一次只执行SSE指令的一半。物有所值。
  • 你应该研究AVX,这是一个新的指令集扩展,它将SSE改进为支持更广泛的矢量单位。
  • 或者你可以研究在使用OpenCL或Cuda的GPU上进行真正的矢量编程。
票数 3
EN

Stack Overflow用户

发布于 2010-09-11 19:32:52

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

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

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

票数 0
EN

Stack Overflow用户

发布于 2010-09-11 21:29:29

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

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

代码语言:javascript
复制
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迁移到上交所的人,但也有一些很好的一般信息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3690817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档