【发布时间】:2020-06-03 07:20:01
【问题描述】:
在大型位数组上进行按位与运算的更快算法是什么?我已经使用 char 数组在 C++ 中实现了位数组。现在,我正在遍历每个字节并执行 AND 操作。
void ANDoperation(char* A, char* B){
for (int i=0; i<(array_size/8 +1); i++ ){
A[i] &= B[i];
}
}
对于 K 个数组,我正在迭代执行此函数 K-1 次。
【问题讨论】:
-
您对“速度”和“效率”的要求是什么?这是否被认为是您程序的主要(前两个)瓶颈?您是否在启用编译器优化的情况下完成了测量和基准测试?
-
如果您知道您的数组已正确对齐,并且它们的长度超过 2 或 4 个字节,您可以在
uint16_t、uint32_t或uint64_t的块中执行 AND(在更复杂的代码的成本)。 -
@Someprogrammerdude 是的。我尝试过 O2 优化。这是瓶颈。在我的情况下,位数组大小是 > 10^6。
-
O2可能不会开启矢量化。试试O3,并考虑让你的指针restricted。如果没有restrict,可能会避免矢量化。正确对齐数组以进行矢量化可能也是一个好主意(例如,在 AVX-512 的 64 位边界处)。这个问题可能是相关的:How to tell GCC that a pointer argument is always double-word-aligned?你如何衡量它是一个瓶颈? 10^6 是一个非常小的数组。 -
在此处比较这些版本:godbolt.org/z/hedNBo。您可以观察到,在第二种情况下,循环中的指令数量最少(1x 向量寄存器加载、1x 和 1x 存储)。
标签: c++ arrays char bitarray bitwise-and