我有一个concurrency::parallel_for
里面我称之为函数的函数,传递一个lambda,如
concurrency::parallel_for(0, particleCount, [&](int i)
{
...
kdTree->VisitCells([&](const KDTreeNode &node) //defining and passing
{
//code dealing with tree traversal
}
}
...问题是在parallel_for
内定义lambda是不好的做法,它是为很多粒子中的每一个运行的。这基本上会为每个粒子定义一个仿函数吗?
另一种方法是在parallel_for
之外编写lambda并设计它以获取更多参数(因为它不再能像以前那样进行相同的捕获)并将其传递给parallel_for
内的树。
在对此进行测试时,似乎在parallel_for
之外定义它的速度要快得多,但数据尚无定论,而且我不确定具有不同捕获数据的多个相同lambda是如何真正处理的。< / p>
答案 0 :(得分:0)
一般来说,这取决于两件事。
首先,除非定义“outside”parallel_for
本质上是一个类或结构,以某种方式捕获对parallel_for
中所有变量的引用,否则您将苹果与橙子进行比较。捕获规范[&]
基本上使lambda表示法成为创建这种结构的简写。如果你要使用不同的捕获规范,你实际上会改变正在创建的struct / class的性质(或者如果没有捕获任何内容就使它成为一个函数),从而改变了创建和使用它的开销。
其次,假设您实际上正在将苹果与苹果进行比较,那么任何差异都将归结为编译器的实现质量,程序如何分配内存等等。
使用高质量的编译器,我倾向于认为编译器在使用lambda捕获方面会比通过手动滚动等效数据结构做得更好(因此我怀疑你没有比较等)。
假设您正在使用一个体面的质量编译器(您还没有指定),我会打赌您看到“在parallel_for
之外定义它的模糊优势是因为您正在比较手卷使用lambda捕获多个变量的简单函数或结构定义(强制编译器打包更大的数据结构)。换句话说,您正在将苹果与橙色进行比较。
使用较低质量的编译器....好吧,它只是取决于。你可以用任何你喜欢的方式下注。