diff options
Diffstat (limited to 'libgomp/plugin')
| -rw-r--r-- | libgomp/plugin/plugin-gcn.c | 142 |
1 files changed, 29 insertions, 113 deletions
diff --git a/libgomp/plugin/plugin-gcn.c b/libgomp/plugin/plugin-gcn.c index 1bd90dc381e..592a7b6daba 100644 --- a/libgomp/plugin/plugin-gcn.c +++ b/libgomp/plugin/plugin-gcn.c @@ -379,22 +379,15 @@ struct gcn_image_desc const unsigned global_variable_count; }; -/* This enum mirrors the corresponding LLVM enum's values for all ISAs that we - support. - See https://llvm.org/docs/AMDGPUUsage.html#amdgpu-ef-amdgpu-mach-table */ +/* Enum values corresponding to the the ELF architecture codes. + Only 'special' values are actually referenced in this file, but having them + all may aid debugging. */ typedef enum { EF_AMDGPU_MACH_UNSUPPORTED = -1, - EF_AMDGPU_MACH_AMDGCN_GFX803 = 0x02a, - EF_AMDGPU_MACH_AMDGCN_GFX900 = 0x02c, - EF_AMDGPU_MACH_AMDGCN_GFX906 = 0x02f, - EF_AMDGPU_MACH_AMDGCN_GFX908 = 0x030, - EF_AMDGPU_MACH_AMDGCN_GFX90a = 0x03f, - EF_AMDGPU_MACH_AMDGCN_GFX90c = 0x032, - EF_AMDGPU_MACH_AMDGCN_GFX1030 = 0x036, - EF_AMDGPU_MACH_AMDGCN_GFX1036 = 0x045, - EF_AMDGPU_MACH_AMDGCN_GFX1100 = 0x041, - EF_AMDGPU_MACH_AMDGCN_GFX1103 = 0x044 +#define GCN_DEVICE(name, NAME, ELF, ...) \ + EF_AMDGPU_MACH_AMDGCN_ ## NAME = ELF, +#include "../../gcc/config/gcn/gcn-devices.def" } EF_AMDGPU_MACH; const static int EF_AMDGPU_MACH_MASK = 0x000000ff; @@ -1675,98 +1668,28 @@ elf_gcn_isa_field (Elf64_Ehdr *image) return image->e_flags & EF_AMDGPU_MACH_MASK; } -const static char *gcn_gfx803_s = "gfx803"; -const static char *gcn_gfx900_s = "gfx900"; -const static char *gcn_gfx906_s = "gfx906"; -const static char *gcn_gfx908_s = "gfx908"; -const static char *gcn_gfx90a_s = "gfx90a"; -const static char *gcn_gfx90c_s = "gfx90c"; -const static char *gcn_gfx1030_s = "gfx1030"; -const static char *gcn_gfx1036_s = "gfx1036"; -const static char *gcn_gfx1100_s = "gfx1100"; -const static char *gcn_gfx1103_s = "gfx1103"; -const static int gcn_isa_name_len = 7; - /* Returns the name that the HSA runtime uses for the ISA or NULL if we do not support the ISA. */ static const char* -isa_hsa_name (int isa) { +isa_name (int isa) { switch(isa) { - case EF_AMDGPU_MACH_AMDGCN_GFX803: - return gcn_gfx803_s; - case EF_AMDGPU_MACH_AMDGCN_GFX900: - return gcn_gfx900_s; - case EF_AMDGPU_MACH_AMDGCN_GFX906: - return gcn_gfx906_s; - case EF_AMDGPU_MACH_AMDGCN_GFX908: - return gcn_gfx908_s; - case EF_AMDGPU_MACH_AMDGCN_GFX90a: - return gcn_gfx90a_s; - case EF_AMDGPU_MACH_AMDGCN_GFX90c: - return gcn_gfx90c_s; - case EF_AMDGPU_MACH_AMDGCN_GFX1030: - return gcn_gfx1030_s; - case EF_AMDGPU_MACH_AMDGCN_GFX1036: - return gcn_gfx1036_s; - case EF_AMDGPU_MACH_AMDGCN_GFX1100: - return gcn_gfx1100_s; - case EF_AMDGPU_MACH_AMDGCN_GFX1103: - return gcn_gfx1103_s; +#define GCN_DEVICE(name, NAME, ELF, ...) \ + case ELF: return #name; +#include "../../gcc/config/gcn/gcn-devices.def" } return NULL; } -/* Returns the user-facing name that GCC uses to identify the architecture (e.g. - with -march) or NULL if we do not support the ISA. - Keep in sync with /gcc/config/gcn/gcn.{c,opt}. */ - -static const char* -isa_gcc_name (int isa) { - switch(isa) - { - case EF_AMDGPU_MACH_AMDGCN_GFX803: - return "fiji"; - default: - return isa_hsa_name (isa); - } -} - /* Returns the code which is used in the GCN object code to identify the ISA with the given name (as used by the HSA runtime). */ static gcn_isa isa_code(const char *isa) { - if (!strncmp (isa, gcn_gfx803_s, gcn_isa_name_len)) - return EF_AMDGPU_MACH_AMDGCN_GFX803; - - if (!strncmp (isa, gcn_gfx900_s, gcn_isa_name_len)) - return EF_AMDGPU_MACH_AMDGCN_GFX900; - - if (!strncmp (isa, gcn_gfx906_s, gcn_isa_name_len)) - return EF_AMDGPU_MACH_AMDGCN_GFX906; - - if (!strncmp (isa, gcn_gfx908_s, gcn_isa_name_len)) - return EF_AMDGPU_MACH_AMDGCN_GFX908; - - if (!strncmp (isa, gcn_gfx90a_s, gcn_isa_name_len)) - return EF_AMDGPU_MACH_AMDGCN_GFX90a; - - if (!strncmp (isa, gcn_gfx90c_s, gcn_isa_name_len)) - return EF_AMDGPU_MACH_AMDGCN_GFX90c; - - if (!strncmp (isa, gcn_gfx1030_s, gcn_isa_name_len)) - return EF_AMDGPU_MACH_AMDGCN_GFX1030; - - if (!strncmp (isa, gcn_gfx1036_s, gcn_isa_name_len)) - return EF_AMDGPU_MACH_AMDGCN_GFX1036; - - if (!strncmp (isa, gcn_gfx1100_s, gcn_isa_name_len)) - return EF_AMDGPU_MACH_AMDGCN_GFX1100; - - if (!strncmp (isa, gcn_gfx1103_s, gcn_isa_name_len)) - return EF_AMDGPU_MACH_AMDGCN_GFX1103; +#define GCN_DEVICE(name, NAME, ELF, ...) \ + if (!strcmp (isa, #name)) return ELF; +#include "../../gcc/config/gcn/gcn-devices.def" return EF_AMDGPU_MACH_UNSUPPORTED; } @@ -1778,23 +1701,13 @@ max_isa_vgprs (int isa) { switch (isa) { - case EF_AMDGPU_MACH_AMDGCN_GFX803: - case EF_AMDGPU_MACH_AMDGCN_GFX900: - case EF_AMDGPU_MACH_AMDGCN_GFX906: - case EF_AMDGPU_MACH_AMDGCN_GFX908: - return 256; - case EF_AMDGPU_MACH_AMDGCN_GFX90a: - return 512; - case EF_AMDGPU_MACH_AMDGCN_GFX90c: - return 256; - case EF_AMDGPU_MACH_AMDGCN_GFX1030: - case EF_AMDGPU_MACH_AMDGCN_GFX1036: - return 512; /* 512 SIMD32 = 256 wavefrontsize64. */ - case EF_AMDGPU_MACH_AMDGCN_GFX1100: - case EF_AMDGPU_MACH_AMDGCN_GFX1103: - return 1536; /* 1536 SIMD32 = 768 wavefrontsize64. */ - } - GOMP_PLUGIN_fatal ("unhandled ISA in max_isa_vgprs"); +#define GCN_DEVICE(name, NAME, ELF, ISA, XNACK, SRAM, WAVE64, CU, \ + MAX_ISA_VGPRS, ...) \ + case ELF: return MAX_ISA_VGPRS; +#include "../../gcc/config/gcn/gcn-devices.def" + default: + GOMP_PLUGIN_fatal ("unhandled ISA in max_isa_vgprs"); + } } /* }}} */ @@ -2492,7 +2405,7 @@ static bool isa_matches_agent (struct agent_info *agent, Elf64_Ehdr *image) { int isa_field = elf_gcn_isa_field (image); - const char* isa_s = isa_hsa_name (isa_field); + const char* isa_s = isa_name (isa_field); if (!isa_s) { hsa_error ("Unsupported ISA in GCN code object.", HSA_STATUS_ERROR); @@ -2502,15 +2415,13 @@ isa_matches_agent (struct agent_info *agent, Elf64_Ehdr *image) if (isa_field != agent->device_isa) { char msg[120]; - const char *agent_isa_s = isa_hsa_name (agent->device_isa); - const char *agent_isa_gcc_s = isa_gcc_name (agent->device_isa); + const char *agent_isa_s = isa_name (agent->device_isa); assert (agent_isa_s); - assert (agent_isa_gcc_s); snprintf (msg, sizeof msg, "GCN code object ISA '%s' does not match GPU ISA '%s'.\n" "Try to recompile with '-foffload-options=-march=%s'.\n", - isa_s, agent_isa_s, agent_isa_gcc_s); + isa_s, agent_isa_s, agent_isa_s); hsa_error (msg, HSA_STATUS_ERROR); return false; @@ -3461,7 +3372,12 @@ GOMP_OFFLOAD_init_device (int n) agent->device_isa = isa_code (agent->name); if (agent->device_isa == EF_AMDGPU_MACH_UNSUPPORTED) - return hsa_error ("Unknown GCN agent architecture", HSA_STATUS_ERROR); + { + char msg[33 + 64 + 1]; + snprintf (msg, sizeof msg, + "Unknown GCN agent architecture '%s'", agent->name); + return hsa_error (msg, HSA_STATUS_ERROR); + } status = hsa_fns.hsa_agent_get_info_fn (agent->id, HSA_AGENT_INFO_VENDOR_NAME, &agent->vendor_name); |
