【问题标题】:Why the time taken by my program in MS Visual Studio 2013 in RELEASE mode in 64-bit mode is one-third of the time taken in 32-bit mode为什么我的程序在 MS Visual Studio 2013 中的 RELEASE 模式下在 64 位模式下花费的时间是 32 位模式下花费的时间的三分之一
【发布时间】:2017-12-29 22:35:00
【问题描述】:

我在 Visual Studio 2013 中以 RELEASE 模式运行 HM-16.15 编码器。HM-16.15 编码器是一个非常大的 C++ 程序(200k 行代码)。我有两个时间(T1 和 T2)。程序 T = T1 + T2 花费的总时间。

当我分别在 64 位模式和 32 位模式下构建和调试程序时。 64位模式与32位相比所用时间如下

  • T1(64bit) = T1(32bit) x 0.34 接近
  • T2(64bit) = T2(32bit) x 0.78 接近

据我所知,T1(64bit) 应该大于或等于 T1(32bit) x 0.5。但是 T1 是怎么发生的呢?

【问题讨论】:

  • HM-16.15 编码器是 HEVC(高效视频编码)的代码,它将原始视频文件编码为 yuv 格式
  • 为什么你认为这总是正确的:“T1(64bit) 应该大于或等于 T1(32bit) x 0.5”?
  • 64 位目标通常更适应各种事情,例如 64 位算术和访问大量内存,但区别是 比简单的常数因子,可以很容易地朝相反的方向发展。我不知道这个库,但解释可能很简单,因为代码已经针对 64 位目标进行了优化,在 32 位构建中使用的很少关心甚至未优化的后备函数。相反,64 位软件,尤其是指针繁重的代码,通常会使用更多的内存,并且可能很容易最终耗尽缓存。

标签: c++ visual-studio visual-studio-2013 hevc h.265


【解决方案1】:

x86_64(64 位)平台的宽度是 x86(32 位)的两倍多。

除了更宽的寄存器(64 位而不是 32 位),x86_64 有:

  • 另外 8 个通用寄存器(r8、r9、r10、r11、r12、r13、r14、r15)
  • 另外 8 个流 (SSE) 寄存器
  • 矢量扩展 (AVX)
  • 更多说明,例如指令指针相对数据访问
  • x86_64 calling convention 使用更多寄存器进行参数传递,并且比 32 位 cdecl 甚至 fastcall (Windows ABI) 更快
  • x86_64 CPU 上的某些算法在 64 位模式下可能比 32 位模式下更快(例如,IMUL r64 是 3c 而 IMUL r32 是 4c)

因此看到 T1(64bit)

【讨论】:

  • XMM 是 SSE 寄存器的名称,所以它们是一样的。 x86_64 真的有更多的 SSE 指令吗?我不确定这个。
  • @geza 对于 x86(_64) 64 位版本往往有更多的 sse 指令,因为这些通常是具有更多功能的较新 CPU。
  • @KamilKoczurek:是的,当然。但我们谈论的是同一个处理器。是不是同一个处理器,64位模式下的SSE指令比32位模式下的多?
  • 好的,避免进一步讨论删除有关更多 SSE 指令(但还有更多寄存器)的注释
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-11
  • 2012-07-02
  • 1970-01-01
  • 2010-11-21
  • 1970-01-01
相关资源
最近更新 更多