你好 👋

欢迎来看看

xmake折腾记录

😀 刚刚接触xmake,简单记录一下 xmake体验 一切从文档开始xmake 整个的安装以及使用流程比较丝滑 如何安装 curl -fsSL <https://xmake.io/shget.text> | bash 基础使用 创建新的工程 创建一个简单的hello world程序 xmake create -l c++ -P ./hello 创建之后的主要目录如下 hello ├── src │ └── main.c └── xmake.lua 运行程序 运行程序也比较简单,直接使用以下指令即可,相比cmake,入门路线缓和多了 # 构建工程 xmake # 运行程序 xmake run hello 单元测试 构建和运行都非常简单,在xmake中使用google test进行单元测试也很简单,如果本地没有gtest环境,可以使用下面介绍的xrepo进行安装,如果有的话也可以非常轻松的引入 在 xmake.lua 中加入以下内容,之后在 test 目录下编写单元测试的代码即可 add_requires("gtest", {system = true}) -- 告诉xmake在系统中查找gtest target("unitest") set_kind("binary") add_files("test/*.cpp") add_packages("gtest") -- 链接到gtest库 set_languages("c++17") 然后正常构建,也可以使用以下命令单独构建测试的部分 xmake build unitest 构建后通过以下命令进行单元测试 xmake run unitest 基于xrepo的包管理 在安装xmake之后,可以直接使用xrepo进行包管理,整个的编译流程如下图所示,关于xrepo详细的使用文档在快速上手 - xrepo 下面以安装并使用glog为例,简单描述一下使用流程 # 搜索相关的包 xrepo search glog # 安装,这里默认会安装在~/.xmake/packages目录下,可以通过xrepo fetch glog确认 xrepo install glog 在项目中引入该包,只需要在 xmake.lua 中加入以下内容即可 ...

December 4, 2024 · 1 min · 135 words · patrickhao

mini系列(一)minigrep

😀 一个使用rust实现的非常简单的grep 这块刚接触rust,基本照着https://github.com/sunface/rust-course中的示例在实现,感谢作者的rust教程 Intro 一个简单的rust工程构件和运行示例,rust环境的安装非常简单,这里贴一下rust文档以备不时之需。在安装rust之后, cargo 是一个比较常用的工具, cargo 是rust的包管理工具,可以方便快捷的构建和管理rust工程和项目。 这篇主要简单的记录一下初次构建和运行rust项目的过程,rust的相关语法在https://github.com/sunface/rust-course中介绍的非常详细,初步接触下来感觉生命周期是rust中比较复杂的内容,但是rust带来的内存安全的提升、好用便捷的包管理工具、相比golang优美的错误处理等都感觉非常不错,希望rust的生态可以快快起来🦀 创建minigrep 使用一下指令可以创建一个新的rust项目,rust项目包含两种,默认的是二进制可执行文件项目,在创建时加上选项 --lib 可以创建新的库项目,此时默认会带上单元测试部分的代码。 cargo new minigrep 项目的主要结构如下 Cargo.lock 用于锁定项目依赖的具体版本,确保构建的一致性 Cargo.toml 是项目的配置文件,用于管理项目依赖、元数据等 src/main.rs 则是二进制项目的入口点,定义了程序开始执行的 main 函数 . ├── Cargo.lock ├── Cargo.toml └── src └── main.rs 构建和运行项目可以使用一下指令 # 构建项目 cargo build # 运行项目 cargo run # 运行单元测试 cargo test 另外当工程比较大,编译比较耗时的时候,还可以使用以下工具(在写C++时一条make一杯咖啡的时代终于要远去了) # 快速检查代码能否通过编译 cargo check 单元测试 这里记录一下将单元测试与代码实现分开的办法,在项目目录下创建 tests 目录,为了比较方案的管理各个测试文件,可以创建 mod.rs 引入相关的测试模块。 pub mod test_minigrep; 在 tests 目录下创建 test_minigrep.rs 文件,用于组织minigrep相关的测试样例,然后使用 cargo 测试即可 #[cfg(test)] mod test { use minigrep::*; #[test] fn test_cast1() { // ... } }

December 4, 2024 · 1 min · 83 words · patrickhao

TVM系列(一)简单介绍

主要记录一下使用TVM的一般方法 背景简介 上面是TVM的主要工作流程 从主流框架导入模型,例如Tensorflow, PyTorch, onnx等 将其转为Relay,Relay是TVM的上层模型语言,是针对神经网络设计的函数语言和IR,其主要具有的特征 支持传统数据流形式的表达 Functional-style scoping 允许用户混合上述两种编程风格 转为Tensor Expression(TE),TE用纯函数式语言描述张量计算 使用auto-tuning module来搜索最好的schedule,shedule指定了Tensor Expression中对于一个算子或子图的底层循环优化,TVM支持两种auto-tuning module AutoTVM,基于模板的auto-tuning module,TVM提供了一系列模板 AutoScheduler(例如Ansor),无需模板的auto-tuning module,不需要预先定义的schedule模板,自动生成搜索空间 选择模型编译的最优配置,将tuning记录记录在json中,在这一步选择每个子图的最优schedule 将Tensor Expression(TE)转为Tensor Intermediate Representation(TIR),TVM的底层IR,使用底层优化pass优化TIR,然后将最终的代码放到可部署的后端上,主要包括以下的后端 LLVM NVCC, NVIDIA’s compiler 嵌入式和特殊平台 生成机器码 简单示例 这里以super_resolution为例,介绍一下tvm的导入onnx模型,并编译的过程,该网络结构简单,适合用来研究TVM的工作原理 准备模型 首先下载onnx模型,这里记录两种下载onnx模型的方法 通过download_testdata方法(会下载到~/.tvm_test_data目录下) 在github上的https://github.com/onnx/models有许多现成的onnx模型 from tvm.contrib.download import download_testdata model_url = "".join( [ "<https://gist.github.com/zhreshold/>", "bcda4716699ac97ea44f791c24310193/raw/", "93672b029103648953c4e5ad3ac3aadf346a4cdc/", "super_resolution_0.2.onnx", ] ) model_path = download_testdata( model_url, "super_resolution.onnx", module="onnx") 编译模型 最终会生成一个 .so 文件 import onnx import tvm import tvm.relay as relay model_path = "./super_resolution.onnx" onnx_model = onnx.load(model_path) shape_dict = {"1": (1, 1, 224, 224)} print(shape_dict) mod, params = relay.frontend.from_onnx(onnx_model, shape_dict) with tvm.transform.PassContext(opt_level=1): lib = relay.build(mod, target="llvm", params=params) lib.export_library("./super_resolution.so") 进行推理 使用其进行推理的过程也比较简单,下面的代码加载了上面编译得到的模型文件,并推理得到结果,比较核心的代码是中间那一段,最后放一个超分后的小猫图 ...

December 3, 2024 · 1 min · 202 words · patrickhao