对于用户级应用软件编程接口types.h的部分注释
【摘要】 总体架构(先引入)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)