软件中的位级操作可以是 "fast"吗?

标签 c cpu-architecture

让我立即澄清一下这个听起来很温和的标题。这实际上已经困扰我很长一段时间了,尽管感觉这是一个非常基本的问题。

许多语言让开发人员玩弄位,从而给人一种效率错误的印象,例如 bool.h据我了解,C header 本质上只是一个带有包装器的 int 。本质上,字节似乎是 C 语言中绝对最低的计算原子单位 - bool x = 0并不比 int x = 0 更快/更高的内存效率.

我想知道的是,当我们想要实现一种本质上与加载和操作单个位相关的算法时,我们该怎么做,例如解码二进制代码、未加权的图连接问题等等?换句话说,字节的原子性是现代 CPU 的固有属性,还是我们可以通过使用机器代码在理论上与 ASIC 的效率相媲美?

编辑:对否决票感到非常惊讶,但我想人们只是不明白我在问什么。我认为一个非常好的、规范的例子是遍历二叉树(或者任何其他是/否问题的顺序列表)。我想知道的是,现代 cpu 架构是否从根本上没有能力做到这一点(即与 ASIC/FPGA 相比),或者这是否是某些抽象层(语言/内核/等)的产物。马克的回答很好(尽管我希望引用所提到的架构扩展)

最佳答案

不,您无法与 ASIC 的效率相媲美。 ASIC 意味着您可以根据芯片上的预算复制并行比特流。您只需剪切并粘贴 HDL,直到填满芯片空间。 CPU 的核心数量有限。

我猜你认为像 z = (x|(1<<y)>>4 这样的位运算速度很慢,是的,所有的位移都是额外的开销。但这只是访问位。位运算(OR、AND 等)的速度与现代 CPU 上的速度一样快,即 1 个周期的吞吐量。

8051 架构有一种直接访问各个位的方法,无需使用字节寄存器,但如果您担心速度,则不会考虑 8051。

关于软件中的位级操作可以是 "fast"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41577110/

相关文章:

c - 错误: expected identifier or '(' before 'volatile'

c - MIPS memcpy 问题(我认为)

c - 删除链接排序列表中的第一个元素

c - SIGSEGV,(貌似)由 printf 引起

c++ - int32_t 的延迟是否低于 int8_t、int16_t 和 int64_t?

memory - 字节序取决于处理器还是内存?

c - 插入和改变 %esp 帧指针

performance - "fast"到底是怎样的现代CPU?

performance - Cortex M4 LDR/STR 时序

cpu-architecture - Zilog z80 I、R 寄存器用途