让我立刻澄清声音柔和的标题。这实际上是一段时间以来一直困扰着我的事情,尽管感觉像是一个非常基本的问题。
许多语言通过让开发人员使用比特来给出错误的效率印象,例如bool.h
C头,据我所知,它实际上只是一个带有包装器的int。从本质上讲,该字节似乎是C中绝对最低的原子计算单位 - bool x = 0
并不比int x = 0
更快/更高的内存效率。
我想知道的是,当我们想要实现一种与加载和操作单个位有固有关系的算法时,我们该怎么做,例如解码二进制代码,未加权的图形连接问题和许多其他问题?换句话说,字节的原子性是现代CPU的固有特性还是我们理论上可以通过使用机器代码与ASIC的效率相媲美?
编辑:非常惊讶于downvotes,但我想人们只是不明白我在问什么。我认为一个非常好的,规范的例子是遍历二叉树(或任何其他的是/否问题的顺序列表)。我想知道的是,如果现代cpu架构基本上没有能力做到这一点(与ASIC / FPGA相比),或者如果这是一些抽象层(语言/内核/等)的工件。马克的回答虽然不错(尽管我喜欢上述架构扩展的参考)答案 0 :(得分:4)
不,你无法与ASIC的效率相媲美。 ASIC意味着您可以像芯片上的预算一样复制并行比特流。您只需剪切并粘贴HDL,直到填满模具空间。 CPU只有有限数量的内核。
我猜你认为像z = (x|(1<<y)>>4
这样的位操作很慢而且是的,所有这些位移都是额外的开销。但那只是访问位。位操作(OR,AND等)都可以达到现代CPU的速度,即1个周期的吞吐量。
8051架构有一种直接访问单个位的方法,不使用字节寄存器,但如果你担心速度,你就不会考虑8051。
答案 1 :(得分:2)
按照惯例,字节是计算机中最小的可寻址内存块。字节所具有的位数可能因系统而异。
在x86的情况下,有指令将字节从存储器移动到寄存器并返回,以及操作寄存器中的值的指令。我无法与其他架构交谈,但它们很可能以类似的方式工作。
因此,每当你需要操作一些位时,你需要一次一个字节(或一个字,即多个字节)。
答案 2 :(得分:1)
我也不知道为什么这个问题得到如此多的支持,问题是:
换句话说,字节的原子性是现代CPU的固有属性还是我们理论上只能通过使用机器代码来与ASIC的效率相媲美?
对我来说似乎很合理。与stackoverflow上的许多问题相比,这当然不是一件坏事。
答案是:没有CPU能够与ASIC的效率相匹配。
但是,原因不是因为CPU正在操作字节而不是位。相反,它是因为CPU处理指令所做的大部分工作都涉及从内存加载,解码,跟踪依赖等,而不是对指令指示的位或字节执行实际的算术运算。要执行的CPU。
2014年LLVM开发者大会的following presentation中显示了对此的一个很好的解释。该演示文稿展示了OpenCL如何用于生成自定义FPGA硬件。幻灯片12到28显示了与CPU算法相关的开销以及自定义硬件如何消除大部分开销的漂亮图示示例。