MLIR 23.0.0git
DialectLinalg.cpp
Go to the documentation of this file.
1//===- DialectLinalg.cpp - Nanobind module for Linalg dialect API support -===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
10#include "mlir-c/IR.h"
15
16namespace nb = nanobind;
18namespace mlir {
19namespace python {
21namespace linalg {
22
31
44
45static std::optional<PyLinalgContractionDimensions>
49
50 // Detect "empty" result. This occurs when `op` is not a contraction op,
51 // or when `linalg::inferContractionDims` fails.
52 if (mlirAttributeIsNull(dims.batch) && mlirAttributeIsNull(dims.m) &&
53 mlirAttributeIsNull(dims.n) && mlirAttributeIsNull(dims.k)) {
54 return std::nullopt;
55 }
56 return dims;
57}
58
59static std::optional<PyLinalgConvolutionDimensions>
63
64 // Detect "empty" result. This occurs when `op` is not a convolution op,
65 // or when `linalg::inferConvolutionDims` fails.
66 if (mlirAttributeIsNull(dims.batch) &&
67 mlirAttributeIsNull(dims.outputImage) &&
68 mlirAttributeIsNull(dims.outputChannel) &&
69 mlirAttributeIsNull(dims.filterLoop) &&
70 mlirAttributeIsNull(dims.inputChannel) &&
71 mlirAttributeIsNull(dims.depth) && mlirAttributeIsNull(dims.strides) &&
72 mlirAttributeIsNull(dims.dilations)) {
73 return std::nullopt;
74 }
75
76 return dims;
77}
78
79static void populateDialectLinalgSubmodule(nb::module_ m) {
80 m.def(
81 "fill_builtin_region",
82 [](PyOperationBase &op) {
84 },
85 nb::arg("op"),
86 "Fill the region for `op`, which is assumed to be a builtin named Linalg "
87 "op.");
88
89 m.def(
90 "isa_contraction_op",
91 [](PyOperationBase &op) {
93 },
94 "Checks if the given operation is a Linalg contraction operation.",
95 nb::arg("op"));
96
97 nb::class_<PyLinalgContractionDimensions>(m, "ContractionDimensions")
98 .def_prop_ro(
99 "batch",
100 [](const PyLinalgContractionDimensions &self) { return self.batch; })
101 .def_prop_ro(
102 "m", [](const PyLinalgContractionDimensions &self) { return self.m; })
103 .def_prop_ro(
104 "n", [](const PyLinalgContractionDimensions &self) { return self.n; })
105 .def_prop_ro("k", [](const PyLinalgContractionDimensions &self) {
106 return self.k;
107 });
108
109 m.def("infer_contraction_dimensions", &InferContractionDimensions,
110 "Infers contraction dimensions (batch/m/n/k) for a Linalg contraction "
111 "op.",
112 nb::arg("op"));
113
114 m.def(
115 "infer_contraction_dimensions_from_maps",
116 [](std::vector<PyAffineMap> indexingMaps)
117 -> std::optional<PyLinalgContractionDimensions> {
118 if (indexingMaps.empty())
119 return std::nullopt;
120
121 std::vector<MlirAffineMap> indexingMaps_(indexingMaps.size());
122 std::copy(indexingMaps.begin(), indexingMaps.end(),
123 indexingMaps_.begin());
126 indexingMaps_.size());
127
128 // Detect "empty" result from invalid input or failed inference.
129 if (mlirAttributeIsNull(dims.batch) && mlirAttributeIsNull(dims.m) &&
130 mlirAttributeIsNull(dims.n) && mlirAttributeIsNull(dims.k)) {
131 return std::nullopt;
132 }
133 return dims;
134 },
135 "Infers contraction dimensions (batch/m/n/k) from a list of affine "
136 "maps.",
137 nb::arg("indexing_maps"));
138
139 m.def(
140 "isa_convolution_op",
141 [](PyOperationBase &op) {
143 },
144 "Checks if the given operation is a Linalg convolution operation.",
145 nb::arg("op"));
146
147 nb::class_<PyLinalgConvolutionDimensions>(m, "ConvolutionDimensions")
148 .def_prop_ro(
149 "batch",
150 [](const PyLinalgConvolutionDimensions &self) { return self.batch; })
151 .def_prop_ro("output_image",
152 [](const PyLinalgConvolutionDimensions &self) {
153 return self.outputImage;
154 })
155 .def_prop_ro("output_channel",
156 [](const PyLinalgConvolutionDimensions &self) {
157 return self.outputChannel;
158 })
159 .def_prop_ro("filter_loop",
160 [](const PyLinalgConvolutionDimensions &self) {
161 return self.filterLoop;
162 })
163 .def_prop_ro("input_channel",
164 [](const PyLinalgConvolutionDimensions &self) {
165 return self.inputChannel;
166 })
167 .def_prop_ro(
168 "depth",
169 [](const PyLinalgConvolutionDimensions &self) { return self.depth; })
170 .def_prop_ro("strides",
171 [](const PyLinalgConvolutionDimensions &self) {
172 return self.strides;
173 })
174 .def_prop_ro("dilations", [](const PyLinalgConvolutionDimensions &self) {
175 return self.dilations;
176 });
177
178 m.def("infer_convolution_dimensions", &InferConvolutionDimensions,
179 "Infers convolution dimensions", nb::arg("op"));
180
181 m.def(
182 "get_indexing_maps",
183 [](PyOperationBase &op) -> std::optional<PyArrayAttribute> {
184 MlirAttribute attr =
186 if (mlirAttributeIsNull(attr))
187 return std::nullopt;
188 return PyArrayAttribute(op.getOperation().getContext(), attr);
189 },
190 "Returns the indexing_maps attribute for a linalg op.");
191}
192} // namespace linalg
193} // namespace MLIR_BINDINGS_PYTHON_DOMAIN
194} // namespace python
195} // namespace mlir
196
197NB_MODULE(_mlirDialectsLinalg, m) {
198 m.doc() = "MLIR Linalg dialect.";
199
202}
NB_MODULE(_mlirDialectsLinalg, m)
PyMlirContextRef & getContext()
Accesses the context reference.
Definition IRCore.h:298
Base class for PyOperation and PyOpView which exposes the primary, user visible methods for manipulat...
Definition IRCore.h:578
virtual PyOperation & getOperation()=0
Each must provide access to the raw Operation.
MLIR_CAPI_EXPORTED MlirLinalgConvolutionDimensions mlirLinalgInferConvolutionDimensions(MlirOperation op)
Definition Linalg.cpp:119
MLIR_CAPI_EXPORTED void mlirLinalgFillBuiltinNamedOpRegion(MlirOperation mlirOp)
Apply the special region builder for the builtin named Linalg op.
Definition Linalg.cpp:19
MLIR_CAPI_EXPORTED MlirLinalgContractionDimensions mlirLinalgInferContractionDimensionsFromMaps(const MlirAffineMap *indexingMaps, size_t numMaps)
Definition Linalg.cpp:79
MLIR_CAPI_EXPORTED bool mlirLinalgIsAContractionOp(MlirOperation op)
Definition Linalg.cpp:45
MLIR_CAPI_EXPORTED MlirAttribute mlirLinalgGetIndexingMapsAttribute(MlirOperation op)
Definition Linalg.cpp:156
MLIR_CAPI_EXPORTED bool mlirLinalgIsAConvolutionOp(MlirOperation op)
Definition Linalg.cpp:110
MLIR_CAPI_EXPORTED MlirLinalgContractionDimensions mlirLinalgInferContractionDimensions(MlirOperation op)
Definition Linalg.cpp:52
static void populateDialectLinalgSubmodule(nb::module_ m)
static std::optional< PyLinalgContractionDimensions > InferContractionDimensions(PyOperationBase &op)
static std::optional< PyLinalgConvolutionDimensions > InferConvolutionDimensions(PyOperationBase &op)
Include the generated interface declarations.
MlirAttribute outputChannel
Definition Linalg.h:47