对于用户级应用软件编程接口types.h的部分注释

举报
颜文军 发表于 2021/10/31 17:53:13 2021/10/31
【摘要】 总体架构(先引入)API 是用于构建应用程序软件的一组子程序定义,协议和工具。简单点就是一套明确定义的各种软件组件之间的通信方法。能够实现轻松的和其他软件组件(如服务器,操作系统等)的交互。这大大节省了run的时间,同时提高了代码run的效率。MindSpore是一个全场景深度学习框架,旨在实现易开发、高效执行、全场景覆盖三大目标,其中易开发表现为API友好、调试难度低,高效执行包括计算效率...

总体架构(先引入)
API 是用于构建应用程序软件的一组子程序定义,协议和工具。简单点就是一套明确定义的各种软件组件之间的通信方法。能够实现轻松的和其他软件组件(如服务器,操作系统等)的交互。这大大节省了run的时间,同时提高了代码run的效率。
MindSpore是一个全场景深度学习框架,旨在实现易开发、高效执行、全场景覆盖三大目标,其中易开发表现为API友好、调试难度低,高效执行包括计算效率、数据预处理效率和分布式训练效率,全场景则指框架同时支持云、边缘以及端侧场景。
对于深度学习而言,数据的特点和对数据的处理是其中非常重要的一环。MindData是MindSpore中数据处理与数据增强的模块,api是MindSpore的外接口,即用户级应用软件编程接口。用于科学计算以及构建和训练神经网络,并将用户的Python代码转换为数据流图。MindSpore提供的API支撑用户进行网络构建、整图执行、子图执行以及单算子执,自动建立代价模型,为用户选择一种较优的并行模式,提高神经网络训练效率,大大降低了AI开发门槛,使用户能够快速实现模型思路。
知识浅薄,还有许多未理解之处,欢迎各位纠正、讨论。
路径:mindspore/include/api/types.h

Type 是mindspore api中所有类型的公共高级接口。它们包括原始类型、参数化类型、数组类型、类型变量和基本类型。
//在头文件中使用#ifdef和#ifndef可以防止双重定义的错误
#ifndef MINDSPORE_INCLUDE_API_TYPES_H//判断宏是否被定义,若已定义,执行随后的语句
#define MINDSPORE_INCLUDE_API_TYPES_H//定义一个预处理宏 INDSPORE_INCLUDE_API_TYPES_H

//导入系统文件或者是自定义文件:
#include <cstddef>//C头文件<stddef.h>较新版本,定义了常用的常量、宏、类型和函数
#include <string>//导入标准库中的字符串类和相关操作,导入后才能使用string类
#include <vector>//导入操作多种数据结构和算法的模板类和函数库
#include <memory>//包含多个智能指针1 auto_ptr 2 unique_ptr 3std::shared_ptr
/*1.auto_ptr
C++的auto_ptr所做的事情,就是动态分配对象以及当对象不再需要时自动执行清理。使用std::auto_ptr,要#include <memory>。
2 unique_ptr
unique_ptr是一种定义在<memory>中的智能指针(smart
pointer)。它持有对对象的独有权——两个unique_ptr不能指向一个对象,不能进行复制操作只能进行移动操作。unique_ptr在超出作用域,即以下情况时它指向的对象会被摧毁:
指向的对象被破坏
*/
#include "include/api/data_type.h"//在当前目录下寻找 引入自己的头文件 下同
#include "include/api/dual_abi_helper.h"

#ifdef _WIN32//提供了一种抽象机制,使代码可以在不同平台间移植.
//ifdef 判断某个宏是否被定义,若已定义,执行随后的语句
#define MS_API __declspec(dllexport)//宏定义MS_API为一种外接属性,用于动态库中
#else//与#if, #ifdef, #ifndef对应, 若这些条件不满足,则执行#else之后的语句,相当于C语法中的else
#define MS_API __attribute__((visibility("default")))//避免因调用函数的动态链接库混乱
//提高程序的模块性 default用它定义的符号将被导出,动态库中的函数默认是可见的
#endif//#if, #ifdef, #ifndef这些条件命令的结束标志

