OpenMP性能优化全解析
1. 缓存相关概念及性能测试
在进行性能模拟时,为了模拟代码在没有缓存变量的情况下的性能,我们在第46行插入了一个刷新循环,用于清空 x 和 xnew 数组的缓存。当缓存中没有数据时,这种情况被称为冷缓存;而当数据存在于缓存中时,则称为热缓存。这两种情况在不同的使用场景中都有可能出现,而且在没有深入分析的情况下,很难确定会出现哪种情况。
下面来看看不同操作在不同优化阶段的运行时间:
| 操作 | 串行 | 简单循环级OpenMP | 添加首次触摸优化 |
| — | — | — | — |
| 向量加法 | 0.253 | 0.0301 | 0.0175 |
| 流三元组 | 0.164 | 0.0203 | 0.0131 |
| 模板计算 | 62.56 | 3.686 | 3.311 |
从表中可以看出,在Skylake Gold 6152双套接字节点上使用GCC 8.2编译器,88个线程时速度提升了约10倍。添加OpenMP编译指示以进行正确的首次触摸内存分配,还能进一步提高速度。
2. 循环级OpenMP性能分析
引入循环级OpenMP对源代码的改动较少,但性能提升显著。以模板计算为例,串行运行时间与并行运行时间的比值(即加速比)为17.0倍。对于88个线程的系统,理想加速比为88,但实际并行效率仅为19%(17 / 88)。不过,在较少线程数(如4个线程)时,并行效率能达到85%。
在计时测试中,第一次优化(简单循环级OpenMP)仅在计算循环中使用了OpenMP并行 <
超级会员免费看
订阅专栏 解锁全文
51

被折叠的 条评论
为什么被折叠?



