【mindspore系列】- 算子源码分析

发布于:2025-05-24 ⋅ 阅读:(18) ⋅ 点赞:(0)

本文会介绍mindspore的算子源码结构、执行过程以及如何编写一个自定义的mindspore算子。

源码介绍

首先,我们先从https://gitee.com/mindspore/mindspore/ 官网中clone源代码下来。
clone好代码后,可以看到源码的文件夹结构如下(只列出比较重要的文件夹):

  • docs
  • mindspore
    • ccsrc
    • core
    • ops
    • python
  • tests

前端接口

在算子开发过程中,主要涉及这三个文件夹。
docs文件夹是所有mindspore API的接口文档,包括中英文接口文档。
tests文件夹是所有的测试代码,包括UT用例和ST用例等。
mindspore文件夹是重点关注对象,核心实现逻辑基本都在这个文件夹里。

mindspore文件夹里,有四个子文件夹。其中 python文件夹是前端的接口定义。
例如mindspore/python/mindspore/ops/function/array_func.py这个文件里定义了很多关于array相关的算子,譬如def min(xxx), def max(xxx) 等这些常见算子。
如果你仔细研究过这个文件夹,你会发现在这个文件夹下,有的函数有时候会被定义两次,但是他们所属的包路径却不一样。
例如包路径下有ops.min这个函数定义,同时还有mint.min这个函数的定义。
实际上,mindspore目前的有两套接口定义。例如:

import mindspore
from mindspore import ops, mint, Tensor

# ops下的接口
print(ops.max(Tensor([1,2,3]))

# mint下的接口
print(mint.max(Tensor([1,2,3])))

这两个的区别从官网上就能看出。之所有会搞两套接口定义,是因为mindspore前期是抄袭TensorFlow的架构和接口定义,因此细心的你能发现ops下的接口定义基本与Tensorflow的接口定义保持一致。但是随着Torch的火爆,越来越多的人在使用Torch,mindspore为了让这部分人无痛迁移脚本,就搞出来一套mint下的接口,简称 mindspore is not torch,翻译过来大概就是此地无银三百两吧。
目前ops和mint的关系:如果ops下的接口定义与Torch的定义一致,那么mint的接口会直接引用ops下的接口。如果不一致,则会新增xxx_ext接口,即增加后缀名以区分函数的方式来增加mint下的接口。

后端实现

mindspore.ops文件夹是算子具体的后端实现,


网站公告

今日签到

点亮在社区的每一天
去签到