当前位置: 首页 > news >正文

mlir 类型

构建

// **************************获取type类型*********************************auto i32_type = builder.getI32Type() // 获取int32类型auto tensor_type = // 获取<1x2xf64>的tensor类型mlir::RankedTensorType::get({1, 2},rewriter.getF64Type());auto tensor_noshapre_type = //获取<*xf64>的tensor类型mlir::UnrankedTensorType::get(rewriter.getF64Type());auto tcc_opaqueType = // 获取不透明体类型emitc::OpaqueType::get(builder.getContext(), "tcc_para");auto apply_res_type = // 获取指针类型emitc::PointerType::get(builder.getContext(), builder.getI32Type());// **************************data******************************************
// 构造APFloat类型的数据:①构造float类型数据;②套个llvm::APFloat()
float f_data = 1.0;
llvm::APFloat float_data = llvm::APFloat(f_data); // 构造StringRef类型数据:①构造string类型数据;②套个llvm::StringRef()
llvm::StringRef strref_data = llvm::StringRef("string"); // 构建ArrayRef<>类型数据:①构造个vector或数组; ②套个llvm::ArrayRef()
std::vector<double> vec_data{1.0, 2.0}; 
llvm::ArrayRef<double> array_data = llvm::ArrayRef(vec_data);
int64_t array_[2] = {1, 2};
llvm::ArrayRef<int64_t> array_data = llvm::ArrayRef(array_data);// 构建ValueRange类型数据
::mlir::ValueRange operands {}// *************************attr属性********************************************
auto str_attr = builder.getStringAttr("&"); // 获取str类型属性// 获取array类型属性 kernel_size = [32, 3, 3, 3]
int64_t array_[2] = {1, 2};
auto array_attr = builder.getI64ArrayAttr(llvm::ArrayRef(array_)); 
// 获取array类型属性
SmallVector<int32_t> everyOperandNumber(operandNums, 1);
auto operandSegmentSizesAttr = rewriter.getDenseI32ArrayAttr(everyOperandNumber);// 获取tensor类型的属性(一般是constantOp需要)value = dense<[[1.000000e+00, 2.000000e+00]]> 
auto tensor_type = // 获取<1x2xf64>的tensor类型mlir::RankedTensorType::get({1, 2},rewriter.getF64Type());
std::vector<double> data{1.0, 2.0}; 
auto array_data = llvm::ArrayRef(data);
auto tensor_Att = DenseElementsAttr::get(tensor_type, array_data);// 构建uint64_t attr
IntegerAttr::get(IntegerType::get(rewriter.getContext(), 64, IntegerType::Unsigned), group)// 构建NamedAttribute
rewriter.getNamedAttr("bias_value", rewriter.getF32FloatAttr(bias))

获取

int64_t group = op->getAttr("group").dyn_cast<IntegerAttr>().getSInt();int64_t strides[2];
strides[0] = op->getAttr("strides").dyn_cast<ArrayAttr>()[0].dyn_cast<IntegerAttr>().getInt();std::vector<mlir::Type> elementF64TensorTypes{mlir::UnrankedTensorType::get(builder.getF64Type()),mlir::UnrankedTensorType::get(builder.getF64Type())};auto struct_con_result_f64tensor_type =mlir::emitcext::StructType::get(elementF64TensorTypes);  ArrayRef<Attribute> f64_values{builder.getF64FloatAttr(1.0),builder.getF64FloatAttr(1.0)};auto f64TensorDataType = RankedTensorType::get({}, builder.getF64Type());auto f64DataAttribute = DenseElementsAttr::get(f64TensorDataType, f64_values);builder.create<mlir::emitcext::StructConstantOp>(op->getLoc(), struct_con_result_f64tensor_type, f64DataAttribute);

::mlir::Value operand
此operand指作为参数传入的op

  ::llvm::ArrayRef<::mlir::NamedAttribute> attributes_{};Operation* newOp = rewriter.replaceOpWithNewOp<emitc::CallOp>(op,TypeRange{},ValueRange{}, attributes_);

从operand/result获取其数据类型和shape cast之前要先get type

