如何给无法修改的类增加一个父类?mlir某机制

server/2024/10/18 18:22:04/

一.从这个问题说起

如果我们使用了一个库,这个库的代码是无法修改的,其中包含一个类class A。

我们在代码中定义了一个类B,如何让A继承自我的写的B呢?

二.奇怪的代码 :

class Conv2dOp : public ::mlir::Op<Conv2dOp, ::mlir::OpTrait::ZeroRegions>

mlir中,当我们定义了一个Op,如Conv2d。通过tablegen,可以生成以上的代码。

上面的代码看上去比较奇怪,父类mlir::Op<>中有很多模板。

template <typename ConcreteType, template <typename T> class... Traits>

class Op : public OpState, public Traits<ConcreteType>... {

我们追溯一下,看看mlir::Op的定义。在Op的定义中,我们在子类(Conv2dOp中定义的Trait就变成了Op的父类)

通过这种模板的方式 , 我们将自己定义的类,传递到了mlir库中。 

mlir中的interface">三.mlir中的interface 

在了解了这个前置知识后, 我们来看一个更复杂的内容,mlir中的interface的实现

1.使用interface

td定义:

class Ka_Op<string mnemonic, list<Trait> traits = []> :

  Ka_BaseOp<mnemonic, !listconcat(traits,

    [DeclareOpInterfaceMethods<BackinferInterface>]

    )>;

使用:

if (auto bk = llvm::dyn_cast<BackinferInterface>(innerOp)) {

  bk.backinfer()

}

如上面所示, 当我们在td中定义一个Backinterface后,然后在op中”DeclareOpInterfaceMethods“在Op中,则可以在C++代码中将op转成BackinferInterface,并调用基接口

那么背后,mlir库为我们做了什么呢

2.Conv2d与Trait

class Conv2dOp : public ::mlir::Op<Conv2dOp, 省略很多, ::ka_compiler::BackinferInterface::Trait>

在”奇怪的代码“中我们讲过, 通过这种方式,Op可以继承自BackinferInterface::Trait

3.BackinferInterface::Trait的定义

class BackinferInterface : public ::mlir::OpInterface<BackinferInterface, detail::BackinferInterfaceInterfaceTraits> {

public:

  看这里---> struct Trait : public detail::BackinferInterfaceTrait<ConcreteOp> {};

  bool backinfer(llvm::DenseMap<mlir::Value, ka_compiler::RankedAxisData> & inputs, const llvm::DenseMap<mlir::Value, ka_compiler::RankedAxisData> & outputs);

};

可以看到Trait 继承自BackinferInterfaceTrait<ConcreteOp> 。我们再看BackinferInterfaceTrait<ConcreteOp> 的定义

4.BackinferInterfaceTraint<ConcreteOp>

struct BackinferInterfaceTrait : public ::mlir::OpInterface<BackinferInterface, detail::BackinferInterfaceInterfaceTraits>::Trait<ConcreteOp> {

};

可以看到BackinferInterfaceTrait 继承自OpInterface,并将BackinferInterface和通过模板的形式传递给了父类OpInterface

接下来看OpInterface

5.OpInterface

class OpInterface

    public detail::Interface<ConcreteType, Operation *, Traits,

                               Op<ConcreteType>, OpTrait::TraitBase> {

OpInterface继承自Interface,并将Op和Traint传递给了父类Interface

我们再看Interface

6.Interface

template <typename ConcreteType, typename ValueT, typename Traits,

          typename BaseType,

          template <typenametemplate <typenameclassclass BaseTrait>

class Interface : public BaseType {

可以看到Interface继承自BaseType ,而BaseType 则是由OpInterface的定义中传递 的Op<ConcreteType>,

ConcreteType也就是BackinferInterface 也就是说Interface最终继承了BackinferInterface 类

四。结论

以上追溯过程十分复杂,那么能不能简单理解 一下呢?

一个类,如果拥有了某种trait(继承),最终的结果是这个类将通过继承此Trait的方式获得Trait的能力


http://www.ppmy.cn/server/28041.html

相关文章

在UI界面中播放视频_unity基础开发教程

在UI界面中播放视频_unity基础开发教程 前言操作步骤结语 前言 之前我写过一篇在场景中播放视频的文章&#xff0c;但是在开发中有时候也会在UI的界面中播放视频&#xff0c;这期我们做一下在UI的界面中播放视频。 操作步骤 首先在场景中创建一个Raw Image&#xff0c;UI->…

微信小程序 - 登录(切屏后继续倒计时)

屏幕休眠或后台运行倒计时暂停问题 updateTime: function () {let promise new Promise((resolve, reject) > {var beginTime new Date().getTime();let setTimer setInterval(() > {var newTime new Date().getTime();var dTime (newTime - beginTime) / 1000;dTim…

【Qt之·路径获取】

系列文章目录 文章目录 前言一、使用相对路径1.1 相对路径1.2 绝对路径1.3 QDir类1.4 QFileDialog对话框 二、示例2.1 示例一 总结 前言 在进行Qt开发时&#xff0c;经常需要获取文件的路径&#xff0c;如图片、音频、配置文件等。路径的获取可以通过直接指定绝对路径或者使用相…

Ubuntu22.04安装freecad、ODAFileConverter

一、背景 作为程序界的萌新&#xff0c;不只写代码&#xff0c;还需要临危受命看看CAD图。 手上的一份CAD图是DWG格式的&#xff0c;先得找款看DWG格式文件的软件&#xff0c;很快找到了“CAD迷你看图”&#xff0c;这款软件直接傻瓜式安装&#xff0c;不是本文重点。 本文重…

【论文阅读】ESRT-Transformer for Single Image Super-Resolution

ESRT-Transformer for Single Image Super-Resolution 论文地址摘要1. 引言2.相关工作2.1 基于 CNN 的 SISR 模型2.2 Vision Transformer Transformer 3. Efficient Super-Resolution Transformer3.1. Lightweight CNN Backbone (LCB)3.2. High-frequency Filtering Module (HF…

RMQ从入门到精通

一.概述与安装 //RabbitMQ //1.核心部分-高级部分-集群部分 //2.什么是MQ 消息队列message queue 先入先出原则;消息通信服务 //3.MQ的大三功能 流量消峰 应用解耦 消息中间件 //&#xff08;1&#xff09;人-订单系统(1万次/S)—> 人 - MQ(流量消峰,对访问人员进行排队) -…

6.k8s中的secrets资源-初识secret

目录 一、Secret 二、创建secrets资源 1.创建工作目录 2.尝试使用base64进行编码 3.声明式创建secrets资源 4.响应式创建secret 三、pod引用secret资源 1.pod资源env环境变量引用 2.pod资源volume存储卷引用secret资源 3.pod资源清单指定key引用secret 四、secret类型…

安卓手机APP开发__媒体开发部分__立体环绕声

安卓手机APP开发__媒体开发部分__立体环绕声 目录 概述 对于能力的查询 耳机的跟踪 可兼容的内容 声音的属性 禁用立体环绕声的声音 声音的格式 对立体环绕声的修改的监听