// 资源前置声明
namespace mindspore {
	//声明和定义枚举:
enum ModelType : uint32_t {//建立新的数据类型uint32_t
  kMindIR = 0,
  kAIR = 1,
  kOM = 2,
  kONNX = 3,
  // insert new data type here
  =
};

// 用于解析python代码的命名空间类MSTensor
class MS_API MSTensor {//声明MSTensor为对外接口类 (动态链接)
 public:
  class Impl;
  //带std::string的api
  static inline MSTensor *CreateTensor(const std::string &name, DataType type, const std::vector<int64_t> &shape,
                                       const void *data, size_t data_len) noexcept;
                                       
  static inline MSTensor *CreateRefTensor(const std::string &name, DataType type, const std::vector<int64_t> &shape,
                                          const void *data, size_t data_len) noexcept;
  static inline MSTensor *CreateDevTensor(const std::string &name, DataType type, const std::vector<int64_t> &shape,
                                          const void *data, size_t data_len) noexcept;
  static inline MSTensor *StringsToTensor(const std::string &name, const std::vector<std::string> &str);
  //函数static inline MSTensor *StringsToTensor(const std::string &name, const std::vector<std::string> &str)功能与其函数名一样将String类型转化
  为张量。
  static inline std::vector<std::string> TensorToStrings(const MSTensor &tensor);
  static void DestroyTensorPtr(MSTensor *tensor) noexcept;
  // 函数static void DestroyTensorPtr(MSTensor *tensor)功能为销毁一个张量。
  //noexcept:在声明函数时使用,告诉编译器,函数中不会发生异常,有利于编译器对程序做出更多的优化,若noexcept函数向外抛出了异常,程序会直接终止。

/*
	函数CreateTensor,CreateRefTensor,CreateDevTensor中的参数都为(const std::string &name, DataType type, const std::vector<int64_t> &shape,
    const void *data, size_t data_len),三个函数的功能的都是创建一个张量,参数:name自然是张量的名字,DataType是头文件"include/api/data_type.h"
  中声明的枚举类型,shape是张量的形状,void *data为一个函数,data_len为记录data大小的数据类型。
 */

  MSTensor();//不带参数的构造函数
  explicit MSTensor(const std::shared_ptr<Impl> &impl);
//explicit:作用于类内部的构造函数声明上,一般用于单个参数的构造函数的声明,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换。
  inline MSTensor(const std::string &name, DataType type, const std::vector<int64_t> &shape, const void *data,
                  size_t data_len);//std::shared_ptr对象:一种智能指针,它足够智能,可以在任何地方都不使用时自动删除相关指针,从而帮助彻底消除内存泄漏和悬空指针的问题。
  explicit MSTensor(std::nullptr_t);
  ~MSTensor();//析构函数,当对象脱离其作用域时,系统自动执行析构函数

  inline std::string Name() const;//inline函数代码被放入符号调用表,使用时直接展开,不需要调用,即在编译期间将所调用的函数的代码直接嵌入到主调函数中,是一种以空间换时间的函数。
  enum DataType DataType() const;// 枚举数据类型
  const std::vector<int64_t> &Shape() const;//引入定义vector的与int64_t相关成员函数和操作 并宏替换
  int64_t ElementNum() const;//类型替换

  std::shared_ptr<const void> Data() const;//智能指针 内存管理和引用计数
  void *MutableData();//可变数据函数
  size_t DataSize() const;//size_t可以提高程序的可移植性和代码的可读性,让程序更高效

  bool IsDevice() const;

  MSTensor *Clone() const;
  //智能指针的句柄类
  bool operator==(std::nullptr_t) const;//将指针封装起来。然后,重载操作符,定义为一个指针的行为,使得可以像使用指针一样使用它。
  bool operator!=(std::nullptr_t) const;

 private://修饰成员变量和成员 被private修饰的成员只能在本类中访问。


