if (!caller && cfun->machine->normal_function)
gcn_detect_incoming_pointer_arg (fndecl);
- if ((omp_requires_mask & (OMP_REQUIRES_UNIFIED_SHARED_MEMORY
- | OMP_REQUIRES_SELF_MAPS))
+ static bool warned_xnack = 0;
+ if (!warned_xnack
+ && (omp_requires_mask & (OMP_REQUIRES_UNIFIED_SHARED_MEMORY
+ | OMP_REQUIRES_SELF_MAPS))
&& gcn_devices[gcn_arch].xnack_default != HSACO_ATTR_UNSUPPORTED
&& flag_xnack == HSACO_ATTR_OFF)
{
warning_at (UNKNOWN_LOCATION, 0,
- "Unified Shared Memory is enabled, but XNACK is disabled");
+ "Unified Shared Memory is required, but XNACK is disabled");
inform (UNKNOWN_LOCATION, "Try -foffload-options=-mxnack=any");
+ warned_xnack = 1;
}
reinit_regs ();
|| TEST_XNACK_ON (elf_flags)
|| xnack_required);
if (TEST_XNACK_OFF (elf_flags) && xnack_required)
- fatal_error (input_location,
- "conflicting settings; XNACK is forced off but Unified "
- "Shared Memory is on");
+ {
+ warning (input_location,
+ "conflicting settings; XNACK is forced off but Unified "
+ "Shared Memory is required");
+ xnack_required = 0;
+ }
/* Start generating the C code. */
if (gcn_stack_size)
} } "-lhipblas" ]
}
+# return 1 if OpenMP Unified Shared Memory is supported by offload devices
+
+proc check_effective_target_omp_usm { } {
+ if { [check_effective_target_offload_device_nvptx]
+ || [check_effective_target_offload_target_amdgcn] } {
+ if [check_runtime usm_available_ {
+ #include <omp.h>
+ #pragma omp requires unified_shared_memory
+ int main ()
+ {
+ int a;
+ #pragma omp target map(from: a)
+ a = omp_is_initial_device ();
+ return a;
+ }
+ } ] {
+ return 1
+ }
+ }
+
+ return 0
+}
+
# return 1 if OpenMP Device Managed Memory is supported
proc check_effective_target_omp_managedmem { } {
+/* { dg-require-effective-target omp_usm } */
#pragma omp requires unified_shared_memory self_maps
#define MEM_SHARED
+/* { dg-require-effective-target omp_usm } */
#pragma omp requires unified_shared_memory self_maps
#define MEM_SHARED
+/* { dg-require-effective-target omp_usm } */
#pragma omp requires unified_shared_memory self_maps
#define MEM_SHARED
+/* { dg-require-effective-target omp_usm } */
#pragma omp requires unified_shared_memory self_maps
#define MEM_SHARED
+/* { dg-require-effective-target omp_usm } */
#pragma omp requires unified_shared_memory self_maps
#define MEM_SHARED
+/* { dg-require-effective-target omp_usm } */
#pragma omp requires unified_shared_memory self_maps
#define MEM_SHARED
+/* { dg-require-effective-target omp_usm } */
#pragma omp requires unified_shared_memory self_maps
#define MEM_SHARED
+/* { dg-require-effective-target omp_usm } */
#pragma omp requires unified_shared_memory self_maps
#define MEM_SHARED
+/* { dg-require-effective-target omp_usm } */
#pragma omp requires unified_shared_memory self_maps
#define MEM_SHARED
// { dg-additional-options "-std=c++20" }
+/* { dg-require-effective-target omp_usm } */
#pragma omp requires unified_shared_memory self_maps
+/* { dg-require-effective-target omp_usm } */
#pragma omp requires unified_shared_memory self_maps
#define MEM_SHARED
+/* { dg-require-effective-target omp_usm } */
#pragma omp requires unified_shared_memory self_maps
#define MEM_SHARED
and for not mapping the stack variables 'A' and 'B' (not mapped
but accessible -> USM makes this tested feature even more important.) */
+/* { dg-require-effective-target omp_usm } */
#pragma omp requires unified_shared_memory
/* Ensure that defaultmap(default : pointer) uses correct OpenMP 5.2
#include <stdint.h>
#include <omp.h>
+/* { dg-require-effective-target omp_usm } */
#pragma omp requires unified_shared_memory
int A[3] = {-3,-4,-5};
#include <stdint.h>
#include <omp.h>
+/* { dg-require-effective-target omp_usm } */
#pragma omp requires self_maps
int A[3] = {-3,-4,-5};
! Basic test whether self_maps work
+! { dg-require-effective-target omp_usm }
module m
!$omp requires self_maps