| /* { dg-do run } */ |
| |
| #include "append-args-fr.h" |
| |
| enum { host_device, nvptx_device, gcn_device } used_device_type, used_device_type2; |
| static int used_device_num, used_device_num2; |
| static omp_interop_fr_t expected_fr, expected_fr2; |
| static _Bool is_targetsync, is_targetsync2; |
| |
| void |
| check_interop (omp_interop_t obj) |
| { |
| if (used_device_type == host_device) |
| check_host (obj); |
| else if (used_device_type == nvptx_device) |
| check_nvptx (obj, used_device_num, expected_fr, is_targetsync); |
| else if (used_device_type == gcn_device) |
| check_gcn (obj, used_device_num, expected_fr, is_targetsync); |
| else |
| __builtin_unreachable (); |
| |
| #pragma omp interop use(obj) |
| } |
| |
| void |
| check_interop2 (omp_interop_t obj, omp_interop_t obj2) |
| { |
| check_interop (obj); |
| |
| #pragma omp interop use(obj2) |
| |
| if (used_device_type2 == host_device) |
| check_host (obj2); |
| else if (used_device_type2 == nvptx_device) |
| check_nvptx (obj2, used_device_num2, expected_fr2, is_targetsync2); |
| else if (used_device_type2 == gcn_device) |
| check_gcn (obj2, used_device_num2, expected_fr2, is_targetsync2); |
| else |
| __builtin_unreachable (); |
| } |
| |
| |
| /* Check no args + one interop arg - and no prefer_type. */ |
| |
| int f0_1_tg_ (omp_interop_t obj) { check_interop (obj); return 4242; } |
| #pragma omp declare variant(f0_1_tg_) match(construct={dispatch}) append_args(interop(target)) |
| int f0_1_tg () { assert (false); return 42; } |
| |
| void f0_1_tgsy_ (omp_interop_t obj) { check_interop (obj); } |
| #pragma omp declare variant(f0_1_tgsy_) match(construct={dispatch}) append_args(interop(targetsync)) |
| void f0_1_tgsy () { assert (false); } |
| |
| int f0_1_tgtgsy_ (omp_interop_t obj) { check_interop (obj); return 3333; } |
| #pragma omp declare variant(f0_1_tgtgsy_) match(construct={dispatch}) append_args(interop(targetsync,target)) |
| int f0_1_tgtgsy () { assert (false); return 33; } |
| |
| |
| /* And with PREFER_TYPE. */ |
| |
| // nv: cuda, gcn: -, -, hip |
| void f0_1_tgsy_c_cd_hi_hs_ (omp_interop_t obj) { check_interop (obj); } |
| #pragma omp declare variant(f0_1_tgsy_c_cd_hi_hs_) match(construct={dispatch}) \ |
| append_args(interop(targetsync, prefer_type("cuda","cuda_driver", "hip", "hsa"))) |
| void f0_1_tgsy_c_cd_hi_hs () { assert (false); } |
| |
| // nv: -, cuda_driver, gcn: hsa |
| void f0_1_tgsy_hs_cd_c_hi_ (omp_interop_t obj) { check_interop (obj); } |
| #pragma omp declare variant(f0_1_tgsy_hs_cd_c_hi_) match(construct={dispatch}) \ |
| append_args(interop(targetsync, prefer_type({attr("ompx_foo")}, {fr("hsa")}, {attr("ompx_bar"), fr("cuda_driver"), attr("ompx_foobar")},{fr("cuda")}, {fr("hip")}))) |
| void f0_1_tgsy_hs_cd_c_hi () { assert (false); } |
| |
| // nv: -, hip, gcn: hsa |
| void f0_1_tgsy_hs_hi_cd_c_ (omp_interop_t obj) { check_interop (obj); } |
| #pragma omp declare variant(f0_1_tgsy_hs_hi_cd_c_) match(construct={dispatch}) \ |
| append_args(interop(targetsync, prefer_type("hsa", "hip", "cuda_driver", "cuda"))) |
| void f0_1_tgsy_hs_hi_cd_c () { assert (false); } |
| |
| |
| void |
| check_f0 () |
| { |
| if (used_device_type == nvptx_device) |
| expected_fr = omp_ifr_cuda; |
| else if (used_device_type == gcn_device) |
| expected_fr = omp_ifr_hip; |
| else /* host; variable shall not be accessed */ |
| expected_fr = omp_ifr_level_zero; |
| |
| int i; |
| if (used_device_num == DEFAULT_DEVICE) |
| { |
| is_targetsync = 0; |
| #pragma omp dispatch |
| i = f0_1_tg (); |
| assert (i == 4242); |
| |
| is_targetsync = 1; |
| #pragma omp dispatch |
| f0_1_tgsy (); |
| |
| #pragma omp dispatch |
| i = f0_1_tgtgsy (); |
| assert (i == 3333); |
| |
| |
| if (used_device_type == nvptx_device) |
| expected_fr = omp_ifr_cuda; |
| else if (used_device_type == gcn_device) |
| expected_fr = omp_ifr_hip; |
| #pragma omp dispatch |
| f0_1_tgsy_c_cd_hi_hs (); |
| |
| if (used_device_type == nvptx_device) |
| expected_fr = omp_ifr_cuda_driver; |
| else if (used_device_type == gcn_device) |
| expected_fr = omp_ifr_hsa; |
| #pragma omp dispatch |
| f0_1_tgsy_hs_cd_c_hi (); |
| |
| if (used_device_type == nvptx_device) |
| expected_fr = omp_ifr_hip; |
| else if (used_device_type == gcn_device) |
| expected_fr = omp_ifr_hsa; |
| #pragma omp dispatch |
| f0_1_tgsy_hs_hi_cd_c (); |
| } |
| else |
| { |
| is_targetsync = 0; |
| #pragma omp dispatch device(used_device_num) |
| i = f0_1_tg (); |
| assert (i == 4242); |
| |
| is_targetsync = 1; |
| #pragma omp dispatch device(used_device_num) |
| f0_1_tgsy (); |
| |
| #pragma omp dispatch device(used_device_num) |
| i = f0_1_tgtgsy (); |
| assert (i == 3333); |
| |
| |
| if (used_device_type == nvptx_device) |
| expected_fr = omp_ifr_cuda; |
| else if (used_device_type == gcn_device) |
| expected_fr = omp_ifr_hip; |
| #pragma omp dispatch device(used_device_num) |
| f0_1_tgsy_c_cd_hi_hs (); |
| |
| if (used_device_type == nvptx_device) |
| expected_fr = omp_ifr_cuda_driver; |
| else if (used_device_type == gcn_device) |
| expected_fr = omp_ifr_hsa; |
| #pragma omp dispatch device(used_device_num) |
| f0_1_tgsy_hs_cd_c_hi (); |
| |
| if (used_device_type == nvptx_device) |
| expected_fr = omp_ifr_hip; |
| else if (used_device_type == gcn_device) |
| expected_fr = omp_ifr_hsa; |
| #pragma omp dispatch device(used_device_num) |
| f0_1_tgsy_hs_hi_cd_c (); |
| } |
| } |
| |
| |
| |
| void |
| do_check (int dev) |
| { |
| int num_dev = omp_get_num_devices (); |
| const char *dev_type; |
| if (dev != DEFAULT_DEVICE) |
| omp_set_default_device (dev); |
| int is_nvptx = on_device_arch_nvptx (); |
| int is_gcn = on_device_arch_gcn (); |
| int is_host; |
| |
| if (dev != DEFAULT_DEVICE) |
| is_host = dev == -1 || dev == num_dev; |
| else |
| { |
| int def_dev = omp_get_default_device (); |
| is_host = def_dev == -1 || def_dev == num_dev; |
| } |
| |
| assert (is_nvptx + is_gcn + is_host == 1); |
| |
| if (num_dev > 0 && dev != DEFAULT_DEVICE) |
| { |
| if (is_host) |
| omp_set_default_device (0); |
| else |
| omp_set_default_device (-1); |
| } |
| |
| used_device_num = dev; |
| if (is_host) |
| { |
| dev_type = "host"; |
| used_device_type = host_device; |
| } |
| else if (is_nvptx) |
| { |
| dev_type = "nvptx"; |
| used_device_type = nvptx_device; |
| } |
| else if (is_gcn) |
| { |
| dev_type = "gcn"; |
| used_device_type = gcn_device; |
| } |
| |
| printf ("Running on the %s device (%d)\n", dev_type, dev); |
| check_f0 (); |
| } |
| |
| |
| |
| int |
| main () |
| { |
| do_check (DEFAULT_DEVICE); |
| int ndev = omp_get_num_devices (); |
| for (int dev = -1; dev < ndev; dev++) |
| do_check (dev); |
| for (int dev = -1; dev < ndev; dev++) |
| { |
| omp_set_default_device (dev); |
| do_check (DEFAULT_DEVICE); |
| } |
| } |