【发布时间】:2011-02-21 10:09:56
【问题描述】:
我正在尝试学习 OpenMP 的概念,但偶然发现了一个案例,我很难掌握如何使用这个库来解决这个问题。
假设我们有以下递归函数
// ...
void recurse(int tmp[], int p, const int size)
{
if (p == size)
{
// Computationally heavy, should be executed in its own "thread"
performTask(tmp); // Note: Only requires read access
}
else
{
for(int i = 0; i < size; i++)
{
// Alter tmp and continue recursion
tmp[p] = i;
recurse(tmp, p+1, size);
}
}
}
// ...
int main(int argc, char * argv[])
{
int tmp[10];
recurse(tmp, 0, 10);
return 0;
}
如何在使用 OpenMP 在主线程中生成新结构的同时并行执行 performTask?
我知道有一种叫做“任务”的东西,我认为这就是我应该在这里使用的东西,但是我想出的所有东西根本没有任何性能提升。请指出正确的方向。
编辑:为了更好地解释,我将示例程序更具体。
【问题讨论】:
-
您必须提供更多信息。 appendStuffOn 在做什么?如果它正在访问一个公共结构,那么您可能无法获得性能,因为该结构可能必须被锁定,并且在结构上锁定和解锁的开销以及通过该子程序基本上序列化代码可能会使性能更差比串行运行。
-
使用single,也许?
-
appendStuffOn 将返回一个新的 tmp 副本。
-
主要是递归函数是唯一改变结构的函数,performTask只是读取它。
-
我的意思是作为评论 - 不是答案。下一个问题是什么时候 isDone 是真的?如果您在调用 performTask 之前执行所有 appendStuffOn 调用,那么并行化将无济于事。