假设你有一个并行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]);
}
第二种变体是显而易见的方法,但是当谈到并行处理时,可能会有其他考虑因素?
我只是将case选项1比使用parallel_for的第二个(平均约30ms到约38ms)更快。但是我对并行算法的基准测试并不擅长,所以也许我测得错了。无论如何,遗憾的是我无法发布此观察的实际代码示例。
是否有一些经验法则,其他注意事项或仅尝试和基准测试?
答案 0 :(得分:0)
这完全取决于您在DoSomething
和DoSomethingElse
假设DoSomething
需要内存中的内容,所以当你在循环中运行它时,对象将在缓存中,但是当你从DoSomethin
切换到DoSomethingElse
时,也需要内存中的东西,缓存中的对象发生变化,需要从内存中带来它。
再次 - 不确定这种情况在很大程度上取决于你在这些方法中做了什么。 从一见钟情 - 性能应该没有任何不同