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`算子。