所有多核CPU都会提供实现原子操作的指令
原子指令作用:
原子指令用于在多个CPU之间维护同步关系。在一些科学计算问题中,通过并行算法把子问题分配到多个cpu上执行,但是各个子问题之间存在合作关系,因此需要硬件机制来实现多个cpu之间同步。
例子:一个典型的同步例子是“原子加1”问题。
一个CPU要对内存单元M中的数据加1。
一个CPU要对内存单元M中的数据加1,这个动作需要3条指令来完成:读M的值到寄存器R,对R执行加1运算,把R的值写回内存单元M。
有两个CPU:
如果CPU有两个,则可能在一个CPU执行过程中,另一个CPU也执行这3条指令,最后M的结果不是增加2而是增加1。(a)展示的就是无原子指令保护的一种错误结果
原子指令可以实现一个CPU独占执行时间。使用原子指令把连续多条指令包含起来,计算机保证只有一个cpu处于执行状态,其他cpu必须等待原子指令结束才能继续执行。(b)展示的就是实现“原子加1”的正确方法。
原子指令的实现机制一般是在cpu的互联网络中实现一个全局的原子寄存器,所有cpu对这个原子寄存器的访问是互斥的。cpu使用原子指令申请访问原子寄存器时,互联网络会对所有CPU进行仲裁,确保只有一个cpu可以获得对原子寄存器的访问权;如果有cpu获得了原子寄存器访问权,其他cpu必须等待该cpu释放权限才能继续执行。
龙芯:
龙芯cpu中的原子指令有两条,ll指令用于获取独占权,sc指令用于释放独占权限。这两条指令通常是成对使用。在需要实现cpu同步的程序中,ll指令放在“原子指令开始”的位置,sc指令放在“原子指令结束”的位置。x86、ARM也都有实现类似功能的原子指令。