| /* { dg-do run } */ |
| |
| /* { dg-require-effective-target offload_device } */ |
| /* { dg-xfail-if "not implemented" { ! { offload_target_nvptx || offload_target_amdgcn } } } */ |
| |
| /* Test that GPU low-latency allocation is limited to team access. */ |
| |
| #include <stddef.h> |
| #include <omp.h> |
| |
| #pragma omp requires dynamic_allocators |
| |
| int |
| main () |
| { |
| #pragma omp target |
| { |
| /* Ensure that the memory we get *is* low-latency with a null-fallback. */ |
| omp_alloctrait_t traits[2] |
| = { { omp_atk_fallback, omp_atv_null_fb }, |
| { omp_atk_access, omp_atv_cgroup } }; |
| omp_allocator_handle_t lowlat = omp_init_allocator (omp_low_lat_mem_space, |
| 2, traits); // good |
| |
| omp_alloctrait_t traits_all[2] |
| = { { omp_atk_fallback, omp_atv_null_fb }, |
| { omp_atk_access, omp_atv_all } }; |
| omp_allocator_handle_t lowlat_all |
| = omp_init_allocator (omp_low_lat_mem_space, 2, traits_all); // bad |
| |
| omp_alloctrait_t traits_default[1] |
| = { { omp_atk_fallback, omp_atv_null_fb } }; |
| omp_allocator_handle_t lowlat_default |
| = omp_init_allocator (omp_low_lat_mem_space, 1, traits_default); // bad |
| |
| if (lowlat_all != omp_null_allocator |
| || lowlat_default != omp_null_allocator) |
| __builtin_abort (); |
| |
| void *a = omp_alloc (1, lowlat); // good |
| |
| if (!a) |
| __builtin_abort (); |
| |
| omp_free (a, lowlat); |
| |
| |
| a = omp_calloc (1, 1, lowlat); // good |
| |
| if (!a) |
| __builtin_abort (); |
| |
| omp_free (a, lowlat); |
| |
| |
| a = omp_realloc (NULL, 1, lowlat, lowlat); // good |
| |
| if (!a) |
| __builtin_abort (); |
| |
| omp_free (a, lowlat); |
| } |
| |
| return 0; |
| } |
| |