【发布时间】: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