並列アルゴリズムのグラフ データ構造には、次の反復子メソッドがあります。
/**
* 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
か (関数の本体は両方で機能するため)。