要使用矢量单位,例如512位宽,以便在8个双精度值上同时操作,是否需要单线程并使用AVX内在函数?如果我的程序不易于矢量化,我可以通过启动8个线程来获得一些好处,其中每个线程使用1个单元吗?
答案 0 :(得分:3)
多线程和SIMD是正交的;如果你的问题有大规模的并行性,你可以多线程。如果它具有SIMD友好的并行性,则可以进行矢量化。通常你可以做到这两点,这是xeon-phi的全部要点。
多核CPU中的每个CPU核心都有自己的向量执行单元集。
在每个线程中使用SIMD可能意味着只有几个线程而不是很多线程使内存带宽饱和,对于受内存带宽限制的问题,但每个内核都有自己的专用L1 / L2缓存(例如Intel SnB中的256kiB L2) - 家庭核心)。因此,如果您可以适当地缓存阻止aka loop-tile,则每个线程都可以遍历工作集的一小部分,该工作集在该核心的本地缓存中保持热门。
对于没有向量化的问题,是的,它肯定有助于多线程。但是,每个核心都是独立的,所以避免使用SIMD并不能真正帮助你的各个线程的每线程性能。
这个想法主要是虚假的:
但是,它不是完全虚假的:Hyperthreading在共享相同物理内核的两个线程在内存延迟或分支错误预测(而不是ALU执行端口,缓存大小)等方面存在瓶颈时确实工作得更好或内存带宽)。我可以通过启动8个线程获得一些好处,其中每个线程使用1个单位
有关更多低级别内容,请参阅Agner Fog's optimization guides标记wiki中的x86和其他链接。
通常可以重新设计数据结构以使SIMD友好,但通常需要进行大量更改。希望您使用一些包装器来抽象访问您的数据结构,这样您就可以在不触及大量代码的情况下更改其布局。
有关重新设计SIMD友好代码的示例,请参阅the slides from a SIMD talk。