[llvm] 25d7233 - [AMDGPU] Add .uniform_work_group_size metadata to v5

Vang Thao via llvm-commits llvm-commits at lists.llvm.org
Thu Jan 5 13:31:11 PST 2023


Author: Vang Thao
Date: 2023-01-05T21:29:56Z
New Revision: 25d72330ff8b4257a1c1729d5ec448f0f27dd18a

URL: https://github.com/llvm/llvm-project/commit/25d72330ff8b4257a1c1729d5ec448f0f27dd18a
DIFF: https://github.com/llvm/llvm-project/commit/25d72330ff8b4257a1c1729d5ec448f0f27dd18a.diff

LOG: [AMDGPU] Add .uniform_work_group_size metadata to v5

Amdgpu kernel with function attribute "uniform-work-group-size"="true" requires
uniform work group size (i.e. each dimension of global size is a multiple of
corresponding dimension of work group size). hipExtModuleLaunchKernel allows to
launch HIP kernel with non-uniform workgroup size, which makes it necessary for
runtime to check and enforce uniform workgroup size if kernel requires it. To
let runtime be able to enforce that, this metadata is needed to indicate that
the kernel requires uniform workgroup size.

Reviewed By: kzhuravl, arsenm

Differential Revision: https://reviews.llvm.org/D141012

Added: 
    llvm/test/CodeGen/AMDGPU/hsa-metadata-uniform-workgroup-size-v5.ll

Modified: 
    llvm/docs/AMDGPUUsage.rst
    llvm/lib/BinaryFormat/AMDGPUMetadataVerifier.cpp
    llvm/lib/Target/AMDGPU/AMDGPUHSAMetadataStreamer.cpp
    llvm/lib/Target/AMDGPU/AMDGPUHSAMetadataStreamer.h

Removed: 
    


################################################################################
diff  --git a/llvm/docs/AMDGPUUsage.rst b/llvm/docs/AMDGPUUsage.rst
index 9ae09b1c424de..7e5c0c0be14e1 100644
--- a/llvm/docs/AMDGPUUsage.rst
+++ b/llvm/docs/AMDGPUUsage.rst
@@ -3581,6 +3581,26 @@ Code object V5 metadata is the same as
                                                             :ref:`amdgpu-amdhsa-kernel-descriptor-v3-table`.
      ============================= ============= ========== =======================================
 
+..
+
+  .. table:: AMDHSA Code Object V5 Kernel Attribute Metadata Map
+     :name: amdgpu-amdhsa-code-object-kernel-attribute-metadata-map-v5-table
+
+     =========================== ============== ========= ==============================
+     String Key                  Value Type     Required? Description
+     =========================== ============== ========= ==============================
+     ".uniform_work_group_size"  integer                  Indicates if the kernel
+                                                          requires that each dimension
+                                                          of global size is a multiple
+                                                          of corresponding dimension of
+                                                          work-group size. Value of 1
+                                                          implies true and value of 0
+                                                          implies false. Metadata is
+                                                          only emitted when value is 1.
+     =========================== ============== ========= ==============================
+
+..
+
 ..
 
   .. table:: AMDHSA Code Object V5 Kernel Argument Metadata Map Additions and Changes

diff  --git a/llvm/lib/BinaryFormat/AMDGPUMetadataVerifier.cpp b/llvm/lib/BinaryFormat/AMDGPUMetadataVerifier.cpp
index c451da27d7eab..35a79ec04b6e7 100644
--- a/llvm/lib/BinaryFormat/AMDGPUMetadataVerifier.cpp
+++ b/llvm/lib/BinaryFormat/AMDGPUMetadataVerifier.cpp
@@ -278,6 +278,9 @@ bool MetadataVerifier::verifyKernel(msgpack::DocNode &Node) {
     return false;
   if (!verifyIntegerEntry(KernelMap, ".vgpr_spill_count", false))
     return false;
+  if (!verifyIntegerEntry(KernelMap, ".uniform_work_group_size", false))
+    return false;
+
 
   return true;
 }

diff  --git a/llvm/lib/Target/AMDGPU/AMDGPUHSAMetadataStreamer.cpp b/llvm/lib/Target/AMDGPU/AMDGPUHSAMetadataStreamer.cpp
index bd5f82e252535..bd594342786cf 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUHSAMetadataStreamer.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPUHSAMetadataStreamer.cpp
@@ -1080,6 +1080,15 @@ void MetadataStreamerMsgPackV5::emitHiddenKernelArgs(
     emitKernelArg(DL, Int8PtrTy, Align(8), "hidden_queue_ptr", Offset, Args);
 }
 
