diff --git a/paddle/infrt/dialect/phi/ir/infrt_phi_tensor.td b/paddle/infrt/dialect/phi/ir/infrt_phi_tensor.td index 9df9abe18cbf09b2e521383272e7e758491a2ed3..dbf3b8533073c0e4162512ea67645bd23bc83434 100644 --- a/paddle/infrt/dialect/phi/ir/infrt_phi_tensor.td +++ b/paddle/infrt/dialect/phi/ir/infrt_phi_tensor.td @@ -28,6 +28,13 @@ class CreateDenseTensorOp let results = (outs DenseTensor:$output); } +def CreateInitedCpuFLOAT32DenseTensorOp + : PDT_Op<"create_inited_dense_tensor.cpu.f32", [NoSideEffect]> { + let arguments = (ins Context:$context, I64ArrayAttr:$dims, + LayoutAttr:$layout, I64ArrayAttr:$lod, F32Attr:$value); + let results = (outs DenseTensor:$output); +} + class FillDenseTensorOp : PDT_Op<"fill_dense_tensor." # dtype> { let arguments = (ins diff --git a/paddle/infrt/kernel/phi/context_kernels.cc b/paddle/infrt/kernel/phi/context_kernels.cc index f38a11077165c8368920f1b328e74c600c24f8d7..23d96aeb8d5e51d2f1ce8a3a834d31085c71a973 100644 --- a/paddle/infrt/kernel/phi/context_kernels.cc +++ b/paddle/infrt/kernel/phi/context_kernels.cc @@ -21,7 +21,10 @@ namespace phi { ::phi::CPUContext CreateCPUContext() { ::phi::CPUContext ctx{}; ctx.Init(); - ctx.SetAllocator(new backends::CpuPhiAllocator{}); + auto allocator = new backends::CpuPhiAllocator{}; + ctx.SetAllocator(allocator); + ctx.SetHostAllocator(allocator); + ctx.SetZeroAllocator(allocator); return ctx; } diff --git a/paddle/infrt/kernel/phi/dense_tensor_kernels.cc b/paddle/infrt/kernel/phi/dense_tensor_kernels.cc index 66698d36b5504cfce8a0b50aefaf36cada730dfe..26048a43f99804c7166a9ecfbf845b7cd50c79bf 100644 --- a/paddle/infrt/kernel/phi/dense_tensor_kernels.cc +++ b/paddle/infrt/kernel/phi/dense_tensor_kernels.cc @@ -56,6 +56,26 @@ namespace phi { {})); } +::phi::DenseTensor CreateInitedDenseTensorF32( + const ::phi::CPUContext& context, + host_context::Attribute> dims, + host_context::Attribute> lod, + host_context::Attribute<::infrt::LayoutType> layout, + host_context::Attribute value) { + ::phi::DenseTensor dense_tensor( + const_cast<::phi::Allocator*>(&context.GetAllocator()), + ::phi::DenseTensorMeta( + ConvertPrecisionToPhi(::infrt::PrecisionType::FLOAT32), + ::phi::make_ddim(dims.get()), + ConvertLayoutToPhi(layout.get()), + {})); + float* a_data = dense_tensor.mutable_data(::phi::CPUPlace()); + for (int64_t i = 0; i < dense_tensor.numel(); ++i) { + a_data[i] = value.get(); + } + return dense_tensor; +} + ::phi::DenseTensor CreateGPUDenseTensor( const ::phi::GPUContext& context, host_context::Attribute> dims, diff --git a/paddle/infrt/kernel/phi/dense_tensor_kernels.h b/paddle/infrt/kernel/phi/dense_tensor_kernels.h index 75eab19396fb413b222b1259982b1e1af9b62311..2d0698eb59752ba476eec49d4f6b80806f0e1ef4 100644 --- a/paddle/infrt/kernel/phi/dense_tensor_kernels.h +++ b/paddle/infrt/kernel/phi/dense_tensor_kernels.h @@ -32,6 +32,13 @@ namespace phi { host_context::Attribute<::infrt::LayoutType> layout, host_context::Attribute<::infrt::PrecisionType> precision); +::phi::DenseTensor CreateInitedDenseTensorF32( + const ::phi::CPUContext& context, + host_context::Attribute> dims, + host_context::Attribute> lod, + host_context::Attribute<::infrt::LayoutType> layout, + host_context::Attribute value); + ::phi::DenseTensor CreateGPUDenseTensor( const ::phi::GPUContext& context, host_context::Attribute> dims, diff --git a/paddle/infrt/kernel/phi/registry.cc b/paddle/infrt/kernel/phi/registry.cc index 3b437a439fc3f34cc8987202958aa568703ce9c6..0427a2c1e599854e3ad9cdcc2942b1ba27a5ab9e 100644 --- a/paddle/infrt/kernel/phi/registry.cc +++ b/paddle/infrt/kernel/phi/registry.cc @@ -38,6 +38,12 @@ void RegisterPhiKernels(host_context::KernelRegistry* registry) { "phi_dt.create_dense_tensor.cpu", INFRT_KERNEL(infrt::kernel::phi::CreateDenseTensor), {"dims", "lod", "layout", "precision"}); + + registry->AddKernelWithAttrs( + "phi_dt.create_inited_dense_tensor.cpu.f32", + INFRT_KERNEL(infrt::kernel::phi::CreateInitedDenseTensorF32), + {"dims", "lod", "layout", "value"}); + registry->AddKernelWithAttrs( "phi_dt.fill_dense_tensor.f32", INFRT_KERNEL(infrt::kernel::phi::FillDenseTensorF32), diff --git a/paddle/infrt/tests/dialect/phi/phi_test.mlir b/paddle/infrt/tests/dialect/phi/phi_test.mlir index d1e561cd5f995999b4400d6569bcd3fcad9aea0f..7d67fb5362ae738270d8f05d1f4dcbd4b4e02ac4 100644 --- a/paddle/infrt/tests/dialect/phi/phi_test.mlir +++ b/paddle/infrt/tests/dialect/phi/phi_test.mlir @@ -7,26 +7,20 @@ module { %Y, %MeanOut, %VarianceOut = "pd.batch_norm"(%4, %arg1, %arg2, %arg3, %arg4) {data_layout = "NCHW", epsilon = 9.99999974E-6 : f32, momentum = 0.899999976 : f32} : (!infrt.dense_tensor, !infrt.dense_tensor, !infrt.dense_tensor, !infrt.dense_tensor, !infrt.dense_tensor) -> (!infrt.dense_tensor, !infrt.dense_tensor, !infrt.dense_tensor) %out = "pd.relu"(%Y) : (!infrt.dense_tensor) -> !infrt.dense_tensor %5 = "pd.elementwise_add"(%out, %out) {axis = -1:si32} : (!infrt.dense_tensor, !infrt.dense_tensor) -> !infrt.dense_tensor - infrt.return %5 : !infrt.dense_tensor + %6 = "pd.pool2d"(%5) {adaptive = false, pooling_type = "avg", ceil_mode = false, data_format = "NCHW", exclusive = true, global_pooling = false, ksize = [3 : i32, 3 : i32], padding_algorithm = "EXPLICIT", paddings = [1 : i32, 1 : i32], strides = [2 : i32, 2 : i32]} : (!infrt.dense_tensor) -> !infrt.dense_tensor + %7 = "pd.flatten_contiguous_range"(%6) {start_axis = 1 : si32, stop_axis = 3 : si32} : (!infrt.dense_tensor) -> !infrt.dense_tensor + infrt.return %7 : !infrt.dense_tensor } func @main() { %ctx = "phi_dt.create_context.cpu" (): () -> !phi.context - %t = "phi_dt.create_dense_tensor.cpu" (%ctx) {precision=#infrt.precision, layout=#infrt.layout, lod=[1], dims=[1, 3, 8, 8]}: (!phi.context) -> (!infrt.dense_tensor) - "phi_dt.fill_dense_tensor.f32"(%t) {value=[3.8:f32]} : (!infrt.dense_tensor) -> () - %filter = "phi_dt.create_dense_tensor.cpu" (%ctx) {precision=#infrt.precision, layout=#infrt.layout, lod=[1], dims=[3, 3, 8, 8]}: (!phi.context) -> (!infrt.dense_tensor) - "phi_dt.fill_dense_tensor.f32"(%filter) {value=[3.8:f32]} : (!infrt.dense_tensor) -> () - %bias = "phi_dt.create_dense_tensor.cpu" (%ctx) {precision=#infrt.precision, layout=#infrt.layout, lod=[1], dims=[3]}: (!phi.context) -> (!infrt.dense_tensor) - "phi_dt.fill_dense_tensor.f32"(%bias) {value=[1.5:f32]} : (!infrt.dense_tensor) -> () - %mean = "phi_dt.create_dense_tensor.cpu" (%ctx) {precision=#infrt.precision, layout=#infrt.layout, lod=[1], dims=[3]}: (!phi.context) -> (!infrt.dense_tensor) - "phi_dt.fill_dense_tensor.f32"(%mean) {value=[3.5:f32]} : (!infrt.dense_tensor) -> () - %scale = "phi_dt.create_dense_tensor.cpu" (%ctx) {precision=#infrt.precision, layout=#infrt.layout, lod=[1], dims=[3]}: (!phi.context) -> (!infrt.dense_tensor) - "phi_dt.fill_dense_tensor.f32"(%scale) {value=[1.0:f32]} : (!infrt.dense_tensor) -> () - %var = "phi_dt.create_dense_tensor.cpu" (%ctx) {precision=#infrt.precision, layout=#infrt.layout, lod=[1], dims=[3]}: (!phi.context) -> (!infrt.dense_tensor) - "phi_dt.fill_dense_tensor.f32"(%var) {value=[0.0:f32]} : (!infrt.dense_tensor) -> () + %t = "phi_dt.create_inited_dense_tensor.cpu.f32"(%ctx) {value=3.8:f32, layout=#infrt.layout, lod=[1], dims=[1, 3, 8, 8]}: (!phi.context) -> (!infrt.dense_tensor) + %filter = "phi_dt.create_inited_dense_tensor.cpu.f32" (%ctx) {value=3.8:f32, layout=#infrt.layout, lod=[1], dims=[3, 3, 8, 8]}: (!phi.context) -> (!infrt.dense_tensor) + %bias = "phi_dt.create_inited_dense_tensor.cpu.f32" (%ctx) {value=1.5:f32, layout=#infrt.layout, lod=[1], dims=[3]}: (!phi.context) -> (!infrt.dense_tensor) + %mean = "phi_dt.create_inited_dense_tensor.cpu.f32" (%ctx) {value=3.8:f32, layout=#infrt.layout, lod=[1], dims=[3]}: (!phi.context) -> (!infrt.dense_tensor) + %scale = "phi_dt.create_inited_dense_tensor.cpu.f32" (%ctx) {value=3.8:f32, layout=#infrt.layout, lod=[1], dims=[3]}: (!phi.context) -> (!infrt.dense_tensor) + %var = "phi_dt.create_inited_dense_tensor.cpu.f32" (%ctx) {value=3.8:f32, layout=#infrt.layout, lod=[1], dims=[3]}: (!phi.context) -> (!infrt.dense_tensor) %2 = infrt.call@predict(%t, %filter, %bias, %mean, %scale, %var) : (!infrt.dense_tensor, !infrt.dense_tensor, !infrt.dense_tensor,!infrt.dense_tensor,!infrt.dense_tensor,!infrt.dense_tensor) -> !infrt.dense_tensor - - //phi_dt.print_tensor(%t : !infrt.dense_tensor) phi_dt.print_tensor(%2 : !infrt.dense_tensor) infrt.return } diff --git a/tools/infrt/generate_pd_op_dialect_from_paddle_op_maker.py b/tools/infrt/generate_pd_op_dialect_from_paddle_op_maker.py index b0e420da64aa280b71859b27334a2abeaaacc53b..a85bf231d5c84a2e7cd59a8b583285ef88c678d7 100644 --- a/tools/infrt/generate_pd_op_dialect_from_paddle_op_maker.py +++ b/tools/infrt/generate_pd_op_dialect_from_paddle_op_maker.py @@ -340,8 +340,8 @@ def convert_op_proto_into_mlir(op_descs): attr_type_ = attr_mlir_converter[op_proto[ATTRS][attr][ TYPE]] if (attr_type_ in [ - 'I32ArrayAttr', 'F32ArrayAttr', 'StrArrayAttr', - 'BoolArrayAttr', 'I64ArrayAttr' + 'StrAttr', 'I32ArrayAttr', 'F32ArrayAttr', + 'StrArrayAttr', 'BoolArrayAttr', 'I64ArrayAttr' ]): attr_list = attr_type_ + ":$" + attr + "," ARGUMENTS += attr_list