x86/x86_64的一些基本概念

本人在构建boost的时候,从"Start Menu" -> "Programs" -> "Visual Studio 2015" -> "Visual Studio Tools" -> "Windows Desktop Command Prompts":
    VS2015 x64 ARM Cross Tools Command Prompt.lnk
    VS2015 x64 Native Tools Command Prompt.lnk
    VS2015 x64 x86 Cross Tools Command Prompt.lnk
    VS2015 x86 ARM Cross Tools Command Prompt.lnk
    VS2015 x86 Native Tools Command Prompt.lnk
    VS2015 x86 x64 Cross Tools Command Prompt.lnk

开始郁闷于
    VS2015 x64 Native Tools Command Prompt.lnk
    VS2015 x64 x86 Cross Tools Command Prompt.lnk

此二者的区别。

区别在这里
    %comspec% /k ""C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat"" amd64
    %comspec% /k ""C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat"" amd64_x86

而vcvarsall.bat内容以下
shell

    @echo off
    if "%1" == "" goto x86
    if "%2" == "" goto check_platform
    if not "%2" == "store" goto usage
    :check_platform
    if /i %1 == x86       goto x86
    if /i %1 == amd64     goto amd64
    if /i %1 == x64       goto amd64
    if /i %1 == arm       goto arm
    if /i %1 == x86_arm   goto x86_arm
    if /i %1 == x86_amd64 goto x86_amd64
    if /i %1 == amd64_x86 goto amd64_x86
    if /i %1 == amd64_arm goto amd64_arm
    goto usage
    :x86
    if not exist "%~dp0bin\vcvars32.bat" goto missing
    call "%~dp0bin\vcvars32.bat" %2
    goto :SetVisualStudioVersion
    :amd64
    if not exist "%~dp0bin\amd64\vcvars64.bat" goto missing
    call "%~dp0bin\amd64\vcvars64.bat" %2
    goto :SetVisualStudioVersion
    :arm
    if not exist "%~dp0bin\arm\vcvarsarm.bat" goto missing
    call "%~dp0bin\arm\vcvarsarm.bat" %2
    goto :SetVisualStudioVersion
    :x86_amd64
    if not exist "%~dp0bin\x86_amd64\vcvarsx86_amd64.bat" goto missing
    call "%~dp0bin\x86_amd64\vcvarsx86_amd64.bat" %2
    goto :SetVisualStudioVersion
    :x86_arm
    if not exist "%~dp0bin\x86_arm\vcvarsx86_arm.bat" goto missing
    call "%~dp0bin\x86_arm\vcvarsx86_arm.bat" %2
    goto :SetVisualStudioVersion
    :amd64_x86
    if not exist "%~dp0bin\amd64_x86\vcvarsamd64_x86.bat" goto missing
    call "%~dp0bin\amd64_x86\vcvarsamd64_x86.bat" %2
    goto :SetVisualStudioVersion
    :amd64_arm
    if not exist "%~dp0bin\amd64_arm\vcvarsamd64_arm.bat" goto missing
    call "%~dp0bin\amd64_arm\vcvarsamd64_arm.bat" %2
    goto :SetVisualStudioVersion
    :SetVisualStudioVersion
    set VisualStudioVersion=14.0
    goto :eof
    :usage
    echo Error in script usage. The correct usage is:
    echo     %0 [option]
    echo   or
    echo     %0 [option] store
    echo where [option] is: x86 ^| amd64 ^| arm ^| x86_amd64 ^| x86_arm ^| amd64_x86 ^| amd64_arm
    echo:
    echo The store parameter sets environment variables to support
    echo   store (rather than desktop) development.
    echo:
    echo For example:
    echo     %0 x86_amd64
    echo     %0 x86_arm store
    goto :eof
    :missing
    echo The specified configuration type is missing.  The tools for the
    echo configuration might not be installed.
    goto :eof

也就是说,区别在于
架构

    :x86_amd64
    if not exist "%~dp0bin\x86_amd64\vcvarsx86_amd64.bat" goto missing
    call "%~dp0bin\x86_amd64\vcvarsx86_amd64.bat" %2
    goto :SetVisualStudioVersion


app

    :amd64_x86
    if not exist "%~dp0bin\amd64_x86\vcvarsamd64_x86.bat" goto missing
    call "%~dp0bin\amd64_x86\vcvarsamd64_x86.bat" %2
    goto :SetVisualStudioVersion

之间

亦即
    x86_amd64\vcvarsx86_amd64.bat

    amd64_x86\vcvarsamd64_x86.bat
之间的区别

用beyond compare比较它两,差很少两百行的脚本比较,我就傻在这里了 ...

而后我查有关计算机体系架构的资料,有太多似是而非或者聊当放屁的“文章”,而如下一文对我有些许帮助:

如今的x86 CPU在位数上有32/64bit之分,在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的效率更低。

由于64 bit的CPU的地址是64位的,指针是64位的,编译生成的二进制文件更大,运行时占用的内存更多;另外一方面,由于64位地址的问题,cache中能存放的指令就更少,因此更容易致使cache的miss。


因此在某些应用场景,64 bitCPU的更大的寻址空间,更快的数据传递,更快的浮点运算的特性, 与其64 bit的地址/指针所致使的cache miss的特性,始终并存。


为了充分利用64的优点,又避免64bit地址致使的cache miss的问题,Intel提出了x32 ABI的概念。

x32不是一个ARCH,是一个ABI。

x32能够充分的使用64 bit硬件的64 bit寄存器,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。



refrence:

http://blog.claudxiao.net/2012/05/x32-abi/

http://blog.csdn.net/force_eagle/article/details/7860574


但就算看到如此,我仍是没有搞懂
    x86_amd64\vcvarsx86_amd64.bat

    amd64_x86\vcvarsamd64_x86.bat
之间的区别


性能

相关文章
相关标签/搜索