multithreading - openmp:在我的桌面上使用多个线程时性能会降低,但在我的服务器上则相反
问题描述
我相信我读过很多关于 StackOverflow 线程的文章,内容是在使用 OpenMP 增加线程数时会降低性能。主要是因为虚假分享。我的情况完全不同,因为我的两台机器显示相反的结果。
我正在运行STREAM benchmark,关于我的机器的信息写在下面:
- 英特尔至强 Gold-6148。20 核(40 线程),2.4 GHz,27.5MB LLC
- 英特尔酷睿 i5-9400。6 核(6 线程),2.9 GHz,9MB LLC
两台机器之间的内存信息相似,所以我将省略它。
我运行了很多次基准测试并检查了运行之间的差异是否足够小。结果非常有趣。
OMP_NUM_THREADS
当使用该选项增加线程数时,Gold-6148(又名服务器)会获得增强的结果。但是,i5-9400(又名桌面)的结果会随着多线程数的增加而减少。
我设置了STREAM_ARRAY_SIZE
20m,并仔细检查了各种尺寸,所以它不会影响结果。另外,我怀疑可能是因为两者之间的 glibc/gomp 库有任何区别,但没有区别。
知道为什么会这样吗?我只是心不在焉地反复看下面的图表... i5-9400 结果 gold-6148 结果
解决方案
两台机器之间的内存信息相似,所以我将省略它。
在谈论 STREAM 基准时,您不能简单地忽略最重要的信息。Xeon Gold 6148有六个 DDR4-2666 内存通道,分布在两个独立的内存控制器上,而i5-9400(假设 i5-9700 是一个错字,因为 i7-9700 是八核 i7 而不是六核 i5 CPU)只有两个单个内存控制器上的DDR4-2666 内存通道. 因此,在所有六个通道上都安装了内存模块的 6148 能够在两个通道上提供相同类型内存模块的 i5-9400 的内存带宽的 3 倍。它还可以同时处理更多的内存请求,因此可以通过多个线程提供更好的内存利用率。因此,实际的内存配置非常重要。
解读 STREAM 结果需要深入了解底层 CPU 架构。Georg Hager有一篇关于该主题的好文章。
推荐阅读
- visual-studio - Visual Studio 2019:发布配置文件中的“删除现有文件”选项消失了
- php - 在 WooCommerce 快速订单预览窗口的新列中显示产品缩略图
- java - FFMPEG在将tiff图片转换为png时反转颜色
- c++ - freecodecamp.org 或其他受人尊敬的网站上的 C++ 认证?
- python - 我的随机森林分类算法没有给出我想要的结果
- c++ - 从另一个小部件触发检查按钮悬停事件
- python - Flask 应用程序在本地工作时与使用 apache 部署时不同
- typescript - 是否有任何 cdk typescript 示例将 lambda 发布到 sns 主题?
- node.js - 使用 express-fileupload 上传文件不起作用
- angular - Angular ngx-smart-modal 弹出窗口中的 Quill JS 问题