getOperands().back().getType().dyn_cast<RankedTensorType>().getShape()getResult(0).getType().dyn_cast<mlir::RankedTensorType>().getElementType()

构建结构体属性

// 创建标识符属性auto meshAttr = SymbolRefAttr::get(&context, "mesh0");// 创建仿射映射属性auto affineMap = builder.getAffineMap(1, 0, {});// 创建仿射映射属性auto affineMapAttr = AffineMapAttr::get(affineMap);// 创建一个 ArrayAttr,包含这两个属性SmallVector<Attribute, 2> shardMappingEntries = {meshAttr, affineMapAttr};auto shardMappingAttr = ArrayAttr::get(&context, shardMappingEntries);auto affineMapAttr = rewriter.getAffineMapArrayAttr({combinedMap});IntegerAttr intAttr1 = rewriter.getI64IntegerAttr(0);SmallVector<Attribute, 4> attrs = {affineMapAttr, intAttr1};auto arrayAttr = rewriter.getArrayAttr(attrs);arrayAttr.print(llvm::outs());

DictionaryAttr
构造

auto dictAttr = rewriter.getDictionaryAttr({{rewriter.getStringAttr(ttuLoopValueOp.getBaseAddrAttrName().str()),rewriter.getStringAttr(staticAndDynAddr.dynInputBaseAddrStr)}});u2uOp->setAttr(kDynamicValuesAttr, dictAttr);

获取

dynAttr = dyn_cast<DictionaryAttr>(u2uOp->getAttr(kDynamicValuesAttr));
if (auto valueAttr = dyn_cast<IntegerAttr>(dynAttr.get("batch"))) {batch = valueAttr.getInt();
}for (const auto &attr : transposeOutMemorySpace) {}memrefType
auto viewMemRefType = MemRefType::get(dynSizes, viewType.getElementType());

获取memref 或 tensor里的字典属性
getType()).getMemorySpace()
构造memref 或 tensor里的字典属性

MemRefType::get(allocShape, eleType, MemRefLayoutAttrInterface{},cast<MemRefType>(originOutAlloc->getResult(0).getType()).getMemorySpace());
http://www.dtcms.com/a/339065.html

相关文章:

  • docker 数据卷、自定义镜像操作演示分享(第二期)
  • 【数据结构】堆和二叉树详解(下)
  • SpringAI——向量存储(vector store)
  • SpringClound——网关、服务保护和分布式事务
  • Redis-缓存-击穿-分布式锁
  • 使用ros2跑mid360的fastlio2算法详细教程
  • 【数据结构】用堆解决TOPK问题
  • 算法训练营day56 图论⑥ 108. 109.冗余连接系列
  • C++---为什么迭代器常用auto类型?
  • 强、软、弱、虚引用
  • 在 Qt C++ 中利用 OpenCV 实现视频处理技术详解
  • 尝试Claude Code的安装
  • 学习笔记分享——基于STM32的平衡车项目
  • Mac调试ios的safari浏览器打开的页面
  • 电子电气架构 --- 软件项目成本估算
  • 技术攻坚全链铸盾 锁定12月济南第26届食品农产品安全高峰论坛
  • 任务十二 我的页面及添加歌曲功能开发
  • Typescript入门-对象讲解
  • Python量化交易:结合爬虫与TA-Lib技术指标分析
  • Matplotlib数据可视化实战:Matplotlib子图布局与管理入门
  • Ansible 角色管理指南
  • Pandas数据处理与分析实战:Pandas数据处理与Matplotlib可视化入门
  • 0819 使用IP多路复用实现TCP并发服务器
  • Tomcat 的核心脚本catalina.sh 和 startup.sh的关系
  • 陪诊小程序系统开发:开启智慧就医新时代
  • CNN 在故障诊断中的应用:原理、案例与优势
  • BEV:隐式相机视角转换-----BEVFormer
  • 简单实现监听redis的Key过期事件
  • Shopee本土店账号安全运营:规避封禁风险的多维策略
  • 微服务-08.微服务拆分-拆分商品服务