我的并行算法的图形数据结构具有以下迭代器方法:
/**
* Iterate in parallel over all nodes of the graph and call handler (lambda closure).
*/
void Graph::parallelForNodes(std::function<void(node)> handle) {
#pragma omp parallel for
for (node v = 0; v < z; ++v) {
// call here
handle(v);
}
}
我本可以将handle
函数声明为模板参数,但我认为C ++ 11中的首选方法是使用std::function
。
现在我想使用OpenMP和这样的迭代器执行并行缩减。每次调用handle
的返回值都减少为一个总和。使用功能模板,如下所示:
template<typename L>
inline double Graph::parallelSumForNodes(L handle) {
double sum = 0.0;
#pragma omp parallel for reduction(+:sum)
for (node v = 0; v < z; ++v) {
// call here
if (exists[v]) {
sum += handle(v);
}
}
return sum;
}
使用std::function
的等价物是什么?我可以定义handle
的类型以返回double或int(因为函数的主体适用于两者)。
答案 0 :(得分:2)
也许是一个双参数成员函数,沿着std::accumulate
?
template<typename Handle, typename Accumulator>
Accumulator Graph::parallelSumForNodes(Handle handle, Accumulator sum)
{
#pragma omp parallel for reduction(+:sum)
for (node v = 0; v < z; ++v) {
// call here
if (exists[v]) {
sum += handle(v);
}
}
return sum;
}
请注意,这与std::accumulate
具有相同的警告:您必须小心传递它的累加器的类型。
答案 1 :(得分:1)
以下内容允许您传递一个返回int或double(或其他数字类型)的handle
到您的函数。该函数将返回句柄返回的任何类型。但是你应该注意溢出。
template<typename L>
inline L Graph::parallelSumForNodes(std::function<L(node)> handle) {
L sum = 0;
#pragma omp parallel for reduction(+:sum)
for (node v = 0; v < z; ++v) {
// call here
if (exists[v]) {
sum += handle(v);
}
}
return sum;
}
答案 2 :(得分:0)
指定模板参数以定义std :: function的返回类型:
template<typename L>
inline L Graph::parallelSumForNodes(std::function<L(node)> handle)
{
L sum();
...
return( sum );
{