2010-11-22 73 views
0

我宁可不使用代码,因为它的通用概念:使用OpenMP可以优化此概念吗?

假设我们有一个既不太大也不太小的函数的场景,并且本身也不能用OpenMP for-loop优化。

但是,它是一个在代码中几百个不相关的情况下在整个项目运行过程中被称为数百万次的函数。

[直列本身似乎并没有做太多(默认情况下上优化的gcc成果),使之成为一个宏,而不是平行的任一,这将是一个承诺兼容。]

+0

这太笼统了。答案完全取决于你的功能,以及如何实际调用该功能。 – 2010-11-22 17:03:47

回答

0

当该函数被调用,是否被多次调用,特别是在循环中?这个问题有点含糊 - 也许是(它在几百个不相关的地方每个都会被称为成千上万次 - >数百万次),或者可能不是(它在一百个不相关的地方被称为一次,并且你击中了这些代码段数千次 - >数百万次)。

在第一种情况下,是的,并行化“映射” - 即将函数独立应用于大量情况 - 很容易,OpenMPs非常好。

在第二种情况下,如果该函数被称为一百万次但每次一次,则没有。有重复执行那里,但没有曝光并发;没有必须在独立完成的同时完成的任务清单。如果函数可能被重复参数调用,那么你可以在那里做的所有事情都是使用memoization,这是一种内存/计算时间折衷,而不是一种并行化技术。

在第二种情况下,可能会重构代码,以便一次性创建一堆函数调用,从而暴露并发性并允许并行化 - 但它不是OpenMP(或任何并行编程模型)都可以自动为您做。

2

OpenMP是为“使事情并行” - 在一般情况下。不仅需要for循环...呃,甚至不需要任何循环来充分利用OpenMP并加速代码。

唯一重要的是:“我有几个独立操作一个接一个运行,哪些可以在同一时间工作吗?”。如果是这样,那么您已经找到了使用OpenMP进行优化的简单场所。