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