在 parallel_for 中使用函数对象

Posted

技术标签:

【中文标题】在 parallel_for 中使用函数对象【英文标题】:Using function objects in parallel_for 【发布时间】:2010-12-13 17:37:25 【问题描述】:

我刚刚学会了如何并行使用函数。以下代码行计算索引的平方值并将其放入该索引处的数组(称为平方)中。 parallel_for 函数在 Visual Studio 2010 中可用,作为标头下的并发命名空间的一部分。

parallel_for(static_cast<size_t>(0), count, 
    [&squares](size_t n)  squares[n] = (n+1)*(n+1); );

您可以看到它使用 lambda 表达式来并行计算平方,并且此代码确实可以正常工作并正确编译。但是,lambda 表达式使 parallel_for 函数与代码杂乱无章。我正在考虑只在函数对象中定义 lambda 表达式,例如:

function<void(size_t)> Squares = 
    [&squares](size_t n)  squares[n] = (n+1)*(n+1); ;

我的问题是如何在 parallel_for 函数中使用这个函数(Squares)?我是否错误地编写了 Squares 函数,或者这只是使用 lambda 表达式的 parallel_for 的范例?您可以继续向我推荐除 Microsoft 之外的其他一些并行库,但我仍然想知道我的问题的答案。

【问题讨论】:

@Steve 我只是简单地将 Squares() 函数放在了 lambda 表达式应该在的位置,VS10 会发现错误并且不会编译。 【参考方案1】:

任何 lambda 表达式都可以被认为是相应函数对象的匿名版本。

在您的示例中,您的仿函数工作正常,如下所示:

parallel_for(static_cast<size_t>(0), count, Squares);

来自MSDN docs:

lambda 表达式是一种编程 与匿名相关的技术 职能。匿名函数是 有主体但没有主体的函数 有一个名字。一个 lambda 表达式 隐式定义一个函数对象 类并构造一个函数对象 该类类型。

【讨论】:

【参考方案2】:

MSFT 的例子都直接使用了 Lambda。

【讨论】:

以上是关于在 parallel_for 中使用函数对象的主要内容,如果未能解决你的问题,请参考以下文章

填充二维向量的parallel_for lambda函数后出错

将 TBB 与 SSE2 内在函数混合

tbb::concurrent_hash_map 抛出 SIGSEGV

并发中的 Pybind11 并行处理问题::parallel_for

如何在 SYCL parallel_for(内核)中打印?

在 Python 中使用自定义距离函数对任意对象进行聚类