@table @asis
@item @code{omp_initial_device}
@item @code{omp_invalid_device}
+@item @code{omp_default_device}
@end table
continue;
}
/* Device number must be conforming, which includes
- omp_initial_device (-1) and omp_invalid_device (-4). */
+ omp_initial_device (-1), omp_invalid_device (-4),
+ and omp_default_device (-5). */
if (property_kind == OMP_TRAIT_PROPERTY_DEV_NUM_EXPR
&& otp->expr->expr_type == EXPR_CONSTANT
&& mpz_sgn (otp->expr->value.integer) < 0
&& mpz_cmp_si (otp->expr->value.integer, -1) != 0
- && mpz_cmp_si (otp->expr->value.integer, -4) != 0)
+ && mpz_cmp_si (otp->expr->value.integer, -4) != 0
+ && mpz_cmp_si (otp->expr->value.integer, -5) != 0)
gfc_error ("property must be a conforming device number at %L",
&otp->expr->where);
break;
enum
{
omp_initial_device = -1,
- omp_invalid_device = -4
+ omp_invalid_device = -4,
+ omp_default_device = -5
};
typedef enum omp_interop_t __GOMP_UINTPTR_T_ENUM
parameter :: omp_low_lat_mem_space = 4
integer, parameter :: omp_initial_device = -1
integer, parameter :: omp_invalid_device = -4
+ integer, parameter :: omp_default_device = -5
integer (omp_interop_kind), &
parameter :: omp_interop_none = 0_omp_interop_kind
integer (omp_interop_fr_kind), parameter :: omp_ifr_cuda = 1
parameter (omp_const_mem_space = 2)
parameter (omp_high_bw_mem_space = 3)
parameter (omp_low_lat_mem_space = 4)
- integer omp_initial_device, omp_invalid_device
+ integer omp_initial_device, omp_invalid_device, omp_default_device
parameter (omp_initial_device = -1)
parameter (omp_invalid_device = -4)
+ parameter (omp_default_device = -5)
integer (omp_interop_kind) omp_interop_none
parameter (omp_interop_none = 0_omp_interop_kind)
integer (omp_interop_fr_kind) omp_ifr_cuda
return num_devices_openmp;
}
+static int
+gomp_get_default_device ()
+{
+ gomp_init_targets_once ();
+ struct gomp_task_icv *icv = gomp_icv (false);
+ return icv->default_device_var;
+}
+
static struct gomp_device_descr *
resolve_device (int device_id, bool remapped)
{
if ((remapped && device_id == GOMP_DEVICE_ICV)
|| device_id == GOMP_DEVICE_DEFAULT_OMP_61)
- {
- struct gomp_task_icv *icv = gomp_icv (false);
- device_id = icv->default_device_var;
- remapped = false;
- }
+ device_id = gomp_get_default_device ();
if (device_id < 0)
{
void *
omp_target_alloc (size_t size, int device_num)
{
+ if (device_num == omp_default_device)
+ device_num = gomp_get_default_device ();
+
if (device_num == omp_initial_device
|| device_num == gomp_get_num_devices ())
return malloc (size);
void
omp_target_free (void *device_ptr, int device_num)
{
+ if (device_num == omp_default_device)
+ device_num = gomp_get_default_device ();
+
if (device_num == omp_initial_device
|| device_num == gomp_get_num_devices ())
{
int
omp_target_is_present (const void *ptr, int device_num)
{
+ if (device_num == omp_default_device)
+ device_num = gomp_get_default_device ();
+
if (device_num == omp_initial_device
|| device_num == gomp_get_num_devices ())
return 1;
struct gomp_device_descr **dst_devicep,
struct gomp_device_descr **src_devicep)
{
+ if (dst_device_num == omp_default_device)
+ dst_device_num = gomp_get_default_device ();
+ if (src_device_num == omp_default_device)
+ src_device_num = gomp_get_default_device ();
+
if (dst_device_num != gomp_get_num_devices ()
/* Above gomp_get_num_devices has to be called unconditionally. */
&& dst_device_num != omp_initial_device)
void*
omp_target_memset (void *ptr, int val, size_t count, int device_num)
{
+ if (device_num == omp_default_device)
+ device_num = gomp_get_default_device ();
+
struct gomp_device_descr *devicep;
if (device_num == omp_initial_device
|| device_num == gomp_get_num_devices ()
unsigned flags = 0;
int i;
+ if (device_num == omp_default_device)
+ device_num = gomp_get_default_device ();
+
if (device_num == omp_initial_device
|| device_num == gomp_get_num_devices ()
|| (devicep = resolve_device (device_num, false)) == NULL
omp_target_associate_ptr (const void *host_ptr, const void *device_ptr,
size_t size, size_t device_offset, int device_num)
{
+ if (device_num == omp_default_device)
+ device_num = gomp_get_default_device ();
+
if (device_num == omp_initial_device
|| device_num == gomp_get_num_devices ())
return EINVAL;
void *
omp_get_mapped_ptr (const void *ptr, int device_num)
{
+ if (device_num == omp_default_device)
+ device_num = gomp_get_default_device ();
+
if (device_num == omp_initial_device
|| device_num == omp_get_initial_device ())
return (void *) ptr;
int
omp_target_is_accessible (const void *ptr, size_t size, int device_num)
{
+ if (device_num == omp_default_device)
+ device_num = gomp_get_default_device ();
+
if (device_num == omp_initial_device
|| device_num == gomp_get_num_devices ())
return true;
omp_pause_resource (omp_pause_resource_t kind, int device_num)
{
(void) kind;
+ if (device_num == omp_default_device)
+ device_num = gomp_get_default_device ();
if (device_num == omp_initial_device
|| device_num == gomp_get_num_devices ())
return gomp_pause_host ();
const char *
omp_get_uid_from_device (int device_num)
{
+ if (device_num == omp_default_device)
+ device_num = gomp_get_default_device ();
+
if (device_num < omp_initial_device || device_num > gomp_get_num_devices ())
return NULL;
--- /dev/null
+#include <omp.h>
+
+#if __cplusplus
+static_assert (omp_default_device < -1
+ && omp_default_device != omp_invalid_device, "");
+#else
+_Static_assert (omp_default_device < -1
+ && omp_default_device != omp_invalid_device, "");
+#endif
+
+static int
+is_same_dev (int d1, int d2)
+{
+ int num_dev = omp_get_num_devices ();
+ if (d1 == omp_initial_device)
+ d1 = num_dev;
+ if (d2 == omp_initial_device)
+ d2 = num_dev;
+ return (d1 == d2);
+}
+
+int
+main()
+{
+ int dev = -99;
+ int def_dev = omp_get_default_device ();
+ #pragma omp target map(from: dev) device(omp_default_device)
+ dev = omp_get_device_num ();
+
+ if (!is_same_dev (def_dev, dev))
+ __builtin_abort ();
+
+ for (def_dev = omp_initial_device; def_dev <= omp_get_num_devices ();
+ def_dev++)
+ {
+ const char* uid = omp_get_uid_from_device(def_dev);
+ omp_set_default_device (def_dev);
+ dev = -99;
+ #pragma omp target map(from: dev) device(omp_default_device)
+ dev = omp_get_device_num ();
+ if (!is_same_dev (def_dev, dev))
+ __builtin_abort ();
+
+ /* Shall not modify the ICV. */
+ omp_set_default_device (omp_default_device);
+ if (def_dev != omp_get_default_device ())
+ __builtin_abort ();
+
+ /* Assume the ptr and no only the string is the same. */
+ if (uid != omp_get_uid_from_device (omp_default_device))
+ __builtin_abort ();
+ }
+
+ omp_set_default_device (omp_invalid_device);
+ /* Shall not modify the ICV. */
+ omp_set_default_device (omp_default_device);
+ if (omp_invalid_device != omp_get_default_device ())
+ __builtin_abort ();
+}
int main()
{
const char **strs = (const char **) malloc (sizeof (char*) * (omp_get_num_devices () + 1));
- for (int i = omp_invalid_device - 1; i <= omp_get_num_devices () + 1; i++)
+ for (int i = omp_default_device - 1; i <= omp_get_num_devices () + 1; i++)
{
const char *str = omp_get_uid_from_device (i);
int dev = omp_get_device_from_uid (str);
+ if (i == omp_default_device)
+ i = omp_get_default_device ();
// __builtin_printf("%i -> %s -> %d\n", i, str, dev);
if (i < omp_initial_device || i > omp_get_num_devices ())
{
allocate(strs(0:omp_get_num_devices ()))
- do i = omp_invalid_device - 1, omp_get_num_devices () + 1
+ do j = omp_default_device - 1, omp_get_num_devices () + 1
+ i = j
str => omp_get_uid_from_device (i)
dev = omp_get_device_from_uid (str)
! print *, i, str, dev
+ if (i == omp_default_device) &
+ i = omp_get_default_device ()
if (i < omp_initial_device .or. i > omp_get_num_devices ()) then
if (dev /= omp_invalid_device .or. associated(str)) &
stop 1
--- /dev/null
+program main
+ use omp_lib
+ implicit none (type, external)
+ integer :: dev, def_dev
+
+ if (omp_default_device >= -1 .or. omp_default_device == omp_invalid_device) &
+ error stop 1
+
+ dev = -99
+ def_dev = omp_get_default_device ()
+ !$omp target map(from: dev) device(omp_default_device)
+ dev = omp_get_device_num ()
+ !$omp end target
+
+ if (.not.is_same_dev (def_dev, dev)) &
+ error stop 2
+
+ do def_dev = omp_initial_device, omp_get_num_devices ()
+ block
+ character(:), pointer :: uid
+
+ uid => omp_get_uid_from_device(def_dev)
+ call omp_set_default_device (def_dev)
+ dev = -99
+ !$omp target map(from: dev) device(omp_default_device)
+ dev = omp_get_device_num ()
+ !$omp end target
+ if (.not.is_same_dev (def_dev, dev)) &
+ error stop 3
+
+ ! Shall not modify the ICV. */
+ call omp_set_default_device (omp_default_device)
+ if (def_dev /= omp_get_default_device ()) &
+ error stop 4
+
+ ! Assume the ptr and no only the string is the same. */
+ if (.not.associated(uid, omp_get_uid_from_device (omp_default_device))) &
+ error stop 5
+ end block
+ end do
+
+ call omp_set_default_device (omp_invalid_device)
+ ! Shall not modify the ICV.
+ call omp_set_default_device (omp_default_device)
+ if (omp_invalid_device /= omp_get_default_device ()) &
+ error stop 6
+
+contains
+
+ logical function is_same_dev (d1, d2)
+ integer, value :: d1, d2
+ integer :: num_dev
+
+ num_dev = omp_get_num_devices ()
+ if (d1 == omp_initial_device) &
+ d1 = num_dev
+ if (d2 == omp_initial_device) &
+ d2 = num_dev
+ is_same_dev = d1 == d2
+ end function is_same_dev
+end program