回路体并联的最佳尺寸

Optimal size of a parallel for loop body

本文关键字:最佳 回路      更新时间:2023-10-16

假设你有一个并行的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毫秒)。但我不擅长对并行算法进行基准测试,所以可能我测量错了。无论如何,不幸的是,我不能为这个观察发布实际的代码示例。

是否有一些经验法则,额外的考虑因素或只是尝试和基准?

这很大程度上取决于你在DoSomethingDoSomethingElse中做什么

假设DoSomething需要从内存中取出一些东西,所以当你在循环中运行它时,对象将在缓存中,但是当你从DoSomethin切换到DoSomethingElse时,也需要从内存中取出一些东西,缓存中的对象发生变化,需要从内存中取出它。

还是那句话,我不确定是不是这样,这很大程度上取决于你在这些方法中做什么。乍一看,性能应该没有什么不同