代码之家  ›  专栏  ›  技术社区  ›  Aquarius_Girl

“每个CPU指令可以处理32位数据”的含义是什么?

  •  0
  • Aquarius_Girl  · 技术社区  · 7 年前

    发件人: https://www.webopedia.com/TERM/R/register.html

    CPU拥有的寄存器数量和每个寄存器的大小(位数)有助于确定CPU的功率和速度。例如,32位CPU中的每个寄存器都是32位宽的。因此 每个CPU指令可以处理32位数据。

    对于我们编写的C/C++程序,以及我们在记事本中编写的文本,“每个CPU指令都可以处理32位数据”的含义是什么?

    3 回复  |  直到 7 年前
        1
  •  3
  •   Brendan    7 年前

    第一“每个CPU指令可以处理32位数据”是一个(技术上不正确的)概括。例如(32位80x86),有一些指令(例如。 cmpxchg8b , pushad , shrd )以及整个扩展(MMX、SSE、AVX),其中一条指令可以处理超过32位的数据。

    用于性能;最好将其视为“可以在固定时间内完成的工作量”或“完成固定工作量的时间”。这可以分为两个值-需要执行多少指令才能完成一定量的工作,以及在固定时间内可以执行多少指令(每秒指令数)。

    现在考虑添加一对128位整数。对于32位CPU,必须将其分解为四个32位加法,可能如下所示:

        ;Do a = a + b
    
        mov eax,[b]
        mov ebx,[b+4]
        mov ecx,[b+8]
        mov edx,[b+12]
        add [a],eax
        adc [a+4],ebx
        adc [a+8],ecx
        adc [a+12],edx
    

    在本例中,“需要多少指令才能完成一定量的工作”是8个指令。

    使用16位CPU,您需要更多指令。例如,它可能更像这样:

        mov ax,[b]
        mov bx,[b+2]
        mov cx,[b+4]
        mov dx,[b+6]
        add [a],ax
        mov ax,[b+8]
        adc [a+2],bx
        mov bx,[b+10]
        adc [a+4],cx
        mov cx,[b+12]
        adc [a+6],dx
        mov dx,[b+14]
        add [a+8],ax
        adc [a+10],bx
        adc [a+12],cx
        adc [a+14],dx
    

    在本例中,“需要多少指令才能完成一定量的工作”是16条指令。对于这项工作,使用相同的“每秒指令数”,16位CPU的速度将是32位CPU的一半。

    使用64位CPU,这项工作只需要4条指令,可能如下所示:

        mov eax,[b]
        mov ebx,[b+8]
        add [a],eax
        adc [a+8],ebx
    

    在这种情况下,使用相同的“每秒指令数”,64位CPU的速度将是32位CPU的两倍(和16位CPU的4倍)。

    当然,高级源代码在所有情况下都是相同的——不同之处在于编译器生成的内容。

    请注意,我在这里展示的(128位整数加法)是一个“好例子”-我之所以选择这一点,是因为很容易显示较大的寄存器可以减少/改进“需要执行大量工作的指令数”,从而提高性能(在相同的“每秒指令数”下)。对于不同的工作,你可能不会得到相同的改进。例如,对于使用8位整数的函数(例如。 char )“大于8位寄存器”可能根本没有帮助(在某些情况下可能会使事情变得更糟)。

        2
  •  1
  •   Arjun Santhosh    7 年前

    一次能传输32位数据的计算机、操作系统或软件程序。对于计算机处理器(例如80386、80486和奔腾),它们是32位处理器,这意味着处理器能够处理32位二进制数(十进制数高达4294967295)。任何较大的数据,计算机都需要将数字分解为较小的部分

        3
  •  0
  •   Edwin Buck    7 年前

    “单词”是变化的基本单位的大小。

    这个CPU除了是一个32位CPU外,还有一个32位大小的字。如果它正在更改项目,除非使用额外的CPU周期,否则它可以更改的最大“单个”项目是一个32位值。

    这并不意味着任何32位都可以用一条指令更改。但是,如果32位都是同一个字的一部分,则可以在一条指令中更改它们。