OpenMP调试新手问题

时间:2010-12-15 09:17:48

标签: c openmp

我开始学习OpenMP,在集群中从https://computing.llnl.gov/tutorials/openMP/exercise.html运行示例(使用gcc 4.3)。所有的例子都很好,但我有一些问题:

  1. 我如何知道哪些节点(或每个节点的核心)有不同的线程被“运行”?
  2. 节点的情况,用于发送信息并将其恢复的微秒或纳秒的平均传输时间是多少?
  3. 调试OpenMP程序的最佳工具是什么?
  4. 加快真实节目的最佳建议?

2 个答案:

答案 0 :(得分:7)

  1. 通常,您的OpenMP程序不知道,也不关心它运行的核心。如果您有一个作业管理系统,可以在其日志文件中提供所需的信息。如果做不到这一点,你可以在线程中插入对环境的调用,并检查一些环境变量的值。所谓的内容以及你如何做到这一点取决于平台,我会留下你的想法。

  2. 我(或任何其他SOer)应该怎么知道?对于有根据的猜测,你必须告诉我们更多关于你的硬件,操作系统,运行时系统等等的问题。问题的最佳答案是你根据自己的测量结果确定的问题。我担心你可能会错误地认为信息是在计算机周围发送的 - 共享内存编程变量通常停留在一个地方(或者至少你应该考虑将它们留在一个地方,现实可能会更加混乱

  3. 。但也无法辨别并且不会发送或接收
  4. TotalViewDDT等并行调试器可能是最好的工具。我还没有使用英特尔调试器的并行功能,但它们看起来很有前景。我会把它留给资金不足的程序员而不是我推荐FOSS选项,但他们就在那里。

  5. i)为您的问题选择最快的并行算法。这不一定是最快的并行串行算法。

    ii)测试和测量。如果没有数据,则无法进行优化,因此您必须对程序进行概要分析并了解性能瓶颈所在。不要相信“X比Y快”的任何建议。这些陈述通常基于非常狭隘且经常过时的案例,并且在其发起人的头脑中已成为“真理”。几乎总是可以找到反例。这是你的代码,你想要更快,你的调查是无可替代的。

    iii)了解你的编译器。调整编译选项所用时间的回报率(以代码速度改进衡量)远高于“手动”修改代码的回报率。

    iv)我坚持的一个“真理”是,编译器在优化当前处理器体系结构上的内存层次结构时并不擅长优化。这是代码修改可能值得的一个领域,但在您分析代码之前,您不会知道这一点。

答案 1 :(得分:1)

  1. 您无法知道,不同内核上的线程分区完全由操作系统处理。您讲的是节点,但OpenMP是一个多线程(而非多进程)并行化,允许对包含多个内核的一台机器进行并行化。如果需要跨不同机器进行并行化,则必须使用OpenMPI等多进程系统。

  2. 通讯时间的数量级为:

    • 在同一CPU内核之间进行通信的情况下,可以认为是瞬时的
    • ~10 GB / s用于主板上两个CPU之间的通信
    • ~100-1000 MB / s用于节点之间的网络通信,具体取决于硬件

    应在硬件规格中指定所有理论速度。你也应该做一些基准测试,以了解你真正拥有的东西。

  3. 对于OpenMP,gdb可以很好地完成工作,即使有很多线程也可以。

  4. 我在超级计算机上进行极端物理模拟,这是我们的日常目标:
    • 在线程/进程之间使用尽可能少的通信,99%的时间是在并行作业中杀死性能的通信
    • 最佳地分割任务,机器负载应尽可能接近100%
    • 测试,调整,重新测试,重新调整......并行化根本不是一个通用的“奇迹解决方案”,它通常需要一些实际工作来提高效率。