mlir learn
https://github.com/j2kun/mlir-tutorial
学习这个项目
https://www.jeremykun.com/2023/08/10/mlir-getting-started/
get start
用我的mac编译一下试试看
然后遇到架构不对的问题
因为他的提交默认是x86
https://github.com/j2kun/mlir-tutorial/pull/1/commits/5a267e269d579da0b4ee90f3c7452017fea1ec28#diff-5493ff8e9397811510e780de47c57abb70137f1afe85d1519130dc3679d60ce5
而我的是AARCH64,在这个链接可以看到所有的_LLVM_TARGETS
https://forums.gentoo.org/viewtopic-p-8776988.html?sid=12f4b13276660e37d4bfafa765d54ef3
然后就可以编译成功了
命令是
https://github.com/j2kun/mlir-tutorial.git
git reset --hard 60cfbe01804aa5c157d56a9fb9370521d18f5578
然后修改bazel/setup_llvm.bzl
里面的_LLVM_TARGETS改成AARCH64
bazel build @llvm-project//mlir:IR
bazel build @llvm-project//mlir/...:all
bazel run @llvm-project//mlir:mlir-opt -- --help
第二篇
// 定义一个函数 main,接收一个 i32 类型的参数 arg0,并返回一个 i32 类型的值
func.func @main(%arg0: i32) -> i32 {// 调用函数 my_ctlz,传递参数 arg0,返回值存储在 %0 中%0 = func.call @my_ctlz(%arg0) : (i32) -> i32// 返回 %0 作为结果func.return %0 : i32
}// 定义函数 my_ctlz,计算前导零的数量,接收一个 i32 类型的参数 arg0,并返回一个 i32 类型的值
func.func @my_ctlz(%arg0: i32) -> i32 {// 定义常量 32 和 0,都是 i32 类型%c32_i32 = arith.constant 32 : i32%c0_i32 = arith.constant 0 : i32// 比较 arg0 是否等于 0,结果存储在 %0 中%0 = arith.cmpi eq, %arg0, %c0_i32 : i32// 如果 arg0 等于 0,返回常量 32,表示 32 个前导零%1 = scf.if %0 -> (i32) {scf.yield %c32_i32 : i32} else {// 否则,进入循环逻辑// 定义一些常量:1 (index类型),1 (i32类型),32 (index类型),0 (i32类型)%c1 = arith.constant 1 : index%c1_i32 = arith.constant 1 : i32%c32 = arith.constant 32 : index%c0_i32_0 = arith.constant 0 : i32// 使用 for 循环,从 1 到 32,每次步进 1// 迭代参数为 %arg2 (初始值为 arg0),%arg3 (初始值为 0),返回 i32 和 i32 类型的结果%2:2 = scf.for %arg1 = %c1 to %c32 step %c1 iter_args(%arg2 = %arg0, %arg3 = %c0_i32_0) -> (i32, i32) {// 比较 arg2 是否为负数(即左移后是否变为负数)%3 = arith.cmpi slt, %arg2, %c0_i32 : i32// 如果 %arg2 为负数,终止循环并返回当前 %arg2 和 %arg3%4:2 = scf.if %3 -> (i32, i32) {scf.yield %arg2, %arg3 : i32, i32} else {// 否则,更新 %arg3(即前导零的数量加 1)%5 = arith.addi %arg3, %c1_i32 : i32// 同时将 %arg2 左移 1 位%6 = arith.shli %arg2, %c1_i32 : i32// 返回更新后的 %arg2 和 %arg3scf.yield %6, %5 : i32, i32}// 循环结束时,返回当前的 %arg2 和 %arg3scf.yield %4#0, %4#1 : i32, i32}// 返回前导零的计数,即循环中 %2#1 的值scf.yield %2#1 : i32}// 返回结果 %1func.return %1 : i32
}
这是ctlz的一个实现,是mlir-opt自动生成的,从
module {func.func @main(%arg0: i32) -> i32 {%0 = math.ctlz %arg0 : i32return %0 : i32}
}
生成的
git reset --hard 1b4cf45ca0f095c66fc22fd3adc8feaf2da67af2
不要用苹果电脑,会报x86的codegen错误
bazel安装还是挺简单的
只需要看这个https://ym9omojhd5.feishu.cn/wiki/Hrw0wazfCitLGgky6pfc8pMgnbg
软件包下这个https://mirrors.huaweicloud.com/bazel/6.2.1/bazel-6.2.1-linux-x86_64
chmod一下就可以食用了
然后export一下就可以快速使用
然后在mlir-tutorial下使用
bazel test //tests:all
或者
bazel test //tests:ctlz.mlir.test
搞了我好久才弄懂
如果把mlir-tutorial/tests/ctlz_simple.mlir
改成
// RUN: mlir-opt %s --convert-math-to-funcs=convert-ctlz | FileCheck %sfunc.func @main(%arg0: i32) -> i32 {// CHECK: call// CHECK: foo// CHECK: return%0 = math.ctlz %arg0 : i32func.return %0 : i32
}
再执行bazel test //tests:ctlz_simple.mlir.test
就会报错
ctlz_runner.mlir文件是对功能进行测试
// RUN: mlir-opt %s \
// RUN: -pass-pipeline="builtin.module( \
// RUN: convert-math-to-funcs{convert-ctlz}, \
// RUN: func.func(convert-scf-to-cf,convert-arith-to-llvm), \
// RUN: convert-func-to-llvm, \
// RUN: convert-cf-to-llvm, \
// RUN: reconcile-unrealized-casts)" \
// RUN: | mlir-cpu-runner -e test_7i32_to_29 -entry-point-result=i32 > %t
// RUN: FileCheck %s --check-prefix=CHECK_TEST_7i32_TO_29 < %tfunc.func @test_7i32_to_29() -> i32 {%arg = arith.constant 7 : i32%0 = math.ctlz %arg : i32func.return %0 : i32
}
// CHECK_TEST_7i32_TO_29: 29// RUN: mlir-opt %s \
// RUN: -pass-pipeline="builtin.module( \
// RUN: convert-math-to-funcs{convert-ctlz}, \
// RUN: func.func(convert-scf-to-cf,convert-arith-to-llvm), \
// RUN: convert-func-to-llvm, \
// RUN: convert-cf-to-llvm, \
// RUN: reconcile-unrealized-casts)" \
// RUN: | mlir-cpu-runner -e test_7i64_to_61 -entry-point-result=i64 > %t
// RUN: FileCheck %s --check-prefix=CHECK_TEST_7i64_TO_61 < %t
func.func @test_7i64_to_61() -> i64 {%arg = arith.constant 7 : i64%0 = math.ctlz %arg : i64func.return %0 : i64
}
// CHECK_TEST_7i64_TO_61: 61
这里的mlir经过了多级下降成为llvm,最后使用mlir-cpu-runner运行起来
里面测试了32位的7的ctlz的结果是29
64位的ctlz的7结果是61
相关文章:

