blob: 4de192177f8d488bee6aa6f70f70a005c3539e81 [file] [log] [blame]
/* { dg-do compile } */
/* { dg-additional-options "-fdump-tree-optimized" } */
/* In configurations without offloading configured, we can resolve many
instances of the target_device context selector at gimplification time
instead of waiting until late resolution. */
/* Device 0 may be either the host or an offloading device, in configurations
that support them. */
void
f1 (int n, double* a, double s)
{
#pragma omp metadirective \
when (target_device={device_num(0), kind(host)} \
: parallel for) \
default (error at(execution) message("f1 match failed"))
for (int i = 0; i < n; i++)
a[i] = a[i] * s;
}
/* { dg-final { scan-tree-dump-not "f1 match failed" "optimized" { target { ! offloading_enabled } } } } */
/* { dg-final { scan-tree-dump "f1 match failed" "optimized" { target offloading_enabled } } } */
/* Device -1 is always the host, even in offloading configurations. */
void
f2 (int n, double* a, double s)
{
#pragma omp metadirective \
when (target_device={device_num(-1), kind(host)} \
: parallel for) \
default (error at(execution) message("f2 match failed"))
for (int i = 0; i < n; i++)
a[i] = a[i] * s;
}
/* { dg-final { scan-tree-dump-not "f2 match failed" "optimized" } } */
/* Constant device numbers < -1 cause the match to fail, even in offloading
configurations. */
void
f3 (int n, double* a, double s)
{
#pragma omp metadirective \
when (target_device={device_num(-42), kind(host)} \
: error at(execution) message("f3 match failed")) \
default (parallel for)
for (int i = 0; i < n; i++)
a[i] = a[i] * s;
}
/* { dg-final { scan-tree-dump-not "f3 match failed" "optimized" } } */
/* In a non-offloading configuration, devices > 0 are always invalid and
will cause the match to fail. In an offload configuration, we don't
know at compile-time if the device number is valid or if it refers to
a host or offload device. */
void
f4 (int n, double* a, double s)
{
#pragma omp metadirective \
when (target_device={device_num(42), kind(host)} \
: error at(execution) message("f4 match failed")) \
default (parallel for)
for (int i = 0; i < n; i++)
a[i] = a[i] * s;
}
/* { dg-final { scan-tree-dump-not "f4 match failed" "optimized" { target { ! offloading_enabled } } } } */
/* { dg-final { scan-tree-dump "f4 match failed" "optimized" { target offloading_enabled } } } */
extern int omp_get_initial_device (void);
extern int omp_get_default_device (void);
extern int omp_get_num_devices (void);
extern int omp_get_device_num (void);
/* On a non-offloading configuration, omp_get_default_device() always refers
to the host. With offloading, we know it's a valid device number but
not whether it's the host. */
void
f5 (int n, double* a, double s)
{
#pragma omp metadirective \
when (target_device={device_num(omp_get_default_device ()), kind(host)} \
: parallel for) \
default (error at(execution) message("f5 match failed"))
for (int i = 0; i < n; i++)
a[i] = a[i] * s;
}
/* { dg-final { scan-tree-dump-not "f5 match failed" "optimized" { target { ! offloading_enabled } } } } */
/* { dg-final { scan-tree-dump "f5 match failed" "optimized" { target offloading_enabled } } } */
/* omp_get_initial_device() always refers to the host, whether offloading is
configured or not. */
void
f6 (int n, double* a, double s)
{
#pragma omp metadirective \
when (target_device={device_num(omp_get_initial_device ()), kind(host)} \
: parallel for) \
default (error at(execution) message("f6 match failed"))
for (int i = 0; i < n; i++)
a[i] = a[i] * s;
}
/* { dg-final { scan-tree-dump-not "f6 match failed" "optimized" } } */
/* omp_get_num_devices() returns the number of non-host offload devices,
therefore using it as a device number always refers to the host, whether
offloading is enabled or not. */
void
f7 (int n, double* a, double s)
{
#pragma omp metadirective \
when (target_device={device_num(omp_get_num_devices ()), kind(host)} \
: parallel for) \
default (error at(execution) message("f7 match failed"))
for (int i = 0; i < n; i++)
a[i] = a[i] * s;
}
/* { dg-final { scan-tree-dump-not "f7 match failed" "optimized" } } */
/* omp_get_device_num() always returns a valid device number but we don't
know whether it's the host or offload device, in configurations that
support offloading. */
void
f8 (int n, double* a, double s)
{
#pragma omp metadirective \
when (target_device={device_num(omp_get_device_num ()), kind(host)} \
: parallel for) \
default (error at(execution) message("f8 match failed"))
for (int i = 0; i < n; i++)
a[i] = a[i] * s;
}
/* { dg-final { scan-tree-dump-not "f8 match failed" "optimized" { target { ! offloading_enabled } } } } */
/* { dg-final { scan-tree-dump "f8 match failed" "optimized" { target offloading_enabled } } } */