【问题标题】:How well-suited is openMP for parallelizing a chunk of code that is run many times a second?openMP 是否适合并行化每秒运行多次的代码块?
【发布时间】:2010-03-11 15:52:34
【问题描述】:

假设您有一个典型的游戏循环,每秒运行大约 30 次。一个特定的函数需要大约 50% 的时间,并且看起来像是并行化的主要候选者 - 比如说它是一个大循环,或者有 4 个不同且独立的工作链正在进行。假设我们已经检查过函数本身可以独立很好地并行化到 2 -4 个内核。

在这种情况下,OpenMP 是否可能会加快速度?我希望每帧天真地创建 1-3 个线程来拆分工作不会很好,但我真的不知道线程创建/销毁会带来什么开销,如果它是 10 毫秒或 100 毫秒。而且我不知道如果 OMP 在这种事情上是有效的,或者只适合运行较长的代码。

想法?

【问题讨论】:

    标签: multithreading real-time openmp


    【解决方案1】:

    许多 OpenMP 实现会在程序启动时启动一组线程,并仅在完成时将其关闭——即它们在执行期间不会进行大量破坏/构造。但是,我认为这取决于实现,因此您需要仔细检查您的情况和文档。

    在这个问题上没有第一原则的争论——测试!

    编辑:如果您发现您的实现在执行期间确实启动和停止了线程,您可能可以将整个程序包装在一个 omp 并行结构中并使用主子句来确保程序的单线程部分不会并行化。如果您有 OpenMP 3.0 的实现,这可能比早期规范的实现更容易。

    【讨论】:

      【解决方案2】:

      每 1/30 秒创建和销毁线程可能不会那么高效。人们会说配置文件,但其他具有任何重要多线程经验的人会说减少系统调用的数量。在这种情况下,创建一次这些线程并找出一种方法让它们执行来自主线程的请求会更容易。

      如果这就是你所做的一切,你可以只使用#pragma omp task#pragma omp taskwait

      【讨论】:

      • 任务是 OpenMP 3.0 的一项功能,不是吗?根据维基百科,它还没有正式化或得到广泛支持。所以基于我的编译器是 VS2008,我认为只有 FOR 和 SECTION 可用。
      • 您还可以在函数指针数组上设置 for 循环。
      【解决方案3】:

      不多。 MP = 消息传递。这些算法针对高并行集群系统(2000 台计算机在同一件事上工作)进行了优化,而不是针对“在一个进程中,每秒多次小片段”。当然,这只有在问题需要大量计算时才有效。

      例子:

      • 电影的 3d 渲染,机器可能在几分钟内计算出一帧,你需要计算数万帧。

      【讨论】:

      • -1:虽然我不能明确指出 OpenMP 中的 MP 不代表“消息传递”,但我可以明确指出 OpenMP 为并行化提供了共享内存抽象并且不需要程序员显式编码以传递消息。 OpenMP 代码在具有 1000 个处理器内核的机器上运行良好也是极不寻常的,而且很少有具有这么多内核的共享内存计算机被构建出来。
      • -1:OpenMP 不是多进程或多 PC 系统,您会将其与 MPI(或 OpenMPI en.wikipedia.org/wiki/Openmpi)混淆。 OpenMP 中的 MP 代表“多处理”
      猜你喜欢
      • 2022-01-09
      • 2018-12-19
      • 1970-01-01
      • 2015-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多