假设你有一个典型的游戏循环,每秒运行大约30次。一个特定的函数花费了大约50%的时间,看起来像是并行化的主要候选函数--假设它是一个大循环,或者有4条独立的工作正在进行。假设我们已经检查了函数本身可以很好地隔离于2-4核并行化。
在这种情况下,OpenMP会放弃加速吗?我认为天真地创建1-3个线程来分割工作并不是件好事,但我真的不知道一个线程的创建/销毁会带来什么样的开销,如果是10‘s还是100’s。我不知道OMP在这类事情上是否有效,或者只适合于运行更长时间的代码。
有什么想法?
发布于 2010-03-11 15:57:23
许多OpenMP实现在程序启动时启动了一组线程,并且只在完成时才关闭它--也就是说,在执行过程中,它们不会做太多的破坏/构建。但是,我认为这是依赖于实现的,因此您需要仔细检查您的情况和文档。
不要争论这个问题的首要原则--测试!
编辑:如果您发现您的实现在执行过程中确实启动和停止线程,您可能可以将整个程序包装在一个omp并行构造中,并使用主子句来确保程序的单线程部分不并行。如果您有OpenMP 3.0的实现,这可能比以前规范的实现更容易。
发布于 2010-03-11 16:28:39
每隔1/30秒就创建和销毁线程,可能不会有这样的效果。人们会说profile,但是其他具有任何重要多线程经验的人会说减少系统调用的数量。在这种情况下,创建这些线程一次并想出一种从主线程执行请求的方法会更容易。
如果这就是您所要做的,那么您可能只需要使用#pragma omp task和#pragma omp taskwait。
发布于 2010-03-11 15:56:50
不是很多。MP =消息传递。这些算法是针对高度并行的集群系统(2000台计算机在同一件事情上工作)进行优化的,而不是“在一个过程中,每秒有很多次的小片段”。当然,只有当问题需要重要的计算时,这才能有效地工作。
示例:
电影的
https://stackoverflow.com/questions/2426427
复制相似问题