diff --git "a/source/\350\256\241\347\256\227\345\255\220\347\263\273\347\273\237/\345\206\205\345\255\230\350\256\277\351\227\256\346\250\241\345\236\213.rst" "b/source/\350\256\241\347\256\227\345\255\220\347\263\273\347\273\237/\345\206\205\345\255\230\350\256\277\351\227\256\346\250\241\345\236\213.rst" index 06b97356ae1d34d36d4bf3c6971136df984a8fb0..86fea43cb271e9e1d95d619709eec663d4d6caec 100644 --- "a/source/\350\256\241\347\256\227\345\255\220\347\263\273\347\273\237/\345\206\205\345\255\230\350\256\277\351\227\256\346\250\241\345\236\213.rst" +++ "b/source/\350\256\241\347\256\227\345\255\220\347\263\273\347\273\237/\345\206\205\345\255\230\350\256\277\351\227\256\346\250\241\345\236\213.rst" @@ -79,17 +79,17 @@ L3Cache上进行排队,保证在原子操作的多个动作之间能维持原 原子指令在遇到冲突的时候,会直接阻住CPU的执行。这个对于很多CPU的锁行为是有害的 ,所以ARMv8还有一套exclusive指令: -* LDA Load-Acquire,有不同字长的版本(下同) -* STL Store-Release +* LDXR Load-Exclusive,有不同字长的版本(下同) +* STXR Store-Exclusive -这个方案把部分自由度还给软件:LDA读一个内存,同时在这个内存地址上打上一个标记 -,STL负责对这个地址写入一个值,如果这这种有其他CPU修改过这个值,这个写入会失败 -本CPU可以重新做这个LDA。这个方案不需要CPU作等待,CPU如果写不成功,可以先去做别 +这个方案把部分自由度还给软件:LDXR读一个内存,同时在这个内存地址上打上一个标记 +,STXR负责对这个地址写入一个值,如果这这种有其他CPU修改过这个值,这个写入会失败 +本CPU可以重新做这个LDXR。这个方案不需要CPU作等待,CPU如果写不成功,可以先去做别 的操作,根据策略重试。这对于共享的核的数量非常多的时候,收益会很大。 和原子指令把同步行为推到L3 Cache不同,在鲲鹏920上Exclusive指令的同步是在靠近 -CPU的Cache上做的,LDA在本地的Cacheline上设置了一个标记,其他CPU如果更新了这个 -数据,会把这个Cacheline置为无效,这时再做STL就可以知道数据更改过了。但Cache同 +CPU的Cache上做的,LDXR在本地的Cacheline上设置了一个标记,其他CPU如果更新了这个 +数据,会把这个Cacheline置为无效,这时再做STXR就可以知道数据更改过了。但Cache同 步本身也有成本(共享这个数据的CPU越多成本越高),所以这也是个权衡的问题,通常 我们用后者做锁操作,而用前者做原子变量一类的功能。