【问题标题】:Optimal size of a parallel for loop body并行 for 循环体的最佳大小
【发布时间】:2013-05-26 17:38:30
【问题描述】:

假设你有一个并行for循环实现,例如ConcRT parallel_for,将所有工作放在一个 for 循环体中总是最好的吗?

举个例子:

for(size_t i = 0; i < size(); ++i)
{
    DoSomething(a[i], b[i]);
}
for(size_t i = 0; i < size(); ++i)
{
    DoSomethingElse(a[i], b[i]);
}

对比

for(size_t i = 0; i < size(); ++i)
{
    DoSomething(a[i], b[i]);
    DoSomethingElse(a[i], b[i]);
}

第二种变体是显而易见的方法,但在并行处理方面可能还有其他考虑因素?

我只是在使用 parallel_for 时,案例选项 1 比第二个更快(平均约 30 毫秒到约 38 毫秒)。但我不擅长对并行算法进行基准测试,所以也许我测量错了。无论如何,不​​幸的是我不能发布这个观察的实际代码示例。

是否有一些经验法则、其他注意事项或只是尝试和基准测试?

【问题讨论】:

  • 如果DoSomething不太乱的话,我认为第二个选项具有更好的局部性。
  • 看起来您在尝试对编译器进行二次猜测。您的问题取决于编译器,尤其是优化级别。有些编译器可能足够聪明,可以识别第二个示例中的并行机会,有些则不然。研究更多关于您的编译器以及如何帮助它识别并行代码片段的信息。也许涉及#pragma

标签: c++ for-loop concurrency parallel-processing


【解决方案1】:

这在很大程度上取决于您在 DoSomethingDoSomethingElse 中所做的事情

假设DoSomething 需要内存中的某些内容,因此当您在循环中运行它时,该对象将在缓存中,但是当您从DoSomethin 切换到DoSomethingElse 时,这也需要一些来自内存,缓存中的对象发生变化,需要从内存中取出来。

再次 - 不确定情况是否如此,很大程度上取决于您在这些方法中所做的事情。 乍一看 - 性能应该没有任何不同

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    • 2018-09-23
    • 2012-09-20
    • 1970-01-01
    • 2018-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多