sge 集群性能低下

计算科学 表现 高性能计算
2021-12-27 05:37:40

我的项目有问题。当我运行蒙特卡罗模拟的代码时,在本地服务器(我办公室的机器)上,它以每 24 小时大约 100000 步的速度运行。当我在集群上运行它时,速率下降到大约一半甚至更低。

我试图弄清楚这一点,但我找不到任何理由。我不希望您阅读我的代码并对其进行分析,主要是因为这不是您的工作。我只要求你有任何建议的经验。到目前为止,我得到的是:

  1. 我不参加任何并行计算。
  2. 当我在本地机器上运行代码时,除了它之外我通常不会运行任何繁重的东西。
  3. 我确实在本地机器上运行了几份代码副本,但不超过该机器上处理器的数量 - 1。IT 人员不确定,但他们认为本地服务器上没有启用双重处理。(有一个未解决的问题)
  4. 当我在集群上运行代码的单个副本时,它运行正常。
  5. 仅当副本数为 8 时,性能才会显着下降。
  6. 集群上有两种机器。16 个节点(8 个双处理器)和 24 个节点(我认为那些是 6 个四核处理器)。
  7. 代码是用 C++ 编写的。即使它被认为是糟糕的编程,我所有的变量都是全局的,我直接访问它们(而不是通过函数)。
  8. 我使用icc -O3 -fast -ip. 删除这些标志中的任何一个都会降低性能或没有任何明显的影响。

我认为,从所有这些来看,这是内存管理的一个问题,但我不知道如何测试它。

我对此有几个问题:

  • 有没有人遇到过类似的事情?
  • 如何测试这是否是内存问题?
  • 我可以在我的编译中添加另一个标志吗?
  • 有没有在 c++ 中有效使用内存的技巧?

感谢您的任何帮助

1个回答

您是说当您在单个节点上运行 > 8 个作业副本时,性能会显着下降?

这通常发生在需要高内存带宽的代码中——这些代码对内存进行大量读取和写入以进行相当少量的计算。在某些时候,您会饱和内存子系统的功能,添加更多任务只会让事情变得更糟。Doug Eadline 在他的网站 ( http://www.clustermonkey.net//content/view/306/1/ )上对此进行了很好的介绍性讨论——他谈论的是“有效核心数” ,我不确定这是否有助于思考潜在问题,但它可以让您了解在一个节点上可以有利地使用多少个内核。

您可以重组代码以使用更少的内存带宽(如果您无意中使用了超出您需要的内存带宽,使用类似cachegrind的东西可能会有所帮助)在这种情况下,您应该能够在每个节点上使用更多的任务,而不会饿死其他进程的内存带宽;或者您可能不会,在这种情况下,您会被困在每个节点使用更少的内核。