gpt4 book ai didi

c++ - 如何编写无分支 std::vector 扫描?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:00:27 25 4
gpt4 key购买 nike

我想写一个简单的数组扫描。我有一个 std::vector<int> data我想找到元素小于 9 的所有数组索引,并将它们添加到结果 vector 中。我可以使用分支来写这个:

for (int i = 0; i < data.size(); ++i)
if (data[i] < 9)
r.push_back(i);

这给出了正确答案,但我想将它与无分支版本进行比较。

使用原始数组 - 并假设 data是一个整数数组,length是其中元素的数量,r是一个有足够空间的结果数组——我可以这样写:

int current_write_point = 0;
for (int i = 0; i < length; ++i){
r[current_write_point] = i;
current_write_point += (data[i] < 9);
}

如何使用 data 的 vector 获得类​​似的行为? ?

最佳答案

让我们看看实际的compiler output :

auto scan_branch(const std::vector<int>& v)
{
std::vector<int> res;
int insert_index = 0;
for(int i = 0; i < v.size(); ++i)
{
if (v[i] < 9)
{
res.push_back(i);
}
}
return res;
}

这段代码显然在 disassembly 的第 26 行有一个分支.如果它大于或等于 9,它只会继续下一个元素,但是如果小于 9,则会为 push_back 执行一些可怕的代码,然后我们继续。没有意外。

auto scan_nobranch(const std::vector<int>& v)
{
std::vector<int> res;
res.resize(v.size());

int insert_index = 0;
for(int i = 0; i < v.size(); ++i)
{
res[insert_index] = i;
insert_index += v[i] < 9;
}

res.resize(insert_index);
return res;
}

然而,这一步只有条件着法,您可以在 disassembly 的第 190 行看到这一点。 .看来我们赢了。由于条件移动不会导致流水线停顿,因此此分支中没有分支(for 条件检查除外)。

关于c++ - 如何编写无分支 std::vector 扫描?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38798841/

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