| ! { dg-do run } |
| |
| program main |
| use omp_lib |
| |
| implicit none |
| |
| integer, parameter :: N = 100 |
| integer :: a(N) |
| integer :: on_device_count = 0 |
| integer :: i |
| |
| do i = 1, N |
| a(i) = i |
| end do |
| |
| do i = 0, omp_get_num_devices () |
| on_device_count = on_device_count + f (a, i) |
| end do |
| |
| if (on_device_count .ne. omp_get_num_devices ()) stop 1 |
| |
| do i = 1, N |
| if (a(i) .ne. 2 * i) stop 2; |
| end do |
| contains |
| integer function f (a, num) |
| integer, intent(inout) :: a(N) |
| integer, intent(in) :: num |
| integer :: on_device |
| integer :: i |
| |
| on_device = 0 |
| !$omp metadirective & |
| !$omp& when (target_device={device_num(num), kind("gpu")}: & |
| !$omp& target parallel do map(to: a(1:N)), map(from: on_device)) & |
| !$omp& default (parallel do private(on_device)) |
| do i = 1, N |
| a(i) = a(i) + i |
| on_device = 1 |
| end do |
| f = on_device; |
| end function |
| end program |