| // Copyright 2024 The IREE Authors | |
| // | |
| // Licensed under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| #include "iree/compiler/dialects/iree_gpu.h" | |
| #include "mlir-c/BuiltinAttributes.h" | |
| #include "mlir-c/IR.h" | |
| #include "mlir/Bindings/Python/PybindAdaptors.h" | |
| namespace py = pybind11; | |
| using namespace mlir::python::adaptors; | |
| PYBIND11_MODULE(_ireeCompilerDialects, m) { | |
| m.doc() = "iree-compiler dialects python extension"; | |
| auto iree_gpu_module = | |
| m.def_submodule("iree_gpu", "iree_gpu dialect bindings"); | |
| //===-------------------------------------------------------------------===// | |
| // GPUReorderWorkgroupsStrategyAttr | |
| //===-------------------------------------------------------------------===// | |
| auto strategyEnum = | |
| py::enum_<ireeGPUReorderWorkgroupsStrategyEnum>( | |
| iree_gpu_module, "ReorderWorkgroupsStrategy", py::module_local()) | |
| .value("None_", ireeGPUReorderWorkgroupsStrategyEnumNone) | |
| .value("Swizzle", ireeGPUReorderWorkgroupsStrategyEnumSwizzle) | |
| .value("Transpose", ireeGPUReorderWorkgroupsStrategyEnumTranspose) | |
| .def( | |
| "__str__", | |
| [](ireeGPUReorderWorkgroupsStrategyEnum &self) { | |
| switch (self) { | |
| case ireeGPUReorderWorkgroupsStrategyEnumNone: | |
| return "None"; | |
| case ireeGPUReorderWorkgroupsStrategyEnumSwizzle: | |
| return "Swizzle"; | |
| case ireeGPUReorderWorkgroupsStrategyEnumTranspose: | |
| return "Transpose"; | |
| default: | |
| llvm::report_fatal_error( | |
| "unknown ReorderWorkgroupsStrategy variant"); | |
| } | |
| }, | |
| // pybind overloads are tried in the order they were registered. | |
| // As a result, enums used the default __str__ method instead of | |
| // the custom one. Adding py::prepend() fixes this issue. | |
| py::prepend()); | |
| mlir_attribute_subclass(iree_gpu_module, "ReorderWorkgroupsStrategyAttr", | |
| ireeAttributeIsAGPUReorderWorkgroupsStrategyAttr, | |
| ireeGPUReorderWorkgroupsStrategyAttrGetTypeID) | |
| .def_classmethod( | |
| "get", | |
| [](const py::object &, ireeGPUReorderWorkgroupsStrategyEnum value, | |
| MlirContext ctx) { | |
| return ireeGPUReorderWorkgroupsStrategyAttrGet(ctx, value); | |
| }, | |
| "cls"_a, "value"_a, "ctx"_a = py::none(), | |
| "Gets a gpu.reorder_workgroups_strategy from parameters.") | |
| .def_property_readonly( | |
| "value", | |
| [](MlirAttribute self) -> ireeGPUReorderWorkgroupsStrategyEnum { | |
| return ireeGPUReorderWorkgroupsStrategyAttrGetValue(self); | |
| }); | |
| //===-------------------------------------------------------------------===// | |
| // GPUPipelineOptionsAttr | |
| //===-------------------------------------------------------------------===// | |
| mlir_attribute_subclass(iree_gpu_module, "PipelineOptionsAttr", | |
| ireeAttributeIsAGPUPipelineOptionsAttr, | |
| ireeGPUPipelineOptionsAttrGetTypeID) | |
| .def_classmethod( | |
| "get", | |
| [](const py::object &, std::optional<bool> prefetchSharedMemory, | |
| std::optional<bool> noReduceSharedMemoryBankConflicts, | |
| std::optional<MlirAttribute> reorderWorkgroupsStrategy, | |
| MlirContext ctx) { | |
| return ireeGPUPipelineOptionsAttrGet( | |
| ctx, | |
| prefetchSharedMemory.has_value() ? &*prefetchSharedMemory | |
| : nullptr, | |
| noReduceSharedMemoryBankConflicts.has_value() | |
| ? &*noReduceSharedMemoryBankConflicts | |
| : nullptr, | |
| reorderWorkgroupsStrategy.has_value() | |
| ? &*reorderWorkgroupsStrategy | |
| : nullptr); | |
| }, | |
| "cls"_a, "prefetch_shared_memory"_a = py::none(), | |
| "no_reduce_shared_memory_bank_conflicts"_a = py::none(), | |
| "reorder_workgroups_strategy"_a = py::none(), py::kw_only(), | |
| "ctx"_a = py::none(), "Gets a gpu.pipeline_options from parameters.") | |
| .def_property_readonly( | |
| "prefetch_shared_memory", | |
| [](MlirAttribute self) -> std::optional<bool> { | |
| auto attr = ireeGPUPipelineOptionsAttrGetPrefetchSharedMemory(self); | |
| if (!mlirAttributeIsNull(attr)) | |
| return mlirBoolAttrGetValue(attr); | |
| return std::nullopt; | |
| }) | |
| .def_property_readonly( | |
| "no_reduce_shared_memory_bank_conflicts", | |
| [](MlirAttribute self) -> std::optional<bool> { | |
| auto attr = | |
| ireeGPUPipelineOptionsAttrGetNoReduceSharedMemoryBankConflicts( | |
| self); | |
| if (!mlirAttributeIsNull(attr)) | |
| return mlirBoolAttrGetValue(attr); | |
| return std::nullopt; | |
| }) | |
| .def_property_readonly( | |
| "reorder_workgroups_strategy", | |
| [](MlirAttribute self) -> std::optional<MlirAttribute> { | |
| auto attr = | |
| ireeGPUPipelineOptionsAttrGetReorderWorkgroupsStrategy(self); | |
| if (!mlirAttributeIsNull(attr)) | |
| return attr; | |
| return std::nullopt; | |
| }); | |
| } |