【发布时间】:2011-10-24 01:10:11
【问题描述】:
在现代 Intel CPU(核心 i7、沙桥)上进行 128 位移位的最有效方法是什么。
类似的代码在我最内层的循环中:
u128 a[N];
void xor() {
for (int i = 0; i < N; ++i) {
a[i] = a[i] ^ (a[i] >> 1) ^ (a[i] >> 2);
}
}
a[N] 中的数据几乎是随机的。
【问题讨论】:
-
您可以先开启最大优化并查看编译器生成的内容。
-
你能告诉我们
u128的定义吗?我可能可以使用 SSE 提供有效的解决方案。 -
Shift 内部函数在此处列出:msdn.microsoft.com/en-us/library/edy397f8.aspx
-
@Hans:他们都不会移动 128 位整数
-
通常“移位”(如问题中的 c 运算符“>>”)表示移位,这就是所要求的。此外,英特尔的字节移位仅限于一个常数。如果您想按可变数量进行字节移位,则最好避免使用此指令,并执行未对齐的存储/加载,因为 i7 和更新版本的未对齐惩罚可以忽略不计。
标签: performance assembly x86 128-bit