mlir learn
https://github.com/j2kun/mlir-tutorial 学习这个项目 https://www.jeremykun.com/2023/08/10/mlir-getting-started/ get start 用我的mac编译一下试试看 然后遇到架构不对的问题 因为他的提交默认是x86 https://github.com/j2kun/mlir-tutorial/pull/1/commits/5a267e269d57…...

Windows安装RabbitMQ 4.0.2(图文教程)
本章教程,主要记录在Windows 10上RabbitMQ 4.0.2的安装过程。 一、下载安装包 1、官方下载(速度不稳定) Erlang:https://github.com/erlang/otp/releases/download/OTP-26.0/otp_win64_26.0.exe RabbitMQ 4.0.2:https://github.com/rabbitmq/rabbitmq-server/releases/do…...

分布式系统中为什么需要使用消息队列
本文转载自 linkedkeeper.com 消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能,成为异步RPC的主要手段之一。 当今市面上有很多主流的消息中间件,如老牌的ActiveMQ、RabbitMQ&#…...

Linux环境配置(学生适用)
1.挑选最便宜的云服务器 如腾讯云服务器,华为云服务器,百度云服务器等等…… 2.找到你的云服务器实例,然后找到你的公网IP。 3.云服务器实例 ---更多 --- 重置root密码 (一定要重置) 4. 下载并安装 xshell 或者其他登陆软件 xshel…...

麦禾软件:Mac用户找免费开源工具的最佳选择
抖知书老师推荐: 麦禾软件已经成为众多Mac用户的必备平台,尤其对于那些经常寻找免费、开源、正版软件的用户来说,绝对是一个福音。随着科技的不断进步和用户需求的提升,安全、便捷的软件下载体验成为用户选择平台的核心标准。而…...

