Multithreading openMP对于并行化每秒运行多次的代码块有多合适?

Multithreading openMP对于并行化每秒运行多次的代码块有多合适?,multithreading,real-time,openmp,Multithreading,Real Time,Openmp,假设你有一个典型的游戏循环,每秒运行30次。一个特定的函数占用了大约50%的时间,看起来像是并行化的主要候选函数——比如说它是一个大循环,或者有4条不同的独立的工作链正在进行。假设我们已经检查过函数本身可以很好地与2-4个内核隔离并行 在这种情况下,OpenMP是否有可能提高速度?我认为,天真地在每一帧创建1-3个线程来分割工作是不太好的,但我真的不知道创建/销毁线程会带来多少开销,如果是10毫秒或100毫秒。我不知道OMP在这方面是否有效,或者只适用于运行时间较长的代码段 想法?不多。MP=消

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

在这种情况下,OpenMP是否有可能提高速度?我认为,天真地在每一帧创建1-3个线程来分割工作是不太好的,但我真的不知道创建/销毁线程会带来多少开销,如果是10毫秒或100毫秒。我不知道OMP在这方面是否有效,或者只适用于运行时间较长的代码段


想法?

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

示例:

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

许多OpenMP实现在程序启动时启动一组线程,只有在最终完成时才将其关闭——即它们在执行过程中不会进行大量的破坏/构造。然而,我认为这取决于实现,所以您需要仔细检查您的情况和文档

不要在这个问题上与第一原则争论——测试


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

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


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

-1:虽然我不能明确地说OpenMP中的MP不代表“消息传递”,但我可以明确地说OpenMP提供了用于并行化的共享内存抽象,并且不需要程序员明确地编码用于传递消息。OpenMP代码在具有1000个处理器内核的机器上运行良好也是极不寻常的,而且很少有具有这么多内核的共享内存计算机被构建。-1:OpenMP不是一个多进程或多PC系统,你把它与MPI(或OpenMPI)混淆了。MP在OpenMP中代表“多处理”任务是OpenMP 3.0的一项功能,不是吗?根据维基百科,它还没有正式化或得到广泛支持。因此,基于我的编译器VS2008,我认为只有FOR和SECTION可用。您还可以在函数指针数组上设置FOR循环。