在c ++

时间:2015-10-10 21:58:21

标签: c++ multithreading lambda

我有一个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>

1 个答案:

答案 0 :(得分:0)

一般来说,这取决于两件事。

首先,除非定义“outside”parallel_for本质上是一个类或结构,以某种方式捕获对parallel_for中所有变量的引用,否则您将苹果与橙子进行比较。捕获规范[&]基本上使lambda表示法成为创建这种结构的简写。如果你要使用不同的捕获规范,你实际上会改变正在创建的struct / class的性质(或者如果没有捕获任何内容就使它成为一个函数),从而改变了创建和使用它的开销。

其次,假设您实际上正在将苹果与苹果进行比较,那么任何差异都将归结为编译器的实现质量,程序如何分配内存等等。

使用高质量的编译器,我倾向于认为编译器在使用lambda捕获方面会比通过手动滚动等效数据结构做得更好(因此我怀疑你没有比较等)。

假设您正在使用一个体面的质量编译器(您还没有指定),我会打赌您看到“在parallel_for之外定义它的模糊优势是因为您正在比较手卷使用lambda捕获多个变量的简单函数或结构定义(强制编译器打包更大的数据结构)。换句话说,您正在将苹果与橙色进行比较。

使用较低质量的编译器....好吧,它只是取决于。你可以用任何你喜欢的方式下注。