0

我的并行算法图数据结构具有以下迭代器方法:

/**
 * 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;
}

using 的等价物是什么std::function?我可以定义handle返回 double 或 int 的类型吗(因为函数体同时适用于两者)。

4

3 回答 3

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: 你必须小心你传递的累加器的类型。

于 2013-08-08T14:33:13.963 回答
1

以下将允许您将handle返回 int 或 double(或其他数字类型)的 a 传递给您的函数。该函数将返回您的句柄返回的任何类型。但是,您应该注意溢出。

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;
}
于 2013-08-08T14:21:54.833 回答
0

指定模板参数以定义 std::function 的返回类型:

template<typename L>
inline L Graph::parallelSumForNodes(std::function<L(node)> handle)
{
    L sum();
    ...
    return( sum );
{
于 2013-08-08T14:28:00.493 回答