|
|
1
4
这样就可以了
更新
:上面的代码和OP的代码生成
相同的汇编代码
由GCC编译时
|
|
|
2
3
你的代码不能正常工作。例如,考虑一个包含如下内容的缓冲区:
根据您的代码,它的长度是15,但实际上它的长度是0,因为它的首字母是“\0”。
|
|
|
3
2
我在《黑客之乐》中读到一个叫做SWAR(SIMD-within-a-register)的小技巧,假设每个字符8位:
其中first_bit_set是在整数中查找第一个位集的任意数量的流行且快速的实现。
|
|
|
4
1
位运算。。。可能是这样的:
|
|
|
5
1
|
|
|
6
1
你可以从
它是如何工作的? (T) -1/255位模式0x01010101是否根据需要重复
|
|
|
7
1
你可以随心所欲地玩,但你可能无法战胜这一点:
(这是否更快取决于处理器和编译器)。
我在core2duot7200@2.0ghz、windowsxppro和visualstudio2008上分析了这两个函数,并关闭了优化(打开优化器会导致VS注意到在我的计时循环中没有输出,所以它会完全删除它)。 我在循环2中调用了每个函数 22 次,然后取平均值超过8次。 快速1 每次函数调用大约需要87.20 ns。 快速2 所以在我的CPU上,数组索引版本的速度几乎是指针版本的两倍。
更新2 这个函数也相当快,每次调用大约60纳秒。我猜指针解引用是由地址单元和整数单元的乘法执行的,所以操作是流水线的。在我的其他例子中,所有的工作都是由地址单元完成的。
|
|
|
8
1
我很确定你发布的代码看起来很流畅,但在为许多处理器编译时实际上并不是那么好,尽管它可能在你的处理器上。据我所知,大多数处理器实际上并没有一种简单的方法从比较中得到1,因此很可能最终是一个条件跳转或以下形式的条件操作:
如果编译器做得很出色,在许多处理器上,这最终会是这样的:
既然你说你的目标是一个GPU和那些往往是非常数学友好,你也许可以做到:
如果你能在不花费太多成本的情况下将陷阱除以零,并且处理陷阱带来的混乱。不过,那最终可能会很贵。 如果您的机器的寄存器可能包含字符串的一个以上八位字节,那么您可以尝试执行有限次数的跳转,一次测试0个以上的字节,然后在字节级别检查最后一个非零字。 你应该退房 Bit Twiddling Hacks 一个很酷的方法来加速strlen,它适用于大寄存器大小。
|
|
|
9
0
在假设的C++语言中,假设2的补码和小endian,
(修改自 http://graphics.stanford.edu/~seander/bithacks.html#IntegerLog |
|
|
10
0
假设64位长和小端系统:
|
|
|
feasega · 聚合物模拟-2个节点之间的最短路线,适用于所有节点 1 年前 |
|
|
Alisa Petrova · 在有向图中更改一对顶点以创建循环 1 年前 |
|
|
b39b332d · 使用C++标准库实现高效间隔存储 1 年前 |
|
ABGR · 二叉树的直径——当最长路径不通过根时的失败案例 1 年前 |
|
|
EpicAshman · 数独棋盘程序中同一列和同一行出现两次的数字 1 年前 |