---
title: 原子操作多核场景优化
description: "LL/SC（Load-link/Store-condition）原子指令需要把共享变量先加载到本核所在的L1 Cache中进行修改，在锁竞争少的情况下性能较好，锁竞争激烈时会导致系统性能下降严重。ARMv8.1规范中引入了新的原子操作指令扩展LSE（Large System Extensions），将计算操作放到L3 Cache中进行。不仅扩大数据共享范围，减少Cache一致性耗时，还能在锁竞争激烈时可以提升锁的性能。"
url: https://www.hikunpeng.com/document/detail/zh/perftuning/tuningtip/kunpengtuning_12_0081.html
sourcePath: /source/zh/perftuning/tuningtip/kunpengtuning_12_0081.html
indexId: 040c889cc093e19b728daf6ea7f8cb26f6e8a4d6be24e7eddfb01bd9929a54b458
---
# 原子操作多核场景优化

#### 原理

LL/SC（Load-link/Store-condition）原子指令需要把共享变量先加载到本核所在的L1 Cache中进行修改，在锁竞争少的情况下性能较好，锁竞争激烈时会导致系统性能下降严重。ARMv8.1规范中引入了新的原子操作指令扩展LSE（Large System Extensions），将计算操作放到L3 Cache中进行。不仅扩大数据共享范围，减少Cache一致性耗时，还能在锁竞争激烈时可以提升锁的性能。

在多核、原子锁竞争严重的情况下，建议在GCC编译选项中添加LSE相关选项，缓解锁竞争。


LL/SC指令(ldaxr&stlxr)：


LSE指令（ldaddal）：


#### 修改方式

GCC 6.0以上版本支持（建议使用GCC 7.3.0以上版本）。

在编译选项中增加：

```
-march=armv8-a+lse
```

或者

```
-march=armv8.1-a
```

或者

```
-march=armv8.2-a
```