OpenCV4.8 开发实战系列专栏之 08 - 通道分离与合并
大家好,欢迎大家学习OpenCV4.8 开发实战专栏,长期更新,不断分享源码。 专栏代码全部基于C 与Python双语演示,专栏答疑群 请联系微信 OpenCVXueTang_Asst 本文关键知识点: OpenCV中默认imread函数加载图像文件&#…...

iOS 18.1 RC 版本发布,修复iPhone16随机重启、浏览视频卡顿等bug
今日,苹果发布 iOS 18.1 RC 版本升级,内部版本号为 22B82。 iOS 18.1 RC 也就是 iOS 18.1 准正式版,如果没有大的 Bug,这将是 iOS 18.1 正式版发布前最后一次更新,正式版预计下周向消费者推送。 该 RC 版除了为海外用…...

安装buildkit,并使用buildkit构建containerd镜像
背景 因为K8s抛弃Docker了,所以就只装了个containerd,这样就需要一个单独的镜像构建工具了,就用了buildkit,这也是Docker公司扶持的,他们公司的人出来搞的开源工具,官网在 https://github.com/moby/buildkit 简介 服务端为buildkitd,负责和runc或containerd后端连接干活,目前…...

maven jar包二进制文件 invalid stream header: EFBFBDEF 的错误
背景: 将jasper模板文件导入jar包后,生成文件报错 org.springframework.core.io.Resource resource new ClassPathResource("/template/XXXX.jasper");jasperPrint JasperFillManager.fillReport(resource.getInputStream(), paramentMap, …...

Git绑定Gitee或Github以及Git面试常见题
1.绑定Git或Gitee Git绑定Gitee或GitHub的过程相对简单,以下是详细的步骤说明: 一、绑定Gitee仓库 在Gitee上创建仓库 登录Gitee官网,点击首页右上角的“”号,选择“新建仓库”。在新建仓库页面,输入仓库的名称、描述…...

值得细读的8个视觉大模型生成式预训练方法
写在前面 大语言模型的进展催生出了ChatGPT这样的应用,让大家对“第四次工业革命”和“AGI”的来临有了一些期待,也作为部分原因共同造就了美股2023年的繁荣。LLM和视觉的结合也越来越多:比如把LLM作为一种通用的接口,把视觉特征…...

go 包相关知识
在Go语言中,包的引用和搜索路径是由环境变量GOPATH和GO111MODULE共同决定的。 GOPATH环境变量:这个变量定义了默认的工作目录,Go命令行工具将会在这个目录下查找包文件。这个目录通常包含三个子目录:src、bin和pkg。 src目录包含…...

机器学习:opencv--人脸检测以及微笑检测
目录 前言 一、人脸检测的原理 1.特征提取 2.分类器 二、代码实现 1.图片预处理 2.加载分类器 3.进行人脸识别 4.标注人脸及显示 三、微笑检测 前言 人脸检测是计算机视觉中的一个重要任务,旨在自动识别图像或视频中的人脸。它可以用于多种应用࿰…...

linux系统挂载硬盘
参考链接:https://www.cnblogs.com/wenhainan/p/12292823.html (1)lsblk命令查看磁盘挂载情况 (2)使用fdisk分区新磁盘 如果要分多个分区需指定每个分区的大小 (3)格式化新分区 mkfs命令格…...

MySQL实现主从同步
一、首先我们准备3台mysql 分别为: 主服务器:test-mysql-master,端口3306 从服务器:test-mysql-slave1,端口3307 从服务器:test-mysql-slave2,端口3308 注意:如果防火墙是开着的记得把关掉,并且重启docker…...

人工智能--数学基础
目录 编辑2.1 线性代数基础 2.2 微积分及优化理论 2.3 概率论与统计学 2.4 信息论简介 2.1 线性代数基础 线性代数是处理向量空间(包括有限维或无限维)以及这些空间上的线性映射的一门数学分支。在线性代数中,最核心的概念包括向量、矩…...

2024人工智能技术的普及 如何看待AI技术的应用前景
AI 技术的应用前景十分广阔,但也面临着一些挑战,以下是对其应用前景的一些看法: 积极方面: 多行业深度融合与效率提升5: 医疗领域:AI 在医疗影像分析、辅助诊断、疾病预测等方面具有巨大潜力。例如…...

日常记录:springboot 2.2.5 + es 6.8.12
前言 最近有用到搜索引擎的功能,这不得把之前的es过程实践一遍,但发现过程坎坷,因为版本太低了。 一、安装es 6.8.12 安装过程跟之前写那章日常记录:elasticsearch 在linux安装_elasticsearch linux安装-CSDN博客一样࿰…...

MySQL数据库备份与恢复详解
文章目录 一、为什么需要备份数据库?二、MySQL数据库的备份方式1. 逻辑备份2. 物理备份3. 二进制日志备份 三、恢复数据库1. 使用mysqldump备份文件恢复2. 使用物理备份恢复3. 使用二进制日志恢复 四、备份与恢复的最佳实践五、结语 在日常的数据库运维中࿰…...

10.22 MySQL
存储过程 存储函数 存储函数是有返回值的存储过程,存储函数的参数只能是in类型的。具体语法如下: characteristic 特性 练习: 从1到n的累加 create function fun1(n int) returns int deterministic begindeclare total i…...

「AIGC」n8n AI Agent开源的工作流自动化工具
n8n AI Agent 是一个利用大型语言模型(LLMs)来设计和构建智能体(agents)的工具,这些智能体能够执行一系列复杂的任务,如理解指令、模仿类人推理,以及从用户命令中理解隐含意图。n8n AI Agent 的核心在于构建一系列提示(prompts),使 LLM 能够模拟自主行为。 传送门→ …...

Android 中获取和读取短信验证码
方法一:通过 SMS Retriever API SMS Retriever API 是 Google 提供的一种安全的方式,可以从系统中获取不需要权限的短信验证码。这种方式不需要请求 READ_SMS 权限,非常适合处理短信验证码的情况。 1. 在 build.gradle 中添加依赖 dependen…...

SQL语句高级查询(适用于新手)
SQL查询语句的下载脚本链接!!! 【免费】SQL练习资源-具体练习操作可以查看我发布的文章资源-CSDN文库https://download.csdn.net/download/Z0412_J0103/89908378 本文旨在为那些编程基础相对薄弱的朋友们提供一份详尽的指南,特别聚…...

main.ts中引入App.vue报错,提示“Cannot find module ‘./App.vue’ or its corresponding type
原因 代码编辑器:vscode ,使用vue3,所以安装了 Volar 插件,可以使 vue 代码高亮显示,不同颜色区分代码块,以及语法错误提示等 提示:如果使用的是vue2,则使用 Vetur 插件࿱…...

Android15音频进阶之组音量调试(九十)
简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【原创干货持续更新中……】🚀 优质视频课程:AAOS车载系统+…...

【Java】常用方法合集
以 DemoVo 为实体 import lombok.Data; import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;Data ExcelIgnoreUnannotated public class ExportPromoteUnitResult {private String id;ExcelProperty(value &qu…...

深入了解Vue Router:基本用法、重定向、动态路由与路由守卫的性能优化
文章目录 1. 引言2. Vue Router的基本用法2.1 基本配置 3. 重定向和命名路由的使用3.1 重定向3.2 命名路由 4. 在Vue Router中如何处理动态路由4.1 动态路由的概念4.2 如何处理动态路由4.3 动态路由的懒加载 5. 路由守卫的实现与性能影响5.1 什么是路由守卫?5.2 路由…...

深入理解InnoDB底层原理:从数据结构到逻辑架构
💡 无论你是刚刚踏入编程世界的新人,还是希望进一步提升自己的资深开发者,在这里都能找到适合你的内容。我们共同探讨技术难题,一起进步,携手度过互联网行业的每一个挑战。 📣 如果你觉得我的文章对你有帮助,请不要吝啬你的点赞👍分享💕和评论哦! 让我们一起打造…...

Linux介绍及操作命令
Linux 是一种开源的操作系统,具有以下特点和优势: 一、稳定性和可靠性 内核稳定 Linux 内核经过多年的发展和优化,具有高度的稳定性。它能够长时间运行而不出现崩溃或故障,适用于服务器和关键任务应用。内核的稳定性得益于其严格的开发流程和质量控制,以及全球开发者社区…...

JS | 详解图片懒加载的6种实现方案
一、什么是懒加载? 懒加载是一种对网页性能优化的方式,比如,当访问一个网页的时候,优先显示可视区域的图片而不是一次加载全部的图片,当需要显示时,再发送请求加载图片。 懒加载 :延迟加载&…...