std::numeric
gnu 並列拡張を使用するために、 のアルゴリズムを使用して配列の絶対値の合計を計算したいと考えています(配列サイズは > 500000 です)。
ここに私の現在のコードがあります:
double ret = 0;
for (auto i = 0U; i < length; ++i)
{
ret += std::abs(tab[i]);
}
return ret;
だから私はやろうと思った:
auto sumabs = [] (double a, double b)
{
return std::abs(a) + std::abs(b);
}
std::accumulate(tab, tab + length, 0, sumabs);
しかし、リダクション アルゴリズムが実行されると (計算が高速になることを心から願っています!)、std::abs
既に >= 0 である値に適用されるため、非効率的です。
これを行う方法はありますか?おそらく「手で」削減の最初のステップを実行しstd::accumulate
、残りの間に単純な追加を行いますか?しかし、コピーとメモリヒットがあります...