【问题标题】:Which integer data type uses x64 CPU core most efficiently?哪种整数数据类型最有效地使用 x64 CPU 内核?
【发布时间】:2011-06-06 20:10:05
【问题描述】:

在 x64 机器中将两个 32 位整数和两个 64 位整数相加需要相同的指令时间,不是吗?如果是这样,当我在 x64 CPU 内核中使用 32 位整数时,其他 32 位没有任何好处,不是吗?我想在适合 64 位内核的最大可能数值范围内进行计算。 哪种数据类型最符合此标准?

我的候选人是:

  • int
  • 长整数
  • int64_t
  • ...(如果您有另一个,请添加)

【问题讨论】:

  • 你检查过你平台上的 sizeof(int)。
  • 最符合你的算法的那个。

标签: c++ 64-bit 32bit-64bit x86-64


【解决方案1】:

如果不进行某种测量,您真的无法判断 32 位或 64 位计算的性能是否相同。虽然理论上,您可以使用 64 位而不是 32 位通过 ALU 驱动两倍的位,但您的应用程序的内存需求将会增加。算术运算通常在 CPU 上占用一个周期。访问 CPU 缓存之外的内存可能需要一百个周期,在使用 64 位数量时可能会导致速度大幅下降。

【讨论】:

  • 在 x86_64 CPU(AMD64、EM64T)和现代 x86 CPU 上,可以以大于 1/cycle 的吞吐量执行简单的算术运算。但是延迟可能远远超过一个周期。但你说得对。
【解决方案2】:

m128i

N 32 位添加所用的时间与 N 64 位添加一样长,但前提是您不使用 SIMD 单元。

【讨论】:

【解决方案3】:

int

根据定义,它是正在编译的处理器上最有效的类型。这就是 int 在每个处理器上改变大小的原因。
"plain int 具有执行环境架构所建议的自然大小

注意:任何代码都高度依赖于正在运行的操作系统。如果操作系统是用特定大小的 int 编译的,那么为了保持兼容性,为操作系统构建的任何代码都必须保持不变。因此,如果操作系统制造商保持 32 位 int 兼容性,则 int 的大小将保持为默认值 32(即使 64 是相同的速度)。

希望随着时间的推移,操作系统制造商会更新提供真正的 64 位。

【讨论】:

  • 这是过去时代的教条。现在int 保持为 32 位,即使 64 位类型也一样快,因此仍然存在 32 位基本整数类型。
  • 这不一定是真的 - int 是 32 位的,与 AMD64 上的 MS 编译器保持与 32 位源的强兼容性,而不是 64 位的效率。
  • @Zack:有趣的是,我没有从标准机构或编译器制造商那里听说过,但值得研究。但是如果你真的想要 32 bin int 你可以使用int32_tcppreference.com/wiki/utility/types/integer
  • 这被称为 LLP64 模型,Windows 至少采用这种模型的一些背景信息在这里:blogs.msdn.com/b/oldnewthing/archive/2005/01/31/363790.aspx
  • 标准规定“普通整数具有执行环境架构所建议的自然大小”。它没有说“效率”,只说“自然”,不管是什么意思。在实践中,我想没有多少人认为 ILP64 “自然”。
猜你喜欢
  • 1970-01-01
  • 2020-09-11
  • 2019-05-27
  • 1970-01-01
  • 2021-12-12
  • 2012-03-03
  • 2011-12-17
  • 2010-10-10
  • 1970-01-01
相关资源
最近更新 更多