C 为什么我的OpenMP实现比单线程实现慢?(后续行动)

C 为什么我的OpenMP实现比单线程实现慢?(后续行动),c,openmp,C,Openmp,这是一个后续行动 我坚持提供的答案,并使用任务而不是pragmas来加速代码。然而,与顺序(相同)程序相比,两个程序运行速度相同。我看不到加速 修改后的代码如下所示: 我只是删除了所有for pragmas,并将其替换为为为递归过程指定pragmas 我做错什么了吗?我应该看到一个几乎是线性的加速。你们觉得怎么样 谢谢 首先-您仍然有一个“#pragma end critical”应该删除。它没有引起问题,但它是不正确的。第二,正如我在您发布的另一个问题中所说的,您可能需要考虑如何并行化代码以查

这是一个后续行动

我坚持提供的答案,并使用任务而不是pragmas来加速代码。然而,与顺序(相同)程序相比,两个程序运行速度相同。我看不到加速

修改后的代码如下所示:

我只是删除了所有for pragmas,并将其替换为为为递归过程指定pragmas

我做错什么了吗?我应该看到一个几乎是线性的加速。你们觉得怎么样


谢谢

首先-您仍然有一个“#pragma end critical”应该删除。它没有引起问题,但它是不正确的。第二,正如我在您发布的另一个问题中所说的,您可能需要考虑如何并行化代码以查看加速效果,因此仅用任务pragma替换其他pragma可能不会加快速度。第三,您没有将任务放入并行区域,因此根本没有并行运行。你不能只是在任务周围添加一个并行区域,或者你要多次执行相同的任务。

我不明白将任务并行的部分,我看了一些示例,似乎不需要,你确定吗?另外,我并没有简单地替换,而是将递归过程转化为任务。我不知道您一直在看什么样的示例-但是,是的,我确信如果您希望任务在OpenMP中并行运行,那么它们必须位于并行区域内。并行区域表示您将要运行多个线程,这就是线程设置的时间。任务被放入一个池中,然后线程将其提取并执行。这就是为什么我说不能用一个区域来包围任务,因为这样每个线程都会运行每个任务。看看OpenMP V3.0规范,例如a.13.5c和a.13.10c。这些显示了整个区域。其他示例显示任务,但不显示周围的并行区域。我想这些例子可能需要进一步的解释。我将在正在进行的V3.1审查中记下这一点。