You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 15:23:15