1 //===-- Optimizer/Dialect/CUF/Attributes/CUFAttr.h -- CUF attributes ------===// 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 // 9 // Coding style: https://mlir.llvm.org/getting_started/DeveloperGuide/ 10 // 11 //===----------------------------------------------------------------------===// 12 13 #ifndef FORTRAN_OPTIMIZER_DIALECT_CUF_CUFATTR_H 14 #define FORTRAN_OPTIMIZER_DIALECT_CUF_CUFATTR_H 15 16 #include "flang/Common/Fortran.h" 17 #include "mlir/IR/BuiltinAttributes.h" 18 19 namespace llvm { 20 class StringRef; 21 } 22 23 #include "flang/Optimizer/Dialect/CUF/Attributes/CUFEnumAttr.h.inc" 24 25 #define GET_ATTRDEF_CLASSES 26 #include "flang/Optimizer/Dialect/CUF/Attributes/CUFAttr.h.inc" 27 28 namespace cuf { 29 30 /// Attribute to mark Fortran entities with the CUDA attribute. getDataAttrName()31static constexpr llvm::StringRef getDataAttrName() { return "cuf.data_attr"; } getProcAttrName()32static constexpr llvm::StringRef getProcAttrName() { return "cuf.proc_attr"; } 33 34 /// Attribute to carry CUDA launch_bounds values. getLaunchBoundsAttrName()35static constexpr llvm::StringRef getLaunchBoundsAttrName() { 36 return "cuf.launch_bounds"; 37 } 38 39 /// Attribute to carry CUDA cluster_dims values. getClusterDimsAttrName()40static constexpr llvm::StringRef getClusterDimsAttrName() { 41 return "cuf.cluster_dims"; 42 } 43 44 inline cuf::DataAttributeAttr getDataAttribute(mlir::MLIRContext * mlirContext,std::optional<Fortran::common::CUDADataAttr> cudaAttr)45getDataAttribute(mlir::MLIRContext *mlirContext, 46 std::optional<Fortran::common::CUDADataAttr> cudaAttr) { 47 if (cudaAttr) { 48 cuf::DataAttribute attr; 49 switch (*cudaAttr) { 50 case Fortran::common::CUDADataAttr::Constant: 51 attr = cuf::DataAttribute::Constant; 52 break; 53 case Fortran::common::CUDADataAttr::Device: 54 attr = cuf::DataAttribute::Device; 55 break; 56 case Fortran::common::CUDADataAttr::Managed: 57 attr = cuf::DataAttribute::Managed; 58 break; 59 case Fortran::common::CUDADataAttr::Pinned: 60 attr = cuf::DataAttribute::Pinned; 61 break; 62 case Fortran::common::CUDADataAttr::Shared: 63 attr = cuf::DataAttribute::Shared; 64 break; 65 case Fortran::common::CUDADataAttr::Texture: 66 // Obsolete attribute 67 return {}; 68 case Fortran::common::CUDADataAttr::Unified: 69 attr = cuf::DataAttribute::Unified; 70 break; 71 } 72 return cuf::DataAttributeAttr::get(mlirContext, attr); 73 } 74 return {}; 75 } 76 77 inline cuf::ProcAttributeAttr getProcAttribute(mlir::MLIRContext * mlirContext,std::optional<Fortran::common::CUDASubprogramAttrs> cudaAttr)78getProcAttribute(mlir::MLIRContext *mlirContext, 79 std::optional<Fortran::common::CUDASubprogramAttrs> cudaAttr) { 80 if (cudaAttr) { 81 cuf::ProcAttribute attr; 82 switch (*cudaAttr) { 83 case Fortran::common::CUDASubprogramAttrs::Host: 84 attr = cuf::ProcAttribute::Host; 85 break; 86 case Fortran::common::CUDASubprogramAttrs::Device: 87 attr = cuf::ProcAttribute::Device; 88 break; 89 case Fortran::common::CUDASubprogramAttrs::HostDevice: 90 attr = cuf::ProcAttribute::HostDevice; 91 break; 92 case Fortran::common::CUDASubprogramAttrs::Global: 93 attr = cuf::ProcAttribute::Global; 94 break; 95 case Fortran::common::CUDASubprogramAttrs::Grid_Global: 96 attr = cuf::ProcAttribute::GridGlobal; 97 break; 98 } 99 return cuf::ProcAttributeAttr::get(mlirContext, attr); 100 } 101 return {}; 102 } 103 104 } // namespace cuf 105 106 #endif // FORTRAN_OPTIMIZER_DIALECT_CUF_CUFATTR_H 107