哪些CPU体系结构支持比较和交换(CAS)?
只是想知道哪种CPU体系结构支持比较和交换原子基元?
解决方案
Sparc v9具有cas指令。 SPARC v9体系结构手册讨论了附件J中CAS指令的使用,特别是示例J.11和J.12.
我相信指令的名称实际上是" casa",因为它可以访问当前地址空间或者备用地址。 " cas"是访问当前ASI的汇编宏。
在developers.sun.com上还有一篇文章,讨论了Sparc处理器多年来实现的各种原子指令,包括cas。
x86和Itanium具有CMPXCHG(比较和交换)
英特尔x86具有此支持。 IBM在其Solaris to Linux移植指南中给出了以下示例:
bool_t My_CompareAndSwap(IN int *ptr, IN int old, IN int new) { unsigned char ret; /* Note that sete sets a 'byte' not the word */ __asm__ __volatile__ ( " lock\n" " cmpxchgl %2,%1\n" " sete %0\n" : "=q" (ret), "=m" (*ptr) : "r" (new), "m" (*ptr), "a" (old) : "memory"); return ret; }
Powerpc具有可用的更强大的原语:" lwarx"和" stwcx"
lwarx从内存中加载一个值,但会记住该位置。任何其他触摸该位置的线程或者CPU都将导致条件存储指令" stwcx"失败。
因此,lwarx / stwcx组合允许我们实现原子增量/减量,比较和交换,以及更强大的原子操作,例如"原子增量循环缓冲区索引"
从ARMv6架构开始,ARM具有LDREX / STREX指令,可用于实现原子比较交换操作。
只是为了完成列表,MIPS具有加载链接(ll)和存储条件(sc)指令,它们从内存中加载值,如果没有其他CPU访问该位置,则有条件地进行存储。确实可以使用这些指令执行交换,增量和其他操作。但是,缺点是,由于大量CPU大量执行锁,我们会进入活锁:条件存储将经常失败,并且需要另一个循环重试,否则将失败,依此类推。
如果被认为足够重要的情况下,试图实现指数补偿的软件mutex_lock实现可能会变得非常复杂。在一个我使用128个内核的系统中,它们是。
回答此问题的另一种更简单的方法可能是列出不支持比较和交换的多处理器平台(或者可以用来写一个的加载链接/存储条件)。
我所知道的唯一一个是PARISC,它只有一个原子清晰的字指令。这可用于构造互斥锁(前提是该互斥锁将字对齐16字节边界)。此架构上没有CAS(与x86,ia64,ppc,sparc,mips,s390等不同)
1973年,Compare and swap被添加到IBM大型机中。它(以及Compare double和swap)仍然存在于IBM大型机中(以及最近的多处理器功能(如PLO执行锁定操作))。