news 2026/5/25 9:57:30

mlir 编译器学习笔记之九 -- 后端生成

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
mlir 编译器学习笔记之九 -- 后端生成

方案1、在mlir中使用标准的emitc转换生成

EmitC 是 MLIR(Multi-Level Intermediate Representation)框架中的一个官方方言(Dialect),而不是一个独立的编程语言标准(如 C++11 或 C99 那样的标准),其中总体实现可以参数社区的现有实现方法:

populateSCFToEmitCConversionPatterns(patterns, converter);

populateHLCToEmitCConversionPatterns(patterns, converter);

populateArithToEmitCPatterns(converter, patterns);

populateConvertMathToEmitCPatterns(patterns, emitc::LanguageTarget::c99);

populateFuncToEmitCPatterns(converter, patterns);

对于结构体,比如OpCommHead.opType = TAU_TYPE表达

%424 = literal "TAU_TYPE" : !emitc.opaque<"BauOpType">

%429 = "emitc.variable"() <{value = #emitc.opaque<"{0}">}> : () -> !emitc.lvalue<!emitc.opaque<"OpCommHead">>

%431 = "emitc.member"(%429) <{member = "opType"}> : (!emitc.lvalue<!emitc.opaque<"OpCommHead">>) -> !emitc.lvalue<!emitc.opaque<"BauOpType">>

assign %424 : !emitc.opaque<"BauOpType"> to %431 : <!emitc.opaque<"BauOpType">>

方案2、直接将输出操作拼接,即依次直接导入数据流

1.1 基于方案1:结构体的处理可以转换多元素的依次处理。比如CommHead结构

// Convert CreateOpCommHeadPtrOp to "emitc::VariableOp" and "emitc::ApplyOp".
struct CreateOpCommHeadPtrOpConversion
: public OpConversionPattern<bau::CreateOpCommHeadPtrOp> {
using OpConversionPattern<bau::CreateOpCommHeadPtrOp>::OpConversionPattern;

LogicalResult
matchAndRewrite(bau::CreateOpCommHeadPtrOp configOp, OpAdaptor adaptor,
ConversionPatternRewriter &rewriter) const override {
auto getMemberInfo =
[&]() -> SmallVector<std::pair<StringRef, SmallVector<Value>>> {
return SmallVector<std::pair<StringRef, SmallVector<Value>>>{
{"wordBitmap", SmallVector<Value>{adaptor.getWordBitmap()}},
{"condEn", SmallVector<Value>{adaptor.getCondEn()}}};
};
return createStructOrUnionPtr<bau::CreateOpCommHeadPtrOp>(
configOp, rewriter, this->getTypeConverter(), getMemberInfo);
}
};

其中上面的文件也可以使用py生成,比如:

def generate_emitc_pattern(head_data):

f = open(EMITC_PATTERN_FILE, 'w', encoding='utf-8')

f.write(CLANG_OFF)

add_pattern_str = 'void ' + ADD_PATTERN_FUNC

add_pattern_str += '(RewritePatternSet &patterns, '

add_pattern_str += 'TypeConverter &typeConverter) {\n'

add_pattern_str += ' MLIRContext *ctx = patterns.getContext();\n'

for name, _ in utils.get_struct_and_union_asembly(head_data).items():

op_name = utils.get_create_op_name(name)

out_str = get_conversion_comment(op_name) + '\n'

out_str += (get_conversion_define(op_name) + '\n\n')

out_str += (get_conversion_main_func_def(op_name) + '\n')

out_str += (get_member_info_head() + '\n')

out_str += (get_member_convert_map(head_data, name, '', True) + '};\n')

out_str += ' };\n'

out_str += ' return createStructOrUnionPtr<bau::' + op_name + '>(\n'

out_str += ' configOp, rewriter, '

out_str += 'this->getTypeConverter(), getMemberInfo);\n'

out_str += ' }\n'

out_str += '};\n'

f.write(out_str)

f.write('\n')

add_pattern_str += (' patterns.add<' + get_conversion_name(op_name))

add_pattern_str += '>(typeConverter, ctx);\n'

add_pattern_str += '}\n'

f.write(add_pattern_str)

f.write(CLANG_ON)

print(f'Success generate {EMITC_PATTERN_FILE}')

1.2 基于方案1:call_opaqueverbatim的主要区别

call_opaque:专门用来调用 C/C++ 函数,生成格式固定、清晰的函数调用代码。

verbatim:一个“万能”的文本插入工具,可以生成任何 C/C++ 代码

注:call_opaque的参数只能是SSA 值(即其他操作的结果),不能是任意表达式,所以类似的内联emitc.call_opaque "MyFunc"(&%arg0, %arg1) : (!emitc.ptr<i32>, i32) -> ()不支持,需要改为emitc.verbatim "MyFunc(&{}, {});" args %arg0, %arg1

2、@declare_module 和 @define_module 被框架/工具链强制要求放在不同的逻辑模块(module)中,并且生成到不同的输出文件

@declare_module:头文件

@define_module:源文件

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/22 16:25:39

免费解锁B站4K高清视频:Python下载工具完整指南

免费解锁B站4K高清视频&#xff1a;Python下载工具完整指南 【免费下载链接】bilibili-downloader B站视频下载&#xff0c;支持下载大会员清晰度4K&#xff0c;持续更新中 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloader 还在为B站4K高清视频需要大…

作者头像 李华
网站建设 2026/5/22 16:23:32

3分钟实现智能字幕匹配:Subfinder自动化字幕下载完整指南

3分钟实现智能字幕匹配&#xff1a;Subfinder自动化字幕下载完整指南 【免费下载链接】subfinder 字幕查找器 项目地址: https://gitcode.com/gh_mirrors/subfi/subfinder 在影视内容消费日益增长的今天&#xff0c;字幕同步问题已成为影响观影体验的关键瓶颈。传统字幕…

作者头像 李华
网站建设 2026/5/22 16:21:23

TrollInstallerX 终极指南:如何在iOS 14-16.6.1上轻松安装TrollStore

TrollInstallerX 终极指南&#xff1a;如何在iOS 14-16.6.1上轻松安装TrollStore 【免费下载链接】TrollInstallerX A TrollStore installer for iOS 14.0 - 16.6.1 项目地址: https://gitcode.com/gh_mirrors/tr/TrollInstallerX 想要在iOS设备上安装TrollStore却不知从…

作者头像 李华
网站建设 2026/5/22 16:20:22

Python 四种推导式一网打尽:列表、集合、字典、生成器

推导式是 Python 独有的语法糖&#xff0c;能用一行代码代替好几行循环。 很多初学者看到 {n for n in nums if n%20} 这样的代码一脸懵。 这篇文章用一个例子讲透四种推导式&#xff0c;看完你也能写出优雅的 Python 代码。&#x1f4d8; 本期速览 四种推导式对比一览列表推导…

作者头像 李华