OpenMP 4.0引入了一个名为"omp simd"的新结构.使用这种结构比旧的"并行"有什么好处?什么时候会比另一个更好?
我碰巧有几次将部分程序与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];
}
}
Run Code Online (Sandbox Code Playgroud)
我想知道
注意:我没有给出关于不同的SSE版本,处理器/核心数量(在OpenMP中扩展的线程数量)等等...我的问题一般.答案也可以更具体.