HcommLocalReduceOnThread
产品支持情况
产品 |
是否支持 |
|---|---|
Atlas 350 加速卡 |
√ |
√ |
|
√ |
|
☓ |
|
☓ |
|
☓ |
针对
功能说明
提供本地归约操作,将src指向的长度为count*sizeof(dataType)的内存数据,与dst所指向的相同长度的内存数据进行reduceOp操作,并将结果输出到dst中。
函数原型
1 | 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。 针对 针对 |
reduceOp |
输入 |
归约操作类型。 HcommReduceOp类型的定义请参见HcommReduceOp。 针对Atlas 350 加速卡,支持归约类型:sum、max、min。 针对 针对 |
返回值
int32_t:接口成功返回0,其他失败。
约束说明
dst、src内存需要为device内存。
在 Atlas 350 加速卡 上,仅支持 AICPU_TS 模式下、在 Device 侧调用该接口。
调用示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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);