我开始学习OpenMP,在集群中从https://computing.llnl.gov/tutorials/openMP/exercise.html运行示例(使用gcc 4.3)。所有的例子都很好,但我有一些问题:
答案 0 :(得分:7)
通常,您的OpenMP程序不知道,也不关心它运行的核心。如果您有一个作业管理系统,可以在其日志文件中提供所需的信息。如果做不到这一点,你可以在线程中插入对环境的调用,并检查一些环境变量的值。所谓的内容以及你如何做到这一点取决于平台,我会留下你的想法。
我(或任何其他SOer)应该怎么知道?对于有根据的猜测,你必须告诉我们更多关于你的硬件,操作系统,运行时系统等等的问题。问题的最佳答案是你根据自己的测量结果确定的问题。我担心你可能会错误地认为信息是在计算机周围发送的 - 共享内存编程变量通常停留在一个地方(或者至少你应该考虑将它们留在一个地方,现实可能会更加混乱
TotalView或DDT等并行调试器可能是最好的工具。我还没有使用英特尔调试器的并行功能,但它们看起来很有前景。我会把它留给资金不足的程序员而不是我推荐FOSS选项,但他们就在那里。
i)为您的问题选择最快的并行算法。这不一定是最快的并行串行算法。
ii)测试和测量。如果没有数据,则无法进行优化,因此您必须对程序进行概要分析并了解性能瓶颈所在。不要相信“X比Y快”的任何建议。这些陈述通常基于非常狭隘且经常过时的案例,并且在其发起人的头脑中已成为“真理”。几乎总是可以找到反例。这是你的代码,你想要更快,你的调查是无可替代的。
iii)了解你的编译器。调整编译选项所用时间的回报率(以代码速度改进衡量)远高于“手动”修改代码的回报率。
iv)我坚持的一个“真理”是,编译器在优化当前处理器体系结构上的内存层次结构时并不擅长优化。这是代码修改可能值得的一个领域,但在您分析代码之前,您不会知道这一点。
答案 1 :(得分:1)
您无法知道,不同内核上的线程分区完全由操作系统处理。您讲的是节点,但OpenMP是一个多线程(而非多进程)并行化,允许对包含多个内核的一台机器进行并行化。如果需要跨不同机器进行并行化,则必须使用OpenMPI等多进程系统。
通讯时间的数量级为:
应在硬件规格中指定所有理论速度。你也应该做一些基准测试,以了解你真正拥有的东西。
对于OpenMP,gdb
可以很好地完成工作,即使有很多线程也可以。