---
title: HcommLocalReduceOnThread
description: "| 产品 | 是否支持 |"
url: https://www.hiascend.com/document/detail/zh/canncommercial/latest/programug/commopdev/hcclopdevapi_07_0081.html
sourcePath: /source/zh/canncommercial/900/programug/commopdev/hcclopdevapi_07_0081.html
indexId: d5afc195fc01818332057819adb1cc1ae42d73f3a5e7c49111fdd1acc0f13b0675
---
# HcommLocalReduceOnThread

#### 产品支持情况

| 产品 | 是否支持 |
| --- | --- |
| Atlas 350 加速卡 | √ |
| Atlas A3 训练系列产品 / Atlas A3 推理系列产品 | √ |
| Atlas A2 训练系列产品 / Atlas A2 推理系列产品 | √ |
| Atlas 200I/500 A2 推理产品 | ☓ |
| Atlas 推理系列产品 | ☓ |
| Atlas 训练系列产品 | ☓ |


针对 Atlas A2 训练系列产品 / Atlas A2 推理系列产品 ，仅支持Atlas 800T A2 训练服务器、Atlas 900 A2 PoD 集群基础单元、Atlas 200T A2 Box16 异构子框。


#### 功能说明

提供本地归约操作，将src指向的长度为count*sizeof(dataType)的内存数据，与dst所指向的相同长度的内存数据进行reduceOp操作，并将结果输出到dst中。


#### 函数原型

```
int32_t HcommLocalReduceOnThread(ThreadHandle thread, void *dst, const void *src, uint64_t count, HcommDataType dataType, HcommReduceOp reduceOp)
```


#### 参数说明

| 参数名 | 输入/输出 | 描述 |
| --- | --- | --- |
| thread | 输入 | 通信线程句柄，为通过HcclThreadAcquire接口获取到的threads。 ThreadHandle类型的定义请参见ThreadHandle。 |
| dst | 输出 | 目的地址，Device内存。 |
| src | 输入 | 源地址，Device内存。 |
| count | 输入 | 元素个数。 |
| dataType | 输入 | 数据类型。 HcommDataType类型的定义请参见HcommDataType。 针对Atlas 350 加速卡，支持的数据类型：int8、int16、int32、float16、float32、bfp16。 针对 Atlas A3 训练系列产品 / Atlas A3 推理系列产品 ，支持数据类型：int8、int16、int32、float16、float32、bfp16。 针对 Atlas A2 训练系列产品 / Atlas A2 推理系列产品 ，支持数据类型：int8、int16、int32、float16、float32、bfp16。 |
| reduceOp | 输入 | 归约操作类型。 HcommReduceOp类型的定义请参见HcommReduceOp。 针对Atlas 350 加速卡，支持归约类型：sum、max、min。 针对 Atlas A3 训练系列产品 / Atlas A3 推理系列产品 ，支持归约类型：sum、max、min。 针对 Atlas A2 训练系列产品 / Atlas A2 推理系列产品 ，支持归约类型：sum、max、min。 |


#### 返回值

int32_t：接口成功返回0，其他失败。


#### 约束说明

dst、src内存需要为device内存。

在 Atlas 350 加速卡 上，仅支持 AICPU_TS 模式下、在 Device 侧调用该接口。


#### 调用示例

```
HcclComm comm;
CommEngine engine = COMM_ENGINE_CPU_TS;
aclrtStream stream;
aclrtCreateStream(&stream);
ThreadHandle thread;
HcclResult result = HcclThreadAcquireWithStream(comm, engine, stream, 2, &thread);

// 申请device内存
uint64_t memSize = 256;
s32 policy = static_cast<int>(ACL_MEM_TYPE_HIGH_BAND_WIDTH) | static_cast<int>(ACL_MEM_MALLOC_HUGE_FIRST);
aclrtMallocAttrValue moduleIdValue;
moduleIdValue.moduleId = HCCL;
aclrtMallocAttribute attrs{.attr = ACL_RT_MEM_ATTR_MODULE_ID, .value = moduleIdValue};
aclrtMallocConfig cfg{.attrs = &attrs, .numAttrs = 1};

void* inputMem;
void* outputMem;
aclrtMallocWithCfg(&inputMem, memSize, static_cast<aclrtMemMallocPolicy>(policy), &cfg);
aclrtMallocWithCfg(&outputMem, memSize, static_cast<aclrtMemMallocPolicy>(policy), &cfg);
// 执行Device侧的Reduce操作
uint64_t count = memSize / SIZE_TABLE[HCCL_DATA_TYPE_FP32];
HcommLocalReduceOnThread(thread, outputMem, inputMem, count, HCCL_DATA_TYPE_FP32, HCCL_REDUCE_SUM);
```

在 Atlas 350 加速卡 上，该函数需要编译到 Device 侧使用：

```
HcclComm comm;
CommEngine engine = COMM_ENGINE_AICPU_TS;
void *cclBufferAddr = nullptr;
uint64_t cclBufferSize = 0;
HcclGetHcclBuffer(comm, &cclBufferAddr, &cclBufferSize);
ThreadHandle thread;
HcclThreadAcquire(comm, engine, 1, 1, &thread);
// 其余资源申请
// 拷贝参数并 Launch Kernel
// Device 侧算法编排
uint64_t len = 256;
void *src = param.userIn;
void *dst = param.cclBuf;
uint64_t sizeOfFP32 = 4;
uint64_t count = len / sizeOfFP32;
HcommLocalReduceOnThread(thread, dst, src, count, HCOMM_DATA_TYPE_FP32, HCOMM_REDUCE_SUM);
```