 	// 模块的命名空间
  // api without std::string
  static MSTensor *CreateTensor(const std::vector<char> &name, enum DataType type, const std::vector<int64_t> &shape,
                                const void *data, size_t data_len) noexcept;
								//创建张量
  static MSTensor *CreateRefTensor(const std::vector<char> &name, enum DataType type, const std::vector<int64_t> &shape,
                                   const void *data, size_t data_len) noexcept;
								   //创建参照张量
  static MSTensor *CreateDevTensor(const std::vector<char> &name, enum DataType type, const std::vector<int64_t> &shape,
                                   const void *data, size_t data_len) noexcept;
								   //创建Dev张量
  static MSTensor *CharStringsToTensor(const std::vector<char> &name, const std::vector<std::vector<char>> &str);
//字符字符串张量
  static std::vector<std::vector<char>> TensorToStringChars(const MSTensor &tensor);

  MSTensor(const std::vector<char> &name, enum DataType type, const std::vector<int64_t> &shape, const void *data,
           size_t data_len);
	// 命名空间对象
  std::vector<char> CharName() const;//引入定义vector的与char相关成员函数和操作 并宏替换

  friend class ModelImpl;//声明友元类ModelImp1,它可以访问MSTensor类中的private函数
  std::shared_ptr<Impl> impl_;//命名限定
};

// 用于解析python代码的命名空间类Buffer缓冲数据区 暂存起来 偏重于写
// 解决CPU与内存之间速度不匹配的问题,避免内存与辅助内存频繁存取数据,这样就提高了系统的执行效率。
class MS_API Buffer {
 public:
  Buffer();//引入缓冲区 Buffer的核心作用是用来缓冲,缓和冲击。
  Buffer(const void *data, size_t data_len);//定义缓冲区数据类型
  ~Buffer();

  const void *Data() const;// 声明了一个指向常量的  常量指针 ; 指的是(*a)取出来的数是常量,而a本身是常量(const a)。
  void *MutableData();// 可变数据函数
  size_t DataSize() const;//size_t可以提高程序的可移植性和代码的可读性,让程序更高效

  bool ResizeData(size_t data_len);//判断是否ResizeData
  bool SetData(const void *data, size_t data_len);//判断是否SetData

  Buffer Clone() const;//实现拷贝构造函数

 private:
 	// 模块的命名空间
  class Impl;
  std::shared_ptr<Impl> impl_;
	// 命名空间对象
};

MSTensor *MSTensor::CreateTensor(const std::string &name, enum DataType type, const std::vector<int64_t> &shape,//创造张量
                                 const void *data, size_t data_len) noexcept {
  return CreateTensor(StringToChar(name), type, shape, data, data_len);
}

MSTensor *MSTensor::CreateRefTensor(const std::string &name, enum DataType type, const std::vector<int64_t> &shape,
                                    const void *data, size_t data_len) noexcept {
									//创建参照张量
  return CreateRefTensor(StringToChar(name), type, shape, data, data_len);
}

MSTensor *MSTensor::CreateDevTensor(const std::string &name, enum DataType type, const std::vector<int64_t> &shape,
                                    const void *data, size_t data_len) noexcept {
									//创建dev张量
  return CreateDevTensor(StringToChar(name), type, shape, data, data_len);
}

MSTensor *MSTensor::StringsToTensor(const std::string &name, const std::vector<std::string> &str) {
//创建字符串张量
  return CharStringsToTensor(StringToChar(name), VectorStringToChar(str));
}

//VectorStringToChar()函数将类MSTensor中的函数中包含std::string的参数转化为包含char类型的参数,
std::vector<std::string> MSTensor::TensorToStrings(const MSTensor &tensor) {
  return VectorCharToString(TensorToStringChars(tensor));
}

MSTensor::MSTensor(const std::string &name, enum DataType type, const std::vector<int64_t> &shape, const void *data,
                   size_t data_len)
    : MSTensor(StringToChar(name), type, shape, data, data_len) {}
//TensorToStringChars()函数将TensorToStrings(const MSTensor &tensor)
中的参数转化为stringchar形。最终返回带有新参数的函数。

/*定义在类MSTensor中声明过的函数,调用#include"include/api/dual_abi_helper.h"头文件中的 StringToChar(),*/
std::string MSTensor::Name() const { return CharToString(CharName()); }
}  // namespace mindspore
#endif  // MINDSPORE_INCLUDE_API_TYPES_H

以上即为本篇的所有内容,因学识与能力有限,如有不足之处,请多多包涵与指教!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。