【问题标题】:Can bit-level operations ever be "fast" in software?位级操作可以在软件中“快速”吗?
【发布时间】:2017-05-25 10:21:09
【问题描述】:

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

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

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

编辑:对反对票感到非常惊讶,但我想人们只是不明白我在问什么。我认为一个非常好的典型示例是遍历二叉树(或任何其他是/否问题的顺序列表)。我想知道的是,现代 cpu 架构是否根本无法做到这一点(即与 ASIC/FPGA 相比),或者这是否是某个抽象层(语言/内核/等)的产物。不过,Mark 的回答很好(尽管我很想参考提到的架构扩展)

【问题讨论】:

  • bool.h 和布尔值通常不是效率特性。您的问题是基于一种误解。
  • 一些具有位寻址存储器的架构。因此,此类架构的 C 编译器可能优化一些指令以使用这些细节。或者提供一些扩展命令给程序员这种能力。
  • 好在问题不在于 bool 类型的效率
  • 另外,ASIC 的力量并不在于操纵单个位。
  • 调用位域。

标签: c cpu-architecture


【解决方案1】:

按照惯例,字节是计算机中最小的可寻址内存。一个字节的位数可能因系统而异。

在 x86 的情况下,存在将字节从内存移动到寄存器并返回的指令,以及操作寄存器中值的指令。我无法与其他架构交流,但它们很可能以类似的方式工作。

因此,无论何时您需要操作一些位,您都需要一次操作一个字节(或字,即多个字节)。

【讨论】:

  • “根据定义,字节是计算机中最小的可寻址内存块。” --> 不同意。请参阅comment C 规定了最小“字节”大小,但这限制了 C 代码寻址,而不是计算机。进一步的代码可以使用位字段unsigned x:1; ... x = y;,编译器生成寻址1位的代码并设置它。
  • 我会将措辞改为“按惯例”而不是“按定义”。
【解决方案2】:

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

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

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

【讨论】:

  • 没有移位可能很好,但移位确实是字节级操作。我说的是加载和翻转单个位。
  • @BenjaminLindqvist 为什么加载和翻转单个位比算术运算慢?
  • 在绝对水平上并不慢,但肯定更慢每比特操作 :)
  • 如果这是您的问题,CPU 不是面向比特流的。在只访问字节的 CPU 上处理压缩比特流(如音乐、视频或图像,使用霍夫曼编码)是很痛苦的。某些 CPU 上有一些架构扩展,可以让你有一些比特流,但这些不能通过 C 语言访问。您需要编写程序集或伪程序集来获取它们。
  • 我曾经研究过一种架构(它不再存在),它具有位流操作指令:design-reuse.com/news/8418/… 但@WeatherVane 提出了位访问中最有趣的部分,事实证明,不是现在大多数处理器的速率限制步骤,但是文件 IO 甚至内存 IO 都比处理器慢得多。
【解决方案3】:

我也不知道为什么这个问题有这么多反对票,问题是:

换句话说,字节的原子性是现代 CPU 的固有属性,还是我们理论上可以仅通过使用机器代码来与 ASIC 的效率相媲美?

对我来说似乎是合理的。与 stackoverflow 上的许多问题相比,这当然还不错。

答案是:任何 CPU 都无法与 ASIC 的效率相媲美

然而,原因并不是因为 CPU 操作的是字节而不是位。相反,这是因为 CPU 处理指令所做的大部分工作都涉及从内存中加载指令、解码指令、跟踪依赖关系等,而不是对指令指示 CPU 执行的位或字节执行实际的算术运算.

2014 LLVM 开发者会议的following presentation 对此进行了很好的解释。该演示文稿展示了如何使用 OpenCL 生成自定义 FPGA 硬件。幻灯片 12 到 28 展示了与 CPU 算法相关的开销以及自定义硬件如何消除大部分此类开销的一个很好的图示示例。

【讨论】:

    猜你喜欢
    • 2015-12-01
    • 2022-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-01
    相关资源
    最近更新 更多