From d0e27808bae1f847f7b2beb2f3486f1338009cf0 Mon Sep 17 00:00:00 2001 From: wulinyu Date: Tue, 1 Jul 2025 11:21:50 +0800 Subject: [PATCH 1/4] add user case png --- atvc/docs/data/atvc_user_case.png | Bin 0 -> 63276 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 atvc/docs/data/atvc_user_case.png diff --git a/atvc/docs/data/atvc_user_case.png b/atvc/docs/data/atvc_user_case.png new file mode 100644 index 0000000000000000000000000000000000000000..6bbdc693f2c2e95f5404d767dc69228c44bed556 GIT binary patch literal 63276 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 literal 0 HcmV?d00001 -- Gitee From 4ad49615fc9f3cda34527f306ecb5580598b4971 Mon Sep 17 00:00:00 2001 From: wulinyu Date: Tue, 1 Jul 2025 21:05:04 +0800 Subject: [PATCH 2/4] sync atvc 0701 --- atvc/README.md | 31 ++++--- atvc/docs/1_quick_start.md | 13 ++- atvc/docs/2_developer_guide.md | 93 +------------------ atvc/include/broadcast/broadcast_host.h | 4 +- .../include/broadcast/broadcast_op_template.h | 10 +- .../broadcast/tiling/broadcast_tiling.h | 4 +- atvc/include/reduce/reduce_host.h | 2 +- 7 files changed, 42 insertions(+), 115 deletions(-) diff --git a/atvc/README.md b/atvc/README.md index f3085fff..f2087a5a 100644 --- a/atvc/README.md +++ b/atvc/README.md @@ -1,15 +1,10 @@ # ATVC -ATVC(Ascend Template for Vector Compute)是一个用AscendC API搭建的C++模板头文件集合,旨在帮助开发快速实现AscendC Vector算子。它将AscendC Vector算子开发流程中的"动态部分"基于C++的模板解耦成可自定义的模块并提供一系列Vector算子基类以及Tiling算法等API。 +ATVC(AscendC Template for Vector Compute)是一个用AscendC API搭建的C++模板头文件集合,旨在帮助用户快速开发AscendC典型Vector算子。它将AscendC Vector算子开发流程中的计算实现解耦成可自定义的模块, 内部封装实现了kernel数据搬入搬出等底层通用操作及通用tiling计算,实现了高效的算子开发模式。 +相比传统AscendC算子开发方式,利用ATVC搭建的Vector算子可做到开发效率提升3-5倍。用户只需选择匹配的模板并完成核心计算逻辑就完成算子kernel侧开发,atvc还内置了每个模板库对应的通用tiling计算实现,可省去用户手写tiling的开发量,算子无需调试就能达到不错的性能表现,极大提升算子开发效率。 -相比传统AscendC算子,利用ATVC搭建的Vector算子可做到开发代码量减少~50%, 用户只需搭建核心的计算逻辑便可灵活且快速完成Vector算子的编写,极大提升算子开发效率。 - -ATVC将Vector算子开发流程中的可定制化模块抽象出了Host层和Kernel层,两层的定义如下:
-- Host层:在CPU Host侧执行,它提供了一系列Tiling计算与策略选择的API,帮助用户计算出较优的数据搬运等运行态参数; -- Kernel层:在NPU侧调用,它是利用AscendC API搭建出的一系列Vector算子模板类,内置了算子开发中用户无需感知的数据搬入搬出以及资源申请等固定模块,并将核心计算模块开放给用户定义。 - -![architecture.png](./docs/data/architecture.png)
+![atvc_user_case.png](./docs/data/atvc_user_case.png)
请参阅[快速入门](./docs/1_quick_start.md)以快速了解ATVC的Add算子搭建流程。 @@ -70,16 +65,22 @@ Accuracy verification passed. ``` - +# 已支持的模版 +| Vector模版类型 | +| ------------------------------------------------------------ | +| Ele-wise模板 | +| Reduce模板 | +| Broadcast模板 | # 样例介绍 | 样例名 | 描述 | | ------------------------------------------------------------ | ------------------------------------------------------------ | -| [add](./examples/add/add.cpp) | ATVC实现的简单Add算子以及调用样例 | -| [add_with_scalar](./examples/add_with_scalar/add_with_scalar.cpp) | ATVC实现的通过标量控制计算逻辑的自定义EleWise算子以及调用样例 | -| [reduce_sum](./examples/reduce_sum/reduce_sum.cpp) | ATVC实现的自定义ReduceSum算子以及调用样例 | -| [sinh_custom](./examples/sinh_custom/sinh_custom.cpp) | ATVC实现的临时Tensor参与计算的Sinh自定义算子以及调用样例 | -| [broadcast_to](./examples/broadcast_to/broadcast_to.cpp) | ATVC实现的BroadcastTo自定义算子以及调用样例 | +| [add](./examples/add/add.cpp) | 使用ATVC的Ele-wise模板实现Add算子以及调用样例 | +| [sinh_custom](./examples/sinh_custom/sinh_custom.cpp) | 临时Tensor参与计算的自定义Ele-wise类算子以及调用样例 | +| [add_with_scalar](./examples/add_with_scalar/add_with_scalar.cpp) | 输入带标量的自定义Ele-wise类算子以及调用样例 | +| [reduce_sum](./examples/reduce_sum/reduce_sum.cpp) | 使用ATVC的Reduce模板实现自定义ReduceSum算子以及调用样例 | +| [broadcast_to](./examples/broadcast_to/broadcast_to.cpp) | 使用ATVC的Broadcast模板实现自定义BroadcastTo算子以及调用样例 | +更多算子类型介绍和如何选取模板参见参阅[快速入门](./docs/1_quick_start.md)。 @@ -87,7 +88,7 @@ Accuracy verification passed. | 算子模板 | 数据类型 | | ------------------------------------------------------------ | ------------------------------------------------------------ | -| EleWise | int32_t、float | +| Ele-wise | int32_t、float | | Reduce | int32_t、float | | Broadcast | int32_t、float | diff --git a/atvc/docs/1_quick_start.md b/atvc/docs/1_quick_start.md index 40625386..3c5c469b 100644 --- a/atvc/docs/1_quick_start.md +++ b/atvc/docs/1_quick_start.md @@ -133,4 +133,15 @@ $ bash run_test.sh broadcast_to # 执行broadcast样例 ``` ## 完整样例
-完整代码样例请参照[examples/add/add.cpp](../examples/add/add.cpp) \ No newline at end of file +完整代码样例请参照[examples/add/add.cpp](../examples/add/add.cpp) + +# 模板选择 +用户根据待开发的Vector算子定义特征,选择匹配的模板及其配套的tiling算法,若自定义算子不在当前模板库的范围内,建议使用基本AscnedC API 手写算子。 +## Ele-wise类算子 +Ele-wise类算子通常是指对张量进行元素级别的操作的函数或方法,包括但不限于加、减、乘、除及指数、对数、三角函数等数学函数。这类算子的特点是会逐元素进行计算操作,而不会改变输入数据的形状。常见的ELe-wise算子有Add、Sub、Exp、Log、Sin、Sqrt等。 +## Reduce类算子 +Reduce类算子通常是指对张量中的元素进行归约操作的算子,通常用来求和、求平均值等操作,可指定某几个维度进行归约计算,也可以将所有元素归约计算为一个标量。常见的Reduce类算子有ReduceSum(求和)、ReduceMean(求平均值)、ReduceProdcut(累乘)、ReduceMax(求最大值)、ReduceMin(求最小值)、ReduceAny(or操作)、ReduceAll(and操作)。 +## Broadcast +Broadcast算子是指完成广播操作,用于处理不同形状的张量间的运算。 +例如tensorA的shape是(1,5),tensorB的shape是(3,5),若要实现tensorC = tensorA + tensorB,实际上需要将TensorA广播为shape(3,5),再进行tensorA和tensorB的相加操作。广播的过程,实际上就是将原数据在某个维度上进行复制扩展。 + diff --git a/atvc/docs/2_developer_guide.md b/atvc/docs/2_developer_guide.md index 625418a9..412e4ce5 100644 --- a/atvc/docs/2_developer_guide.md +++ b/atvc/docs/2_developer_guide.md @@ -62,7 +62,7 @@ using AddOpTraits = ATVC::OpTraits; // Add算 ### 1.1.2 Param -ATVC框架提供了`ATVC::EleWiseParam`、`ATVC::ReduceParam`、`ATVC::BroadCastParam` 三个结构体来描述算子内部调度的Tiling数据和其他资源变量。Param 作为Host侧Tiling API的输出,它将传入ATVC框架的Kernel层算子模板,并在运行时指导算子内部模块完成数据的循环搬运与调度计算。
+ATVC框架提供了`ATVC::EleWiseParam`、`ATVC::ReduceParam`、`ATVC::BroadcastParam` 三个结构体来描述算子内部调度的Tiling数据和其他资源变量。Param 作为Host侧Tiling API的输出,它将传入ATVC框架的Kernel层算子模板,并在运行时指导算子内部模块完成数据的循环搬运与调度计算。
以下为ElementWise类算子的`ATVC::EleWiseParam`参与计算的伪代码,详细使用流程请参考本文档的 2.1.5 Host层API: ```cpp @@ -81,7 +81,7 @@ EleWiseKernel<<>>(x, y, z, paramDevi ``` ### 1.1.3 Policy -编译态参数`Policy`(`ATVC::ReducePolicy`, `ATVC::BroadCastPolicy`)是ATVC框架里Kernel层对部分算子模板的拓展描述,它对应算子模板类在不同场景的实例化实现。它由Tiling API计算出,并在策略分派API(`ATVC::Host::ReduceAdapter`)里将运行态的Policy结果转化为模板参数并调用该场景下的最佳模板实现来完成高效的数据计算。
+编译态参数`Policy`(`ATVC::ReducePolicy`, `ATVC::BroadcastPolicy`)是ATVC框架里Kernel层对部分算子模板的拓展描述,它对应算子模板类在不同场景的实例化实现。它由Tiling API计算出,并在策略分派API(`ATVC::Host::ReduceAdapter`)里将运行态的Policy结果转化为模板参数并调用该场景下的最佳模板实现来完成高效的数据计算。
以下为Reduce算子开发场景中`ATVC::ReducePolicy`参与计算的伪代码,详细过程请参考2.2.5 Host层API: ```cpp @@ -172,22 +172,6 @@ public: // 完成变长参数的解析和数据调度计算 // } -private: - - __aicore__ inline void Init() { - // - // 初始化计算资源 - // - }; - - __aicore__ inline void Process() { - // - // 根据param_参数,循环搬运特定长度数据到Ub,调用compute_的仿函数完成计算后,再从UB搬出到GM - // - }; - - EleWiseCompute compute_; // 开发自定义的计算模板类 - __gm__ EleWiseParam* param_; // CalEleWiseTiling API计算出的运行态参数 } ``` @@ -235,15 +219,6 @@ __global__ __aicore__ void SinhCustom(GM_ADDR x, GM_ADDR y, GM_ADDR param) auto op = ATVC::Kernel::EleWiseOpTemplate>(); op.Run(x, y, param); // 按照输入、输出、param的顺序传入Run函数中;OpTraits内部的ATVC::OpTemps将由EleWiseOpTemplate内部申请资源,开发无需关注 } -// -// Host侧调用核函数样例 -// -int main() -{ - //... - SinhCustom<<>>(xDevice, yDevice, paramDevice); - // ... -} ```
@@ -262,15 +237,6 @@ extern "C" __global__ __aicore__ void SinhCustom(GM_ADDR x, GM_ADDR y, GM_ADDR p auto op = ATVC::Kernel::EleWiseOpTemplate>(); // 模板参数传入固定的SinhOpTraits op.Run(x, y, param); } -// -// Host侧调用核函数样例 -// -int main() -{ - //... - SinhCustom<<>>(xDevice, yDevice, paramDevice); - // ... -} ``` ### 2.1.5 Host层API @@ -590,20 +556,6 @@ public: // Reduce类算子Run接口按输入、输出、运行态参数param顺序传入 // } -private: - __aicore__ inline void Init() { - // - // 初始化计算资源 - // - }; - - __aicore__ inline void Process() { - // - // 根据param_参数,循环搬运特定长度数据到Ub,调用compute_的仿函数完成计算(其中包含了基块结果之间的更新、UB之间的数据结果更新等计算)后,再从UB搬出到GM - // - }; - ReduceCompute compute_; // 开发自定义的计算模板类 - __gm__ ReduceParam* param_; // CalcReduceTiling API计算出的运行态参数 } ``` @@ -646,16 +598,6 @@ __global__ __aicore__ void ReduceSumCustom(GM_ADDR x, GM_ADDR y, GM_ADDR param) auto op = ATVC::Kernel::ReduceOpTemplate, SelectPolicy>(); op.Run(x, y, param); } -// -// Host侧调用核函数样例 -// -int main() -{ - //... - static constexpr ATVC::ReducePolicy SelectPolicy { ATVC::AR_PATTERN::ARARA, ATVC::AR_COUNT::A3R0, 0 }; // 该policy由策略分派API给出 - ReduceSumCustom<<>>(xDevice, yDevice, paramDevice); - // ... -} ```
@@ -1069,7 +1011,7 @@ struct BroadcastPolicy { #include "broadcast/broadcast_utils/broadcast_buf_pool.h" namespace ATVC { namespace Kernel { -template +template class BroadcastOpTemplate { public: using DataType = typename BroadcastCompute::DataType; @@ -1087,17 +1029,6 @@ public: this->Process(); } -private: - __aicore__ inline void Init(GM_ADDR src, GM_ADDR dst, GM_ADDR broadcastParam) - { - ... // 完成参数、buffer、UB内存等资源的初始化 - } - - __aicore__ inline void Process() - { - ... // 循环完成多轮数据搬入、UB计算调度、数据搬出 - } - AscendC::GlobalTensor srcGlobal; AscendC::GlobalTensor dstGlobal; BroadcastCompute compute_; @@ -1151,22 +1082,6 @@ __global__ __aicore__ void BroadcastCustom(GM_ADDR x, GM_ADDR y, GM_ADDR broadca auto op = ATVC::Kernel::BroadcastOpTemplate, Policy>(); op.Run(x, y, broadcastParam); } - -// host侧调用示例 -int32_t main(int32_t argc, char* argv[]) -{ - // acl资源初始化 - ... - - // 调用kernel 核函数 - BroadcastCustom<<>>(xDevice, yDevice, paramDevice); - - // 释放Acl资源 - ... - - return 0; -} - ```
@@ -1220,7 +1135,7 @@ bool CalcBroadcastTiling(std::vector shapeIn, std::vector shap using DataType = typename ATVC::TypeListGet::Type; auto inputDtype = GetOriInputType(); BroadcastTilingInputParam opInput = {shapeIn, shapeOut, inputDtype}; - OpTiling::BroadCastOpTiling tiling(opInput, policy, param); + OpTiling::BroadcastOpTiling tiling(opInput, policy, param); if(!tiling.Run()) { printf("[ERROR] Tiling Error\n"); return false; diff --git a/atvc/include/broadcast/broadcast_host.h b/atvc/include/broadcast/broadcast_host.h index fbfb583a..e6035a42 100644 --- a/atvc/include/broadcast/broadcast_host.h +++ b/atvc/include/broadcast/broadcast_host.h @@ -44,7 +44,7 @@ void PrintParam(BroadcastPolicy* policy, BroadcastParam* param) printf("[Broadcast] Tiling result: dstShape[%d] = %lu\n", i, param->tilingData.dstShape[i]); } printf("[Broadcast] Tiling result: policy.patternID = %d\n", policy->patternID); - printf("[Broadcast] Tiling result: workspaceSize = %d\n", param->workspaceSize); + printf("[Broadcast] Tiling result: workspaceSize = %u\n", param->workspaceSize); return; } @@ -63,7 +63,7 @@ bool CalcBroadcastTiling(std::vector shapeIn, std::vector shap using DataType = typename ATVC::TypeListGet::Type; auto inputDtype = GetOriInputType(); BroadcastTilingInputParam opInput = {shapeIn, shapeOut, inputDtype}; - OpTiling::BroadCastOpTiling tiling(opInput, policy, param); + OpTiling::BroadcastOpTiling tiling(opInput, policy, param); if(!tiling.Run()) { printf("[ERROR] Tiling Error\n"); return false; diff --git a/atvc/include/broadcast/broadcast_op_template.h b/atvc/include/broadcast/broadcast_op_template.h index b9a75181..8dff4f5d 100644 --- a/atvc/include/broadcast/broadcast_op_template.h +++ b/atvc/include/broadcast/broadcast_op_template.h @@ -31,7 +31,7 @@ struct BroadcastDataView }; namespace Kernel { -template +template class BroadcastOpTemplate { public: using DataType = typename BroadcastCompute::DataType; @@ -72,7 +72,7 @@ private: SyncDataQueue(); for (int i = 0; i < view.B1; i++) { uint32_t copyOutOffset; - if (SelectBroadCastPolicy.patternID == AB_PATTERN::ABA) { + if (SelectBroadcastPolicy.patternID == AB_PATTERN::ABA) { copyOutOffset = dimBCount * view.dimASize + dimACount * tilingData_->A2; } else { copyOutOffset = dimACount * tilingData_->A2 * view.dimBSize + dimBCount; @@ -112,7 +112,7 @@ private: AscendC::LocalTensor output; bufPool_.AllocTensor(output); SyncDataQueue(); - compute_.template Compute(input, inputOffset, output, + compute_.template Compute(input, inputOffset, output, OpsUtils::CeilAlign(tilingData_->A2, UB_ALIGN_COUNT), OpsUtils::CeilAlign(tilingData_->B2, UB_ALIGN_COUNT)); bufPool_.SetCopyOutSync(output); @@ -133,7 +133,7 @@ private: { uint32_t copyOutBaseOffset = 0; // 计算拷出偏移基址 - if (SelectBroadCastPolicy.patternID == AB_PATTERN::ABA) { + if (SelectBroadcastPolicy.patternID == AB_PATTERN::ABA) { if (tilingData_->A0 != 1) { // 核间A切分, 取部分A copyOutBaseOffset += view.dimAOffset; } @@ -153,7 +153,7 @@ private: __aicore__ inline void CalcView(BroadcastDataView &view) { - if (SelectBroadCastPolicy.patternID == AB_PATTERN::ABA) { + if (SelectBroadcastPolicy.patternID == AB_PATTERN::ABA) { view.dimASize = tilingData_->dstShape[1]; view.dimBSize = tilingData_->dstShape[0]; view.inShape[0] = 1; diff --git a/atvc/include/broadcast/tiling/broadcast_tiling.h b/atvc/include/broadcast/tiling/broadcast_tiling.h index a96ddd82..5cc2a3c7 100644 --- a/atvc/include/broadcast/tiling/broadcast_tiling.h +++ b/atvc/include/broadcast/tiling/broadcast_tiling.h @@ -37,9 +37,9 @@ struct BroadcastTilingInputParam { namespace OpTiling { constexpr static int32_t BRC_BASIC_NUM = 4; // broadcast输入输出内存基本块分配个数 -class BroadCastOpTiling { +class BroadcastOpTiling { public: - BroadCastOpTiling(ATVC::BroadcastTilingInputParam& inputParam, + BroadcastOpTiling(ATVC::BroadcastTilingInputParam& inputParam, ATVC::BroadcastPolicy* policy, ATVC::BroadcastParam* param) : opInput_(inputParam), param_(param), policy_(policy) { diff --git a/atvc/include/reduce/reduce_host.h b/atvc/include/reduce/reduce_host.h index 9acc2f32..fe99aca7 100644 --- a/atvc/include/reduce/reduce_host.h +++ b/atvc/include/reduce/reduce_host.h @@ -30,7 +30,7 @@ void PrintParam(ReducePolicy* policy, ReduceParam* param) printf("[Reduce] Tiling result: basicBlock = %zu\n", param->tilingData.basicBlock); printf("[Reduce] Tiling result: coreNum = %d\n", param->tilingData.coreNum); printf("[Reduce] Tiling result: nBufferNum = %d\n", param->nBufferNum); - printf("[Reduce] Tiling result: workspaceSize = %zu\n", param->workspaceSize); + printf("[Reduce] Tiling result: workspaceSize = %u\n", param->workspaceSize); printf("[Reduce] Tiling result: policy = (%d, %d, %d)\n", policy->patternID, policy->loopARCount, policy->loopInnerARCount); return; -- Gitee From 3dfcc8a0ee27bfd56a6f287347f516c3dce33c16 Mon Sep 17 00:00:00 2001 From: wulinyu Date: Tue, 1 Jul 2025 21:13:22 +0800 Subject: [PATCH 3/4] fix dsc --- atvc/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/atvc/README.md b/atvc/README.md index f2087a5a..ce4a1b87 100644 --- a/atvc/README.md +++ b/atvc/README.md @@ -2,7 +2,7 @@ # ATVC ATVC(AscendC Template for Vector Compute)是一个用AscendC API搭建的C++模板头文件集合,旨在帮助用户快速开发AscendC典型Vector算子。它将AscendC Vector算子开发流程中的计算实现解耦成可自定义的模块, 内部封装实现了kernel数据搬入搬出等底层通用操作及通用tiling计算,实现了高效的算子开发模式。 -相比传统AscendC算子开发方式,利用ATVC搭建的Vector算子可做到开发效率提升3-5倍。用户只需选择匹配的模板并完成核心计算逻辑就完成算子kernel侧开发,atvc还内置了每个模板库对应的通用tiling计算实现,可省去用户手写tiling的开发量,算子无需调试就能达到不错的性能表现,极大提升算子开发效率。 +相比传统AscendC算子开发方式,利用ATVC搭建的Vector算子可做到开发效率提升3-5倍。用户只需选择匹配的模板并完成核心计算逻辑就完成算子kernel侧开发,atvc还内置了每个模板库对应的通用tiling计算实现,可省去用户手写tiling的开发量就能达到不错的性能表现,极大提升算子开发效率。 ![atvc_user_case.png](./docs/data/atvc_user_case.png)
-- Gitee From 1bbd42c9c36ddd0e0851e7d847efa22113037933 Mon Sep 17 00:00:00 2001 From: wulinyu Date: Wed, 2 Jul 2025 09:00:44 +0800 Subject: [PATCH 4/4] add owner --- OWNERS | 1 + 1 file changed, 1 insertion(+) diff --git a/OWNERS b/OWNERS index 0ebceeb5..c0e0590d 100644 --- a/OWNERS +++ b/OWNERS @@ -22,6 +22,7 @@ approvers: - vicia - kong0808 - zhuliangying +- wang-xiaozhi reviewers: - wuzhaolinhuawei - horming -- Gitee