| // 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 "compiler/plugins/target/ROCM/ROCMTargetFeatures.h" | |
| #include "iree/compiler/Codegen/Dialect/GPU/IR/IREEGPUAttrs.h" | |
| #include "llvm/ADT/StringSwitch.h" | |
| namespace mlir::iree_compiler::IREE::HAL { | |
| static ArrayAttr getMfmaArrayAttr(MLIRContext *context, | |
| ArrayRef<IREE::GPU::MMAIntrinsic> types) { | |
| SmallVector<Attribute> attrs(types.size(), IREE::GPU::MMAAttr()); | |
| for (auto [idx, type] : llvm::enumerate(types)) { | |
| attrs[idx] = IREE::GPU::MMAAttr::get(context, type); | |
| } | |
| return ArrayAttr::get(context, attrs); | |
| } | |
| ArrayAttr getROCMSupportedMmaAttrs(MLIRContext *context, StringRef targetArch) { | |
| if (targetArch == "gfx940" || targetArch == "gfx942") { // MI300A/X | |
| return getMfmaArrayAttr(context, | |
| {IREE::GPU::MMAIntrinsic::MFMA_F16_16x16x16_F32, | |
| IREE::GPU::MMAIntrinsic::MFMA_F16_32x32x8_F32}); | |
| } else if (targetArch == "gfx90a") { // MI210 | |
| return getMfmaArrayAttr(context, | |
| {IREE::GPU::MMAIntrinsic::MFMA_F16_16x16x16_F32, | |
| IREE::GPU::MMAIntrinsic::MFMA_F16_32x32x8_F32}); | |
| } else if (targetArch == "gfx1100") { // RDNA3 | |
| return getMfmaArrayAttr(context, | |
| {IREE::GPU::MMAIntrinsic::WMMA_F16_16x16x16_F32}); | |
| } | |
| return ArrayAttr(); | |
| } | |
| } // namespace mlir::iree_compiler::IREE::HAL |