如何用MLIR的OpBuilder创建常量向量?
用OpBuilder创建MLIR常量向量的正确方法
你之前的问题出在使用了错误的属性类型:getDenseF32ArrayAttr生成的是数组属性(ArrayAttr),而向量常量需要的是密集元素属性(DenseElementsAttr),同时必须显式指定向量类型。以下是正确的C++实现代码:
// 1. 定义目标向量类型:vector<3xf32> auto vecType = mlir::VectorType::get({3}, builder.getF32Type()); // 2. 创建对应元素值的密集元素属性 auto denseAttr = mlir::DenseElementsAttr::get( vecType, llvm::ArrayRef<float>{1.1f, 2.2f, 3.3f} ); // 3. 构建arith.constant操作 auto constantVecOp = builder.create<mlir::arith::ConstantOp>(loc, vecType, denseAttr);
关键说明:
VectorType::get用来构造向量类型,第一个参数是维度列表(这里是长度为3的一维向量),第二个参数是元素类型(f32)。DenseElementsAttr::get是生成密集元素属性的正确方式,它会将数值数组和目标向量类型绑定,生成符合MLIR要求的常量属性。- 调用
arith::ConstantOp时必须显式传入向量类型,而不是只传属性——之前的写法省略了类型参数,导致OpBuilder默认按标量处理。
这样生成的IR就是你需要的形式:
%1 = arith.constant dense<[1.100000e+00, 2.200000e+00, 3.300000e+00]> : vector<3xf32>
内容的提问来源于stack exchange,提问作者FlagerLee
相关产品推荐
相关产品推荐

