2

std::numericgnu 並列拡張を使用するために、 のアルゴリズムを使用して配列の絶対値の合計を計算したいと考えています(配列サイズは > 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、残りの間に単純な追加を行いますか?しかし、コピーとメモリヒットがあります...

4

2 に答える 2

1

関数を accumlate メソッドに渡し、関数内で「手動」評価を実行できます。ところで、コードでは abs メソッドを最初のパラメーターに適用しますが、これは必要ありません。

int fAccumulate (int accumulated, int accumulateIncrement) 
{
    int retValue = 0;
    if (accumulateIncrement >= 0)
    {
        retValue = accumulated + accumulateIncrement;
    }
    else
    {
        retValue = accumulated + std::abs(accumulateIncrement);
    }
    return retValue;
}

このコードは次のように使用できます。

int init = 0;
int numbers[] = {10,20,-30};
int a = std::accumulate (numbers, numbers+3, init, fAccumulate);
于 2013-08-05T04:24:50.797 に答える