+void MetadataStreamerMsgPackV5::emitKernelAttrs(const Function &Func,
+                                                msgpack::MapDocNode Kern) {
+  MetadataStreamerMsgPackV3::emitKernelAttrs(Func, Kern);
+
+  if (Func.getFnAttribute("uniform-work-group-size").getValueAsBool())
+    Kern[".uniform_work_group_size"] = Kern.getDocument()->getNode(1);
+}
+
+
 } // end namespace HSAMD
 } // end namespace AMDGPU
 } // end namespace llvm

diff  --git a/llvm/lib/Target/AMDGPU/AMDGPUHSAMetadataStreamer.h b/llvm/lib/Target/AMDGPU/AMDGPUHSAMetadataStreamer.h
index 597bcadc78d08..91670b9820a2c 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUHSAMetadataStreamer.h
+++ b/llvm/lib/Target/AMDGPU/AMDGPUHSAMetadataStreamer.h
@@ -58,6 +58,8 @@ class MetadataStreamer {
   virtual void emitVersion() = 0;
   virtual void emitHiddenKernelArgs(const MachineFunction &MF, unsigned &Offset,
                                     msgpack::ArrayDocNode Args) = 0;
+  virtual void emitKernelAttrs(const Function &Func,
+                               msgpack::MapDocNode Kern) = 0;
 };
 
 class MetadataStreamerMsgPackV3 : public MetadataStreamer {
@@ -90,7 +92,7 @@ class MetadataStreamerMsgPackV3 : public MetadataStreamer {
 
   void emitKernelLanguage(const Function &Func, msgpack::MapDocNode Kern);
 
-  void emitKernelAttrs(const Function &Func, msgpack::MapDocNode Kern);
+  void emitKernelAttrs(const Function &Func, msgpack::MapDocNode Kern) override;
 
   void emitKernelArgs(const MachineFunction &MF, msgpack::MapDocNode Kern);
 
@@ -149,6 +151,7 @@ class MetadataStreamerMsgPackV5 final : public MetadataStreamerMsgPackV4 {
   void emitVersion() override;
   void emitHiddenKernelArgs(const MachineFunction &MF, unsigned &Offset,
                             msgpack::ArrayDocNode Args) override;
+  void emitKernelAttrs(const Function &Func, msgpack::MapDocNode Kern) override;
 
 public:
   MetadataStreamerMsgPackV5() = default;
@@ -211,6 +214,10 @@ class MetadataStreamerYamlV2 final : public MetadataStreamer {
                             msgpack::ArrayDocNode Args) override {
     llvm_unreachable("Dummy override should not be invoked!");
   }
+  void emitKernelAttrs(const Function &Func,
+                       msgpack::MapDocNode Kern) override {
+    llvm_unreachable("Dummy override should not be invoked!");
+  }
 
 public:
   MetadataStreamerYamlV2() = default;

diff  --git a/llvm/test/CodeGen/AMDGPU/hsa-metadata-uniform-workgroup-size-v5.ll b/llvm/test/CodeGen/AMDGPU/hsa-metadata-uniform-workgroup-size-v5.ll
new file mode 100644
index 0000000000000..ba3ec26cdb76d
--- /dev/null
+++ b/llvm/test/CodeGen/AMDGPU/hsa-metadata-uniform-workgroup-size-v5.ll
@@ -0,0 +1,30 @@
+; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 --amdhsa-code-object-version=5 -filetype=obj -o - < %s | llvm-readelf --notes - | FileCheck %s
+; RUN: llc -mtriple=amdgcn--amdhsa -mcpu=gfx900 --amdhsa-code-object-version=5 < %s | FileCheck %s
+
+; CHECK: ---
+; CHECK: amdhsa.kernels:
+; CHECK:  - .args:
+; CHECK-LABEL:     .name:           kernel_uniform_workgroup
+; CHECK:     .uniform_work_group_size: 1
+define amdgpu_kernel void @kernel_uniform_workgroup() #0 {
+bb:
+  ret void
+}
+
+; CHECK:  - .args:
+; CHECK-LABEL:     .name:           kernel_non_uniform_workgroup
+; CHECK-NOT:     .uniform_work_group_size:
+define amdgpu_kernel void @kernel_non_uniform_workgroup() #1 {
+bb:
+  ret void
+}
+
+; CHECK:  - .args:
+; CHECK-LABEL:     .name:           kernel_no_attr
+; CHECK-NOT:     .uniform_work_group_size:
+define amdgpu_kernel void @kernel_no_attr() {
+bb:
+  ret void
+}
+attributes #0 = { "uniform-work-group-size"="true" }
+attributes #1 = { "uniform-work-group-size"="false" }


        


More information about the llvm-commits mailing list