gpt4 book ai didi

c++ - 使用 C 样式指针但不使用迭代器对 vector 进行向量化循环

转载 作者:行者123 更新时间:2023-11-30 03:34:46 24 4
gpt4 key购买 nike

我写了一小段代码,用于累积 vector 的值,它比 std::accumulate 更快,因为它允许函数被向量化。该功能的主要前提是 vector 在累加后不再使用。代码如下:

template <typename floatType>
template <typename Iterator>
double Numeric_class<floatType>::AmDestructiveAccumulate(Iterator A, size_t length)
{
if (length == 1)
{
return A[0];
}

Iterator temp_;
while (length > 1)
{
if (length & 1) // odd
{
A[0] += A[length - 1]; // We add the last value which would otherwise be lost.
length >>= 1;
temp_ = A+length;
for (int i = 0; i < length; i++)
{
A[i] += temp_[i];
}
}
else // even
{
length >>= 1;
temp_ = A+length;
for (int i = 0; i < length; i++)
{
A[i] += temp_[i];
}
}
}
return A[0];
}

该函数基本上将 vector 分成两半,并取两半的成对总和。在此之后,它将求和的前半部分分成两个同样长的范围,然后再次成对求和,依此类推。

我在 std::vector<double> data 中使用了这个函数.如果我用 A 作为 data.data() 调用它。矢量化的故事如预期的那样发生,我的执行速度也得到了显着提高。如果我使用 data.begin(),则不会进行矢量化。我使用完全优化的 VC2015 编译了代码。是否有理由说明为什么对代码的迭代器版本进行矢量化是非法的,或者 VC 只是不这样做,尽管它是合法的。

最佳答案

核心问题将是 A[i] += temp_[i];。请注意,Atemp 互为别名,但是您在运行时选择的 [i] 意味着这只是理论上的。现在,[i] 到底是什么意思?如果 A 是一个指针,那只是 *(A+i) 的简写,但是当 A 是一个迭代器时,它就是一个函数调用。

高效的矢量化要求编译器发现对 A[i] 的写入不会影响后续从 temp[i] 的读取,这是一个重要的观察.没有循环携带的依赖性,但优化器必须能够证明这一点。

关于c++ - 使用 C 样式指针但不使用迭代器对 vector 进行向量化循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41803583/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com