给定一个示例函数(示例如下所示),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];
}
}
我想知道
注意:我没有给出一个关于不同SSE版本,处理器/核心数量(在OpenMP中扩展的线程数量)等等...我的问题一般。答案也可以更具体。
答案 0 :(得分:5)
OpenMP和矢量化不竞争技术,而是互相增强。矢量化可以提高具有矢量功能(SSE / 3DNow!/ Altivec /等)的CPU内核的串行性能,从而使每个线程运行得更快,而OpenMP可以使用多个可用内核以运行多个线程为了并行解决更大的问题。
总结:
矢量化只是数据并行(对多个数据项应用相同的操作)并且在尽可能最低的硬件级别(核心/ ALU)上工作,而OpenMP可以是数据和/或任务并行,并且是更高的抽象水平。
一如既往存在“依赖”这一论点,因为矢量化或OpenMP或矢量化+ OpenMP的性能可能取决于硬件,内存带宽,缓存使用等等......
关于你的案例功能,它取决于矢量的大小。如果它们太小,使用OpenMP将没有任何好处,甚至由于开销导致执行速度变慢。矢量化可能会缩短执行时间。
答案 1 :(得分:4)