From 6206cd3d757acfa85529b18672e3d13c945bf684 Mon Sep 17 00:00:00 2001 From: MayYouBeProsperous <99723454+MayYouBeProsperous@users.noreply.github.com> Date: Tue, 2 Aug 2022 16:49:39 +0800 Subject: [PATCH 01/10] =?UTF-8?q?=E3=80=90Hackathon=20No.67=E3=80=91?= =?UTF-8?q?=E4=B8=BA=E7=A5=9E=E7=BB=8F=E7=BD=91=E7=BB=9C=E7=BC=96=E8=AF=91?= =?UTF-8?q?=E5=99=A8=20CINN=20=E5=A2=9E=E5=8A=A0=20arange=20=E7=AE=97?= =?UTF-8?q?=E5=AD=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../APIs/20200802_cinn_api_design_arange.md | 179 ++++++++++++++++++ 1 file changed, 179 insertions(+) create mode 100644 rfcs/CINN/APIs/20200802_cinn_api_design_arange.md diff --git a/rfcs/CINN/APIs/20200802_cinn_api_design_arange.md b/rfcs/CINN/APIs/20200802_cinn_api_design_arange.md new file mode 100644 index 000000000..cdef64139 --- /dev/null +++ b/rfcs/CINN/APIs/20200802_cinn_api_design_arange.md @@ -0,0 +1,179 @@ +# CINN arange 设计文档 +|API名称 | 新增API名称 | +|---|---| +|提交作者 | MayYouBeProsperous | +|提交时间 | 2022-08-02 | +|版本号 | V1.0 | +|依赖CINN版本 | develop | +|文件名 | 20200802_cinn_api_design_arange.md
| + + +# 一、概述 + +## 1、相关背景 +`arange`是神经网络编译器中基础的算子,向算子输入一个数值区间的边界,以及步长`step`,算子输出一个间隔相等的序列 + +## 2、名词解释 +tensor:张量,形式为多维数组 +step:步长 ,序列中相邻的两个元素的差值 + +## 3、功能目标 +实现`arange`算子。 +算子输入起始 $start$ ,终点 $end$ ,以及步长 $step$ +算子输出序列 $(x_0,x_1,...,x_n)$ +其中长度 $n=\left [ (start-end)/step \right ]$,序列满足 $start\leqslant x_0 < x_1 < ... < x_n < end$ ,且 $x_{i+1} - x_i = step$ $(0 \leqslant i < n)$ +算子的输入参数可能有异常情况,并且部分的参数可缺省,需考虑处理。 +## 4、意义 +实现`arange`算子,将进一步CINN的基础算子库。 + +# 二、CINN现状 +CINN框架暂不支持`arange`算子,需要实现。 + +# 三、业内方案调研 +1. tvm实现`arange`的核心代码如下,使用了lambda表达式实现功能 +```c++ +inline Tensor arange(const PrimExpr& start, const PrimExpr& stop, const PrimExpr& step, + DataType dtype, std::string name = "T_arange", std::string tag = kInjective) { + PrimExpr num_elem = tvm::cast( + tvm::DataType::Int(32), tvm::ceil(tvm::cast(tvm::DataType::Float(32), stop - start) / step)); + Array shape; + return compute( + {num_elem}, + [&](const Array& indices) { return tvm::cast(dtype, start + step * indices[0]); }, name, + tag); +} +``` +2. xla实现`arange`的核心代码如下 +```c++ +torch::lazy::NodePtr ARange(const at::Scalar& start, const at::Scalar& end, + const at::Scalar& step, + at::ScalarType scalar_type) { + xla::PrimitiveType type = MakeXlaPrimitiveType(scalar_type, + /*device=*/nullptr); + XLA_CHECK_NE(step.toDouble(), 0.0); + XLA_CHECK(!std::isnan(start.toDouble()) && !std::isnan(end.toDouble())) + << "unsupported range: " << start.toDouble() << " -> " << end.toDouble(); + XLA_CHECK((start.toDouble() <= end.toDouble() && step.toDouble() > 0.0) || + (start.toDouble() >= end.toDouble() && step.toDouble() < 0.0)); + xla::Literal values; + switch (type) { + case xla::PrimitiveType::BF16: + values = XlaHelpers::Range( + static_cast(start.toFloat()), + static_cast(end.toFloat()), + static_cast(step.toFloat())); + break; + case xla::PrimitiveType::F16: + values = + XlaHelpers::Range(static_cast(start.toHalf()), + static_cast(end.toHalf()), + static_cast(step.toHalf())); + break; + case xla::PrimitiveType::F32: + values = XlaHelpers::Range(start.toFloat(), end.toFloat(), + step.toFloat()); + break; + case xla::PrimitiveType::F64: + values = XlaHelpers::Range(start.toDouble(), end.toDouble(), + step.toDouble()); + break; + case xla::PrimitiveType::U8: + values = XlaHelpers::Range(start.toByte(), end.toByte(), + step.toByte()); + break; + case xla::PrimitiveType::S8: + values = XlaHelpers::Range(start.toChar(), end.toChar(), + step.toChar()); + break; + case xla::PrimitiveType::S16: + values = XlaHelpers::Range(start.toShort(), end.toShort(), + step.toShort()); + break; + case xla::PrimitiveType::U16: + values = + XlaHelpers::Range(start.toInt(), end.toInt(), step.toInt()); + break; + case xla::PrimitiveType::S32: + values = + XlaHelpers::Range(start.toInt(), end.toInt(), step.toInt()); + break; + case xla::PrimitiveType::U32: + values = XlaHelpers::Range(start.toLong(), end.toLong(), + step.toLong()); + break; + case xla::PrimitiveType::S64: + values = XlaHelpers::Range(start.toLong(), end.toLong(), + step.toLong()); + break; + case xla::PrimitiveType::U64: + values = XlaHelpers::Range(start.toLong(), end.toLong(), + step.toLong()); + break; + default: + XLA_ERROR() << "XLA type not supported: " << type; + } + return torch::lazy::MakeNode(std::move(values)); +} +``` +主要函数XlaHelpers::Range的实现 +```c++ +template +static xla::Literal Range(T start, T end, T step) { + return xla::LiteralUtil::CreateR1(xla::util::Range(start, end, step)); +} + +template +std::vector Range(T start, T end, T step = 1) { + std::vector result; + result.reserve(static_cast((end - start) / step)); + if (start < end) { + for (; start < end; start += step) { + result.push_back(start); + } + } else { + for (; start > end; start += step) { + result.push_back(start); + } + } + return result; +} +``` + +# 四、对比分析 +tvm与xla的arange实现方法基本类似。 + +# 五、设计思路与实现方案 + +## 命名与参数设计 +start:区间起点(且区间包括此值),默认值为0。 +end:区间终点(且通常区间不包括此值),默认值为None。 +step:均匀分割的步长,默认值为1。 +dtype:输出`tensor`的数据类型,支持int32、int64、float32、float64。当该参数值为None时, 输出`tensor`的数据类型为int64。默认值为None。 +## 底层OP设计 +1. 在 `cinn/hlir/op/contrib/arange.h` 里声明`arange`算子。 +2. 在 `cinn/hlir/op/contrib/arange.cc` 里实现`arange`算子和 `strategy`。 +## API实现方案 +1. 在 `cinn/frontend/base_build.h` 里声明 `BaseBuilder::Arange`。 +2. 在 `cinn/frontend/base_build.cc` 里实现 `BaseBuilder::Arange`。 +3. 在 `cinn/pybind/frontend` 对 Python 类 `BaseBuilder` 添加 `arange` 接口,并绑定到 `BaseBuilder::Arange`。 +4. 上层 `load_paddle_model` 调用提交到 `cinn/frontend/paddle_model_to_program.h` 和 `.cc` 文件下。 + +python通过Builder类的方法调用`arange`。 +```python +builder = CinnBuilder("test_basic") +b = builder.arange(1,10,1,"int32") +``` +# 六、测试和验收的考量 +1. 提供基础的 demo 文件。 +2. 在`cinn/hlir/op/contrib/arange_test.cc`中添加对底层OP进行测试的代码。 +3. 在`cinn/frontend/net_builder_test.cc`中添加对前端的测试。 +4. 提交 API 说明到相应的文档中。 +# 七、可行性分析和排期规划 +- 可行性分析:CINN已实现Builder、Expr IR、算子注册等模块,在CINN已有的框架基础上能够很好地增加算子功能。 +- 排期规划:预计9月1日完成算子实现、功能测试以及文档 + +# 八、影响面 +对其他模块无影响。 + +# 附件及参考资料 +[深度学习框架开发指南-飞桨黑客松3.0](https://aistudio.baidu.com/aistudio/course/introduce/26351?directly=1&shared=1) From 7992bd552d906f016d0ab997b8f67e04a34f9000 Mon Sep 17 00:00:00 2001 From: MayYouBeProsperous <99723454+MayYouBeProsperous@users.noreply.github.com> Date: Tue, 2 Aug 2022 18:21:56 +0800 Subject: [PATCH 02/10] Update 20200802_cinn_api_design_arange.md --- rfcs/CINN/APIs/20200802_cinn_api_design_arange.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/rfcs/CINN/APIs/20200802_cinn_api_design_arange.md b/rfcs/CINN/APIs/20200802_cinn_api_design_arange.md index cdef64139..32e04d48f 100644 --- a/rfcs/CINN/APIs/20200802_cinn_api_design_arange.md +++ b/rfcs/CINN/APIs/20200802_cinn_api_design_arange.md @@ -20,8 +20,10 @@ step:步长 ,序列中相邻的两个元素的差值 ## 3、功能目标 实现`arange`算子。 算子输入起始 $start$ ,终点 $end$ ,以及步长 $step$ -算子输出序列 $(x_0,x_1,...,x_n)$ -其中长度 $n=\left [ (start-end)/step \right ]$,序列满足 $start\leqslant x_0 < x_1 < ... < x_n < end$ ,且 $x_{i+1} - x_i = step$ $(0 \leqslant i < n)$ +算子输出序列 $(x_0,x_1,...,x_n)$ ,序列长度 $n=\left [ (start-end)/step \right ]$,且 $x_{i+1} - x_i = step$ $(0 \leqslant i < n)$ +1. 若 $start < end$ , $step>0$ ,序列满足 $start\leqslant x_0 < x_1 < ... < x_n < end$ +2. 若 $start > end$ , $step<0$ ,序列满足 $start\geqslant x_0 > x_1 > ... > x_n > end$ + 算子的输入参数可能有异常情况,并且部分的参数可缺省,需考虑处理。 ## 4、意义 实现`arange`算子,将进一步CINN的基础算子库。 From 1a22269701482a4ff0c44daebdd693c48c6cde72 Mon Sep 17 00:00:00 2001 From: MayYouBeProsperous <99723454+MayYouBeProsperous@users.noreply.github.com> Date: Tue, 2 Aug 2022 18:32:50 +0800 Subject: [PATCH 03/10] Update 20200802_cinn_api_design_arange.md --- rfcs/CINN/APIs/20200802_cinn_api_design_arange.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/rfcs/CINN/APIs/20200802_cinn_api_design_arange.md b/rfcs/CINN/APIs/20200802_cinn_api_design_arange.md index 32e04d48f..00c713eb9 100644 --- a/rfcs/CINN/APIs/20200802_cinn_api_design_arange.md +++ b/rfcs/CINN/APIs/20200802_cinn_api_design_arange.md @@ -20,10 +20,7 @@ step:步长 ,序列中相邻的两个元素的差值 ## 3、功能目标 实现`arange`算子。 算子输入起始 $start$ ,终点 $end$ ,以及步长 $step$ -算子输出序列 $(x_0,x_1,...,x_n)$ ,序列长度 $n=\left [ (start-end)/step \right ]$,且 $x_{i+1} - x_i = step$ $(0 \leqslant i < n)$ -1. 若 $start < end$ , $step>0$ ,序列满足 $start\leqslant x_0 < x_1 < ... < x_n < end$ -2. 若 $start > end$ , $step<0$ ,序列满足 $start\geqslant x_0 > x_1 > ... > x_n > end$ - +算子输出序列 $(x_0,x_1,...,x_n)$ ,序列长度 $n=\left [ (start-end)/step \right ]$,序列满足 $x0=start$ , $x_i < end$ $(0 \leqslant i \leqslant n)$ , $x_{j+1} - x_j = step$ $(0 \leqslant j < n)$ 算子的输入参数可能有异常情况,并且部分的参数可缺省,需考虑处理。 ## 4、意义 实现`arange`算子,将进一步CINN的基础算子库。 From 018771e089c105a016ef1c0a107cb2c762a9423f Mon Sep 17 00:00:00 2001 From: MayYouBeProsperous <99723454+MayYouBeProsperous@users.noreply.github.com> Date: Tue, 2 Aug 2022 18:49:53 +0800 Subject: [PATCH 04/10] Update 20200802_cinn_api_design_arange.md --- rfcs/CINN/APIs/20200802_cinn_api_design_arange.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rfcs/CINN/APIs/20200802_cinn_api_design_arange.md b/rfcs/CINN/APIs/20200802_cinn_api_design_arange.md index 00c713eb9..bf317da7a 100644 --- a/rfcs/CINN/APIs/20200802_cinn_api_design_arange.md +++ b/rfcs/CINN/APIs/20200802_cinn_api_design_arange.md @@ -20,8 +20,8 @@ step:步长 ,序列中相邻的两个元素的差值 ## 3、功能目标 实现`arange`算子。 算子输入起始 $start$ ,终点 $end$ ,以及步长 $step$ -算子输出序列 $(x_0,x_1,...,x_n)$ ,序列长度 $n=\left [ (start-end)/step \right ]$,序列满足 $x0=start$ , $x_i < end$ $(0 \leqslant i \leqslant n)$ , $x_{j+1} - x_j = step$ $(0 \leqslant j < n)$ -算子的输入参数可能有异常情况,并且部分的参数可缺省,需考虑处理。 +算子输出序列 $(x_0,x_1,...,x_n)$ ,序列长度 $n=\left [ (start-end)/step \right ]$,序列满足 $x_0=start$ , $x_{i+1} - x_i = step$ $(0 \leqslant i < n)$ +算子的输入参数可能有异常情况,并且部分输入参数可缺省,需考虑处理。 ## 4、意义 实现`arange`算子,将进一步CINN的基础算子库。 From 1dc7a9c2b7046b9dde958a8cbcd9c4201937b0a6 Mon Sep 17 00:00:00 2001 From: MayYouBeProsperous <99723454+MayYouBeProsperous@users.noreply.github.com> Date: Wed, 3 Aug 2022 12:46:28 +0800 Subject: [PATCH 05/10] Update 20200802_cinn_api_design_arange.md --- rfcs/CINN/APIs/20200802_cinn_api_design_arange.md | 1 + 1 file changed, 1 insertion(+) diff --git a/rfcs/CINN/APIs/20200802_cinn_api_design_arange.md b/rfcs/CINN/APIs/20200802_cinn_api_design_arange.md index bf317da7a..2fc6d276b 100644 --- a/rfcs/CINN/APIs/20200802_cinn_api_design_arange.md +++ b/rfcs/CINN/APIs/20200802_cinn_api_design_arange.md @@ -121,6 +121,7 @@ static xla::Literal Range(T start, T end, T step) { return xla::LiteralUtil::CreateR1(xla::util::Range(start, end, step)); } +//xla::util::Range template std::vector Range(T start, T end, T step = 1) { std::vector result; From f4967a380a5d3cb25f8d703ee0084207a8077219 Mon Sep 17 00:00:00 2001 From: MayYouBeProsperous <99723454+MayYouBeProsperous@users.noreply.github.com> Date: Fri, 5 Aug 2022 15:27:47 +0800 Subject: [PATCH 06/10] Update 20200802_cinn_api_design_arange.md --- rfcs/CINN/APIs/20200802_cinn_api_design_arange.md | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/rfcs/CINN/APIs/20200802_cinn_api_design_arange.md b/rfcs/CINN/APIs/20200802_cinn_api_design_arange.md index 2fc6d276b..2e2f33352 100644 --- a/rfcs/CINN/APIs/20200802_cinn_api_design_arange.md +++ b/rfcs/CINN/APIs/20200802_cinn_api_design_arange.md @@ -1,5 +1,5 @@ # CINN arange 设计文档 -|API名称 | 新增API名称 | +|API名称 | arange | |---|---| |提交作者 | MayYouBeProsperous | |提交时间 | 2022-08-02 | @@ -148,19 +148,22 @@ tvm与xla的arange实现方法基本类似。 start:区间起点(且区间包括此值),默认值为0。 end:区间终点(且通常区间不包括此值),默认值为None。 step:均匀分割的步长,默认值为1。 -dtype:输出`tensor`的数据类型,支持int32、int64、float32、float64。当该参数值为None时, 输出`tensor`的数据类型为int64。默认值为None。 +dtype:输出`tensor`的数据类型,支持int32、int64、float32、float64。默认值为float32。 +注:当仅提供一个数值参数时,该参数用于设置end,而start设置为默认值0。例如, +arange(5) = [0, 1, 2, 3, 4] + ## 底层OP设计 1. 在 `cinn/hlir/op/contrib/arange.h` 里声明`arange`算子。 2. 在 `cinn/hlir/op/contrib/arange.cc` 里实现`arange`算子和 `strategy`。 ## API实现方案 -1. 在 `cinn/frontend/base_build.h` 里声明 `BaseBuilder::Arange`。 -2. 在 `cinn/frontend/base_build.cc` 里实现 `BaseBuilder::Arange`。 -3. 在 `cinn/pybind/frontend` 对 Python 类 `BaseBuilder` 添加 `arange` 接口,并绑定到 `BaseBuilder::Arange`。 +1. 在 `cinn/frontend/net_build.h` 里声明 `NetBuilder::Arange`。 +2. 在 `cinn/frontend/net_build.cc` 里实现 `NetBuilder::Arange`。 +3. 在 `cinn/pybind/frontend` 对 Python 类 `NetBuilder` 添加 `arange` 接口,并绑定到 `NetBuilder::Arange`。 4. 上层 `load_paddle_model` 调用提交到 `cinn/frontend/paddle_model_to_program.h` 和 `.cc` 文件下。 python通过Builder类的方法调用`arange`。 ```python -builder = CinnBuilder("test_basic") +builder = NetBuilder("test_basic") b = builder.arange(1,10,1,"int32") ``` # 六、测试和验收的考量 From 8001cc3faa7d8f5a49eb13d92973529606a60281 Mon Sep 17 00:00:00 2001 From: MayYouBeProsperous <99723454+MayYouBeProsperous@users.noreply.github.com> Date: Fri, 5 Aug 2022 16:21:08 +0800 Subject: [PATCH 07/10] Update 20200802_cinn_api_design_arange.md --- rfcs/CINN/APIs/20200802_cinn_api_design_arange.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rfcs/CINN/APIs/20200802_cinn_api_design_arange.md b/rfcs/CINN/APIs/20200802_cinn_api_design_arange.md index 2e2f33352..7b5ae3384 100644 --- a/rfcs/CINN/APIs/20200802_cinn_api_design_arange.md +++ b/rfcs/CINN/APIs/20200802_cinn_api_design_arange.md @@ -23,7 +23,7 @@ step:步长 ,序列中相邻的两个元素的差值 算子输出序列 $(x_0,x_1,...,x_n)$ ,序列长度 $n=\left [ (start-end)/step \right ]$,序列满足 $x_0=start$ , $x_{i+1} - x_i = step$ $(0 \leqslant i < n)$ 算子的输入参数可能有异常情况,并且部分输入参数可缺省,需考虑处理。 ## 4、意义 -实现`arange`算子,将进一步CINN的基础算子库。 +实现`arange`算子,将进一步完善CINN的基础算子库。 # 二、CINN现状 CINN框架暂不支持`arange`算子,需要实现。 From 26a653ffd9c7840ff9f6b3954d1855345ef84bd5 Mon Sep 17 00:00:00 2001 From: MayYouBeProsperous <99723454+MayYouBeProsperous@users.noreply.github.com> Date: Sat, 6 Aug 2022 12:09:51 +0800 Subject: [PATCH 08/10] Update 20200802_cinn_api_design_arange.md --- rfcs/CINN/APIs/20200802_cinn_api_design_arange.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/rfcs/CINN/APIs/20200802_cinn_api_design_arange.md b/rfcs/CINN/APIs/20200802_cinn_api_design_arange.md index 7b5ae3384..9dc3fa8d4 100644 --- a/rfcs/CINN/APIs/20200802_cinn_api_design_arange.md +++ b/rfcs/CINN/APIs/20200802_cinn_api_design_arange.md @@ -179,4 +179,10 @@ b = builder.arange(1,10,1,"int32") 对其他模块无影响。 # 附件及参考资料 -[深度学习框架开发指南-飞桨黑客松3.0](https://aistudio.baidu.com/aistudio/course/introduce/26351?directly=1&shared=1) +[深度学习框架开发指南-飞桨黑客松3.0](https://aistudio.baidu.com/aistudio/course/introduce/26351?directly=1&shared=1) +[tvm的arange实现代码](https://github.com/apache/tvm/blob/111169c7df2831ab8ee40d5388ebcfcf551fd86f/include/tvm/topi/transform.h) +[xla的arange实现代码](https://github.com/pytorch/xla/blob/f72dcc655d8adbdef36e1f5c724a7dc8c2610fce/torch_xla/csrc/ops/ops.cpp) +[CINN IR抽象语法树](https://github.com/PaddlePaddle/CINN/pull/775) +[CINN项目贡献指南](https://github.com/PaddlePaddle/CINN/pull/810) +[CINN算子开发示例:pool2d_grad算子](https://github.com/PaddlePaddle/CINN/pull/858) +[CINN IR DSL在C++的matmul写法例子](https://github.com/PaddlePaddle/CINN/blob/develop/tutorials/matmul.cc) From f4f99d16e99b571ede8f0b8ab6412a209642da02 Mon Sep 17 00:00:00 2001 From: MayYouBeProsperous <99723454+MayYouBeProsperous@users.noreply.github.com> Date: Sat, 6 Aug 2022 12:12:34 +0800 Subject: [PATCH 09/10] Update 20200802_cinn_api_design_arange.md --- rfcs/CINN/APIs/20200802_cinn_api_design_arange.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/rfcs/CINN/APIs/20200802_cinn_api_design_arange.md b/rfcs/CINN/APIs/20200802_cinn_api_design_arange.md index 9dc3fa8d4..72e420c6d 100644 --- a/rfcs/CINN/APIs/20200802_cinn_api_design_arange.md +++ b/rfcs/CINN/APIs/20200802_cinn_api_design_arange.md @@ -179,10 +179,10 @@ b = builder.arange(1,10,1,"int32") 对其他模块无影响。 # 附件及参考资料 -[深度学习框架开发指南-飞桨黑客松3.0](https://aistudio.baidu.com/aistudio/course/introduce/26351?directly=1&shared=1) -[tvm的arange实现代码](https://github.com/apache/tvm/blob/111169c7df2831ab8ee40d5388ebcfcf551fd86f/include/tvm/topi/transform.h) -[xla的arange实现代码](https://github.com/pytorch/xla/blob/f72dcc655d8adbdef36e1f5c724a7dc8c2610fce/torch_xla/csrc/ops/ops.cpp) -[CINN IR抽象语法树](https://github.com/PaddlePaddle/CINN/pull/775) -[CINN项目贡献指南](https://github.com/PaddlePaddle/CINN/pull/810) -[CINN算子开发示例:pool2d_grad算子](https://github.com/PaddlePaddle/CINN/pull/858) -[CINN IR DSL在C++的matmul写法例子](https://github.com/PaddlePaddle/CINN/blob/develop/tutorials/matmul.cc) +1. [tvm的arange实现代码](https://github.com/apache/tvm/blob/111169c7df2831ab8ee40d5388ebcfcf551fd86f/include/tvm/topi/transform.h) +2. [xla的arange实现代码](https://github.com/pytorch/xla/blob/f72dcc655d8adbdef36e1f5c724a7dc8c2610fce/torch_xla/csrc/ops/ops.cpp) +3. [深度学习框架开发指南-飞桨黑客松3.0](https://aistudio.baidu.com/aistudio/course/introduce/26351?directly=1&shared=1) +4. [CINN项目贡献指南](https://github.com/PaddlePaddle/CINN/pull/810) +5. [CINN IR抽象语法树](https://github.com/PaddlePaddle/CINN/pull/775) +6. [CINN算子开发示例:pool2d_grad算子](https://github.com/PaddlePaddle/CINN/pull/858) +7. [CINN IR DSL在C++的matmul写法例子](https://github.com/PaddlePaddle/CINN/blob/develop/tutorials/matmul.cc) From 8cba15fbac42da6f54a710f4d2b88b592ac11307 Mon Sep 17 00:00:00 2001 From: MayYouBeProsperous <99723454+MayYouBeProsperous@users.noreply.github.com> Date: Wed, 10 Aug 2022 10:36:50 +0800 Subject: [PATCH 10/10] Update 20200802_cinn_api_design_arange.md --- rfcs/CINN/APIs/20200802_cinn_api_design_arange.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/rfcs/CINN/APIs/20200802_cinn_api_design_arange.md b/rfcs/CINN/APIs/20200802_cinn_api_design_arange.md index 72e420c6d..639407a87 100644 --- a/rfcs/CINN/APIs/20200802_cinn_api_design_arange.md +++ b/rfcs/CINN/APIs/20200802_cinn_api_design_arange.md @@ -19,8 +19,8 @@ step:步长 ,序列中相邻的两个元素的差值 ## 3、功能目标 实现`arange`算子。 -算子输入起始 $start$ ,终点 $end$ ,以及步长 $step$ -算子输出序列 $(x_0,x_1,...,x_n)$ ,序列长度 $n=\left [ (start-end)/step \right ]$,序列满足 $x_0=start$ , $x_{i+1} - x_i = step$ $(0 \leqslant i < n)$ +算子输入起始 $start$ ,终点 $stop$ ,以及步长 $step$ +算子输出序列 $(x_0,x_1,...,x_n)$ ,序列长度 $n=\left [ (start-stop)/step \right ]$,序列满足 $x_0=start$ , $x_{i+1} - x_i = step$ $(0 \leqslant i < n)$ 算子的输入参数可能有异常情况,并且部分输入参数可缺省,需考虑处理。 ## 4、意义 实现`arange`算子,将进一步完善CINN的基础算子库。 @@ -146,11 +146,9 @@ tvm与xla的arange实现方法基本类似。 ## 命名与参数设计 start:区间起点(且区间包括此值),默认值为0。 -end:区间终点(且通常区间不包括此值),默认值为None。 +stop:区间终点(且通常区间不包括此值)。 step:均匀分割的步长,默认值为1。 dtype:输出`tensor`的数据类型,支持int32、int64、float32、float64。默认值为float32。 -注:当仅提供一个数值参数时,该参数用于设置end,而start设置为默认值0。例如, -arange(5) = [0, 1, 2, 3, 4] ## 底层OP设计 1. 在 `cinn/hlir/op/contrib/arange.h` 里声明`arange`算子。