已合并
新增标量原子操作概述文档 #6523
新增标量原子操作概述文档 #6523
已合并
GRJ_XIDUO创建于 15 天前
共 4 个文件变更+60-5
@@ -1305,6 +1305,7 @@
1305 - [asc_set_atomic_min](SIMD-API/c_api/atomic/datamove_atomic/asc_set_atomic_min.md)1305 - [asc_set_atomic_min](SIMD-API/c_api/atomic/datamove_atomic/asc_set_atomic_min.md)
1306 - [asc_disable_dma_atomic](SIMD-API/c_api/atomic/datamove_atomic/asc_disable_dma_atomic.md)1306 - [asc_disable_dma_atomic](SIMD-API/c_api/atomic/datamove_atomic/asc_disable_dma_atomic.md)
1307 - [标量原子操作](SIMD-API/c_api/atomic/scalar_atomic/scalar_atomic.md)1307 - [标量原子操作](SIMD-API/c_api/atomic/scalar_atomic/scalar_atomic.md)
1308+ - [标量原子操作概述](SIMD-API/c_api/atomic/scalar_atomic/scalar_atomic_overview.md)
1308 - [asc_atomic_add](SIMD-API/c_api/atomic/scalar_atomic/asc_atomic_add.md)1309 - [asc_atomic_add](SIMD-API/c_api/atomic/scalar_atomic/asc_atomic_add.md)
1309 - [asc_atomic_and](SIMD-API/c_api/atomic/scalar_atomic/asc_atomic_and.md)1310 - [asc_atomic_and](SIMD-API/c_api/atomic/scalar_atomic/asc_atomic_and.md)
1310 - [asc_atomic_cas](SIMD-API/c_api/atomic/scalar_atomic/asc_atomic_cas.md)1311 - [asc_atomic_cas](SIMD-API/c_api/atomic/scalar_atomic/asc_atomic_cas.md)
@@ -1,11 +1,12 @@
1# 原子操作概述1# 原子操作概述
2 2 
3-数据搬运随路原子操作接口用于对后续目的地址为GM的数据搬运指令开启原子操作,涉及的接口请参见[表1](#table1)。如下图1的左侧子图所示,未开启原子操作时,写入GM的数据搬运完成后,GM中原始数据将被新搬运数据完全覆盖。如图1右侧子图所示,当数据搬运随路原子操作接口被调用后,系统将为后续写入GM的数据搬运开启原子操作。此时,数据搬运完成后,GM中的最终数据由原始GM数据与新搬运数据共同决定。3+数据搬运随路原子操作接口用于对后续目的地址为GM的数据搬运指令开启原子操作,涉及的接口请参见[表1](#datamove_atomic_operation_interface)。如下图1的左侧子图所示,未开启原子操作时,写入GM的数据搬运完成后,GM中原始数据将被新搬运数据完全覆盖。如图1右侧子图所示,当数据搬运随路原子操作接口被调用后,系统将为后续写入GM的数据搬运开启原子操作。此时,数据搬运完成后,GM中的最终数据由原始GM数据与新搬运数据共同决定。
4 4 
5**图1** 数据搬运随路原子累加效果5**图1** 数据搬运随路原子累加效果
6+ 
6![](../../../figures/atomic_operation_pipelined_data_movement_effect.png "数据搬运随路原子累加效果")7![](../../../figures/atomic_operation_pipelined_data_movement_effect.png "数据搬运随路原子累加效果")
7 8 
8-**表1** 数据搬运随路原子操作接口<a name="table1"></a>9+**表1** 数据搬运随路原子操作接口<a id="datamove_atomic_operation_interface"></a>
9 10 
10| 对应接口 | 接口功能描述 |11| 对应接口 | 接口功能描述 |
11| --- | --- |12| --- | --- |
@@ -14,7 +15,7 @@
14| [asc_set_atomic_min](datamove_atomic/asc_set_atomic_min.md) | 设置后续搬运到GM的数据是否执行原子比较:将待拷贝的内容和GM已有内容进行比较,然后将最小值写入GM。 |15| [asc_set_atomic_min](datamove_atomic/asc_set_atomic_min.md) | 设置后续搬运到GM的数据是否执行原子比较:将待拷贝的内容和GM已有内容进行比较,然后将最小值写入GM。 |
15| [asc_disable_dma_atomic](datamove_atomic/asc_disable_dma_atomic.md) | 关闭数据搬运随路原子操作功能。 |16| [asc_disable_dma_atomic](datamove_atomic/asc_disable_dma_atomic.md) | 关闭数据搬运随路原子操作功能。 |
16 17 
17-Scalar原子操作接口,能够在指定GM地址上进行单点原子计算操作,涉及的接口请参见[表2](#table2)。18+Scalar原子操作接口,能够在指定GM地址上进行单点原子计算操作,涉及的接口请参见[表2](#scalar_atomic_operation_interface)。
18 19 
19标量原子操作与数据搬运随路原子操作相比,两者的差异如下:20标量原子操作与数据搬运随路原子操作相比,两者的差异如下:
20 21 
@@ -23,10 +24,11 @@ Scalar原子操作接口,能够在指定GM地址上进行单点原子计算操
23 24 
24如下图2左侧子图所示,不使用`asc_atomic_add`接口时,多个AI Core同时对同一GM地址执行累加操作会相互覆盖,操作不具备原子性,最终结果不可预期。如右侧子图所示,使用`asc_atomic_add`接口后,各AI Core的累加操作串行化执行,确保每次累加操作的原子性,最终结果符合预期。25如下图2左侧子图所示,不使用`asc_atomic_add`接口时,多个AI Core同时对同一GM地址执行累加操作会相互覆盖,操作不具备原子性,最终结果不可预期。如右侧子图所示,使用`asc_atomic_add`接口后,各AI Core的累加操作串行化执行,确保每次累加操作的原子性,最终结果符合预期。
25 26 
26-**图2** 标量原子累加效果27+**图2** 标量原子累加效果<a id="scalar_atomic_operation_diagram"></a>
28+ 
27![](../../../figures/scalar_atomic_operation_diagram.png "标量原子累加效果")29![](../../../figures/scalar_atomic_operation_diagram.png "标量原子累加效果")
28 30 
29-**表2** Scalar原子操作接口<a name="table2"></a>31+**表2** Scalar原子操作接口<a id="scalar_atomic_operation_interface"></a>
30 32 
31| 对应接口 | 接口功能描述 |33| 对应接口 | 接口功能描述 |
32| --- | --- |34| --- | --- |
@@ -1,5 +1,6 @@
1# 标量原子操作1# 标量原子操作
2 2 
3+- **[标量原子操作概述](scalar_atomic_overview.md)**
3- **[asc_atomic_add](asc_atomic_add.md)**4- **[asc_atomic_add](asc_atomic_add.md)**
4- **[asc_atomic_and](asc_atomic_and.md)**5- **[asc_atomic_and](asc_atomic_and.md)**
5- **[asc_atomic_cas](asc_atomic_cas.md)**6- **[asc_atomic_cas](asc_atomic_cas.md)**
@@ -0,0 +1,51 @@
1+# 标量原子操作概述
2+ 
3+标量原子操作接口用于在Global Memory(GM)的指定地址上完成单个元素的原子读-改-写操作:读取该地址的旧值`old_value`,按接口语义计算新值并写回该地址,同时返回`old_value`。整个过程由硬件保证为原子操作,其他原子更新无法插入其中,因此多个AI Core或同一AI Core内的多条指令并发访问同一GM地址时不会相互覆盖,最终结果符合预期。不使用原子操作与使用原子操作的效果对比如[标量原子累加效果示意图](../atomic_operations_overview.md#scalar_atomic_operation_diagram)所示。
4+ 
5+标量原子操作适用于多个核需要更新同一个GM地址的场景,例如多核并行累加同一个统计量、维护多个核共享的计数器、在指定地址上比较并更新状态等场景。
6+ 
7+## 接口列表
8+ 
9+标量原子操作接口如表1所示,各接口支持的数据类型如表2所示。其中`old_value`为`address`指向的GM地址上的旧值,`new_value`为写回该地址的新值,表1中的原子计算接口均返回`old_value`。
10+ 
11+**表1** 标量原子操作接口
12+ 
13+| 对应接口 | 接口功能描述 | 计算公式 |
14+| --- | --- | --- |
15+| [asc_atomic_add](asc_atomic_add.md) | 原子加:将`address`指向的GM地址上的旧值与输入标量值`val`求和,并将结果写回该地址。 | $new\_value = old\_value + val$ |
16+| [asc_atomic_sub](asc_atomic_sub.md) | 原子减:将`address`指向的GM地址上的旧值减去输入标量值`val`,并将结果写回该地址。 | $new\_value = old\_value - val$ |
17+| [asc_atomic_max](asc_atomic_max.md) | 原子取大:比较`address`指向的GM地址上的旧值与输入标量值`val`,并将较大值写回该地址。 | $new\_value = Max(old\_value, val)$ |
18+| [asc_atomic_min](asc_atomic_min.md) | 原子取小:比较`address`指向的GM地址上的旧值与输入标量值`val`,并将较小值写回该地址。 | $new\_value = Min(old\_value, val)$ |
19+| [asc_atomic_inc](asc_atomic_inc.md) | 原子递增:`address`指向的GM地址上的旧值大于或等于`val`时将该地址置为0,否则将旧值加1后写回。 | $new\_value = (old\_value >= val) ? 0 : (old\_value + 1)$ |
20+| [asc_atomic_dec](asc_atomic_dec.md) | 原子递减:`address`指向的GM地址上的旧值等于0或大于`val`时将该地址置为`val`,否则将旧值减1后写回。 | $new\_value = (old\_value == 0 \vert\vert old\_value > val) ? val : (old\_value - 1)$ |
21+| [asc_atomic_and](asc_atomic_and.md) | 原子与:将`address`指向的GM地址上的旧值与输入标量值`val`按位与,并将结果写回该地址。 | $new\_value = old\_value \& val$ |
22+| [asc_atomic_or](asc_atomic_or.md) | 原子或:将`address`指向的GM地址上的旧值与输入标量值`val`按位或,并将结果写回该地址。 | $new\_value = old\_value \vert val$ |
23+| [asc_atomic_xor](asc_atomic_xor.md) | 原子异或:将`address`指向的GM地址上的旧值与输入标量值`val`按位异或,并将结果写回该地址。 | $new\_value = old\_value \oplus val$ |
24+| [asc_atomic_exch](asc_atomic_exch.md) | 原子交换:将输入标量值`val`写入`address`指向的GM地址以替换旧值。 | $new\_value = val$ |
25+| [asc_atomic_cas](asc_atomic_cas.md) | 原子比较交换:`address`指向的GM地址上的旧值与`compare`相等时,将`val`写入该地址;不相等时保持该地址的值不变。 | $new\_value = (old\_value == compare) ? val : old\_value$ |
26+| [asc_set_store_atomic_config_v1](asc_set_store_atomic_config_v1.md) | 设置标量原子操作配置:操作类型(仅支持求和操作)和数据类型。 | - |
27+| [asc_get_store_atomic_config](asc_get_store_atomic_config.md) | 获取asc_set_store_atomic_config_v1设置的标量原子操作配置。 | - |
28+ 
29+表1中两类接口的产品支持情况不同:
30+ 
31+- [asc_atomic_add](asc_atomic_add.md)~[asc_atomic_cas](asc_atomic_cas.md):仅Ascend 950PR&950DT系列产品支持。
32+- [asc_set_store_atomic_config_v1](asc_set_store_atomic_config_v1.md):仅Atlas A2系列产品、Atlas A3系列产品支持,Ascend 950PR&950DT系列产品不支持,在Ascend 950PR&950DT系列产品可使用[asc_atomic_add](asc_atomic_add.md)实现原子累加。
33+- [asc_get_store_atomic_config](asc_get_store_atomic_config.md):Atlas A2系列产品、Atlas A3系列产品、Ascend 950PR&950DT系列产品均支持,但在Ascend 950PR&950DT系列产品上已废弃,该系列产品可直接使用[asc_atomic_add](asc_atomic_add.md)实现原子累加。
34+ 
35+**表2** 标量原子操作接口支持的数据类型
36+ 
37+| 对应接口 | `dtype`支持的数据类型 |
38+| --- | --- |
39+| [asc_atomic_add](asc_atomic_add.md) | `int32_t`、`uint32_t`、`float`、`int64_t`、`uint64_t` |
40+| [asc_atomic_sub](asc_atomic_sub.md) | `int32_t`、`uint32_t`、`float`、`int64_t`、`uint64_t` |
41+| [asc_atomic_max](asc_atomic_max.md) | `int32_t`、`uint32_t`、`float`、`int64_t`、`uint64_t` |
42+| [asc_atomic_min](asc_atomic_min.md) | `int32_t`、`uint32_t`、`float`、`int64_t`、`uint64_t` |
43+| [asc_atomic_inc](asc_atomic_inc.md) | `uint32_t`、`uint64_t` |
44+| [asc_atomic_dec](asc_atomic_dec.md) | `uint32_t`、`uint64_t` |
45+| [asc_atomic_and](asc_atomic_and.md) | `int32_t`、`uint32_t`、`int64_t`、`uint64_t` |
46+| [asc_atomic_or](asc_atomic_or.md) | `int32_t`、`uint32_t`、`int64_t`、`uint64_t` |
47+| [asc_atomic_xor](asc_atomic_xor.md) | `int32_t`、`uint32_t`、`int64_t`、`uint64_t` |
48+| [asc_atomic_exch](asc_atomic_exch.md) | `int32_t`、`uint32_t`、`float`、`int64_t`、`uint64_t` |
49+| [asc_atomic_cas](asc_atomic_cas.md) | `int32_t`、`uint32_t`、`float`、`int64_t`、`uint64_t` |
50+| [asc_set_store_atomic_config_v1](asc_set_store_atomic_config_v1.md) | `float`、`half`、`int16_t`、`int32_t`、`int8_t`、`bfloat16_t` |
51+| [asc_get_store_atomic_config](asc_get_store_atomic_config.md) | - |