增加线程数会降低性能

计算科学 并行计算 模拟 表现 高性能计算 分子动力学
2021-12-01 14:51:13

我使用的并行化和布朗动力学(分子动力学)代码存在问题。我们在大学有自己的本土框架,最近我们改变了使用 OpenMP 进行更密集的计算。我们肯定受 CPU 限制,所以我不必担心计算的总内存或磁盘速度,只需担心处理器。有多个并行化的代码部分,它们以两种基本形式出现。

  1. 没有共享变量,因此不需要关键操作。
  2. 一个 omp 锁,这样我们就可以访问共享变量。

同样相关的是这些正在运行的架构。我使用的集群有 2 个 Intel Xeon 六核处理器,因此每个节点有 12 个内核,我一次只在 1 个节点上运行一个 sim。问题是,当我在节点上使用 6 核时,我立即看到性能下降,所以我发现使用 12 核的性能比 6 更差。最初我认为这可能是两个处理器之间的同步问题,但只有我的函数中的 1 个具有关键部分,其他 3 个没有任何共享变量,并且最后也同步了它们的主要结果。在这种情况下,每个线程都有自己写入的数组,然后在它们全部完成后计算结果。

我刚刚从使用 gcc 转向 icc(英特尔编译器),这无疑改善了我的时间,但我想知道是否有人对我还能做些什么来检查发生了什么有任何想法。不幸的是,我们没有在集群上安装 VTune,所以我无法使用英特尔工具进行分析,但是这里的每个人都怎么想?这听起来像是一个缓存问题吗?或者是更险恶的事情。

我只是不太明白,鉴于需要同步的代码很少,一旦通过一个处理器,更多内核的性能会更差。

1个回答

您的代码使用的所有内存可能都在一个套接字上,并且所有任务都在该套接字上运行多达 6 个内核。当您达到 7 个以上的套接字时,套接字之间就会进行传输以获取内存。您可能需要调查线程的内存关联选项。Linux 中的默认策略是 first-touch(我认为),所以如果您有一个线程初始化事物,然后所有线程都开始工作,您可能需要更改它。