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

を使用して同等のものは何std::functionですか? double または int を返す型を定義できますhandleか (関数の本体は両方で機能するため)。

4

3 に答える 3

2

std::accumulateおそらく、 ?の行に沿った 2 つのパラメーターのメンバー関数です。

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 に答える