【发布时间】:2019-06-18 19:50:47
【问题描述】:
我有三个大的任意稀疏布尔向量,它们的大小都相同——比如:pool1、pool2、intersection_of_other_pools。我有兴趣执行按位运算符。如果我能做到,那就太好了:intersection_of_other_pools |= pool1 | pool2,但这似乎不是一个选择——据我所知。
由于所有这些向量的大小都非常大,而 pool1 和 pool2 非常稀疏,我会对在这些向量上执行按位运算的方法感兴趣没有循环。我知道std::vector<bool> 的底层实现只是一个位数组,这让我相信无需循环就可以做到这一点。
我对以速度为名的奇怪的按位hacky解决方案持开放态度。
当然,如果执行此操作的最快方法(或唯一方法)只是循环,那么我也很乐意接受它作为答案。
我已经检查了valarray 作为矢量的潜在替代品,但我无法判断它是循环还是正在执行一些神奇的按位运算。但理想情况下,我不想更改现有的代码库。
【问题讨论】:
-
我认为无论如何你都无法在没有某种循环的情况下进行操作。
-
假设向量中有超过 512 位,最新的 MMX 仅支持 256 位操作。在您看来,编译器将如何实现该操作?
-
迭代 256 位块是否比迭代每个单独的项目更快?如果是这样,我想我会遍历这些块并对这些块执行按位操作。
-
循环有什么问题?这不是 Python。没有神奇的非循环操作可以同时应用于千兆字节的内存。请注意:在后台,
std::vector<bool>是一个 bytes 数组。计算机没有单独的位。您实际上要解决什么问题,因为没有理由害怕循环。