我想使用算法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
在其余部分之间做一个简单的加法?但是会有副本和内存命中...