2012-05-09 98 views
1

给出一个示例函数(示例如下),可以使用OpenMP对for循环进行并行化处理,也可以使用向量化进行矢量化(假设编译器进行矢量化处理)。OpenMP和矢量化之间的比较

void function(float* a, float* b, float* c, int n) 
{ 
     for(int i = 0; i < n; i++) 
     { 
      c[i] = a[i] * b[i]; 
     } 
} 

我想知道

  1. 是否会有OpenMP的 和矢量
  2. 之间的任何性能上的差异是否有任何优势,在使用一个以上的其他。
  3. 是否可以同时使用OpenMP和矢量化。

注:我没有给一个虽然有关不同SSE版本,(如线程数目的OpenMP可扩展至)处理器/核心的数量,等等。我的问题是一般。答案也可以更具体。

回答

5

OpenMP和载体化是相互竞争的技术,而是他们增加彼此。 Vectorisation可以提高具有向量能力的CPU内核(SSE/3DNow!/ Altivec /等)的串行性能,从而使每个线程运行得更快,而OpenMP可以使用多个可用内核来运行多个线程为了解决更大的问题并行。

总结:

  • 一个向量化串行应用通常运行比非矢量化应用串行更快;
  • 与非矢量化串行应用程序相比,非矢量化OpenMP应用程序的运行速度通常更快(如果写入正确并且算法允许并行化);
  • 矢量化的OpenMP应用程序通常比非矢量化的OpenMP应用程序运行得更快,该应用程序的运行速度通常比非矢量化的串行应用程序快。

向量化是唯一的数据并行(应用相同的操作,以多个数据项)和工作在最低硬件级别可能的(核心/ ALU),而OpenMP的既可以是数据和/或任务并行和是一个抽象在更高的水平上。

由于总是存在的是“这取决于”的说法,因为矢量化或OpenMP的矢量化或OpenMP的+的表现可能取决于硬件,内存带宽,缓存使用,等等,等等,等等...

关于您的案例功能,它取决于向量的大小。如果它们太小,使用OpenMP将不会带来好处,甚至会由于开销而导致执行速度变慢。 Vectorisation可能会缩短执行时间。

3
  1. 是的。
  2. 衡量,不要争辩。
  3. 是的。