0

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

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

想法?

4

3 回答 3

1

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

在这个问题上不要从第一原则争论 - 测试!

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

于 2010-03-11T15:57:23.317 回答
0

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

如果这就是你所做的一切,你可能只需要使用#pragma omp taskand #pragma omp taskwait

于 2010-03-11T16:28:39.033 回答
-3

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

例子:

  • 电影的 3d 渲染,机器可能在几分钟内计算出一帧,你需要计算数万帧。
于 2010-03-11T15:56:50.907 回答