从 VS 的 dumpbin 目录谈 x86、xi386、x86-64、amd64...

 翻开 VSdumpbin.execl.exe 的存放目录,你会惊奇的发现,居然存在这么多个分支!


  什么 amd64amd64_armamd64_x86armx86_amd64x86_arm???

故事的起源

Refer: cl.exe and directories under bin, host, targets?
 In general, the format of the directory name is “host_target” so “amd64_arm” means that the compiler itself runs on x64 and it targets arm. “amd64” doesn’t follow the format but it should be obvious, it runs on and targets x64 bit. The compiler in the bin directory is a x86 only compiler.

 原来,上面说来说去也就是这三个平台而已啦,amd64arm 还有 x86amd64* 目录指代运行在 amd64 (也就是64位机器) 上的构建系统,可用于生成 amd64arm 还有 x86 平台目标代码;x86* 目录类似,至于 arm 目录,该平台的构建系统用于生成 amd64 还有 x86 平台目标代码,而整个 …/VC/bin 目录下,则是 x86_x86 的构建系统。

了解一些基本概念

Refer: x86/x86_64的一些基本概念
 现在的 x86 CPU 在位数上有32/64 bit之分,在 ARCH(体系架构) 上又有 x86/x86_64/x64/i386/IA32/IA64/amd64,最近又新出来一个 x32,还好不是 ARCH,只是 ABI(应用程序二进制接口),没有那么混乱。
 
 先说一下x86的这些arch,不要求很严格的话,基本上可以用下面的公式来表达:
  x86 = i386 = IA32
  amd64 = x86_64 = x64 != IA64
 其实这两个等式里很多都是别名,严格说的话,x86 的世界里只存在 x86/x86_64/IA64 三种架构。
 当年 AMD 先于 Intel 推出向下兼容的 amd64 CPU,而 Intel 推出的不兼容32位系统的 IA64 惨淡收场(被MS放了鸽子),后来 Intel 在指令上支持了 amd64,不过不愿意叫 amd64,改了个名字 x86_64
 
 再说 64bit/32bit 的兼容性问题:
  现在的 64bit CPU实际上都做了兼容 32bit 的特殊设计,所以 64bit 的CPU上运行 32bit 的软件(包括kernel/app,driver除外)是没有问题。反过来,32bit 的 CPU 上运行 64bit 的软件是不可以的。
 
 最后说重点,64bit相比32bit的性能优势:
  这里不考虑 64bit 硬件上运行 32bit 软件的这种过度方式。
  从架构上来说,64bit 拥有 64bit 的 register 和 64bit 的 bus,在数据传输效率上比 32bit 要高不少;另外,64bit 地址总线的寻址空间突破了 4G 的限制。
  所以,对于大内存,密集数据运算的应用场景,64bit 的优势是非常明显的。网上有一些 benchmark,这里不贴了。
  但是,对于小内存系统,64bit 的 CPU 在某些状况下可能比 32bit CPU的效率更低。
  因为 64bit 的 CPU 的地址是 64 位的,指针是 64 位的,编译生成的二进制文件更大,运行时占用的内存更多;另一方面,因为 64 位地址的问题,cache 中能存放的指令就更少,所以更容易导致 cache 的 miss。
  所以在某些应用场景,64bit CPU 的更大的寻址空间,更快的数据传递,更快的浮点运算的特性,与其 64bit 的地址/指针所导致的cache miss的特性,始终并存。
 
 为了充分利用64的优势,又避免 64bit 地址导致的 cache miss 的问题,Intel 提出了 x32 ABI 的概念。
  x32 不是一个 ARCH,是一个 ABI。
  x32 可以充分的使用 64bit 硬件的 64bit 寄存器,64bit 总线,以及 64bit 新增的指令,从而获得更快的数据处理速度。
  同时 x32 又使用 32bit 的地址/pointer,32bit 的 C 数据类型,因此 cache miss 并不会增加。
  x32 是一个 ABI,其设计到的部分包括:kernel 的 support,toolchain 的 support,system lib 的 support。现在 kernel(from 3.4) 和 toolchain 的 support 都已经OK。

问题深入

Refer: x86, i386, x86-64, x64, and amd64? Oh My!
 x86 instruction sets are found on 32-bit processors, x86-64 instruction sets are found on 64-bit processors. Therefore, to find your instruction set, you must figure out if you have a 32-bit or a 64-bit processor.
 
 It is common to find x86 called i386, or occasionally IA-32. x86-64 is commonly called x64 or amd64, and less often IA-32e, EM64T, or Intel64.
 Typically, knowing x86, i386, x86-64, x64, and amd64 is enough for downloading Linux.
 
 x86-64 = 64-bit = x64 = amd64
 x86 = 32-bit = i386
 If your processor supports it, use x86-64.

回到问题开始

Refer: When compiling x64 code, what’s the difference between “x86_amd64” and “amd64”?
 x64 on x86 (x64 cross-compiler)
  Allows you to create output files for x64. This version of cl.exe runs as a 32-bit process, native on an x86 machine and under WOW64 on a 64-bit Widows operating system.
 x64 on x64
  Allows you to create output files for x64. This version of cl.exe runs as a native process on an x64 machine.
 
  It has nothing to do with efficiency. The native and cross-compiler will both generate the same machine code. You will however gain some benefits by running a native 64-bit compiler process on a 64-bit workstation (larger registers, larger memory space, etc…)
 The native compiler will only run on an 64-bit copy of Windows, so if your workstation is 32-bit this compiler won’t even run.
 The cross-compiler is meant to run on x86 machines even though it will run on a 64-bit copy of Windows via WoW; however, there is no reason to do this.
 
 If you use x86_amd64, then you are typically developing on an x86 machine and you want to create x64 files that run natively on x64. You could also use this option on an x64 machine but your compiler will be running under WOW64 emulation.
 If you use AMD64, then you are developing on an x64 machine and you want to create x64 files that run natively on x64. The compiler is running natively in x64. This option is more efficient to build x64 programs.

  所以,假如你是 64 位系统(现在基本上是啦),那么在配置 dumpbin 或者 cl 环境变量时,最好选择 hostamd64 的路径,即 amd64*

文章目录
  1. 1. 故事的起源
  2. 2. 了解一些基本概念
  3. 3. 问题深入
  4. 4. 回到问题开始