mirror of
https://github.com/OpenMP/Examples.git
synced 2025-04-07 23:22:11 +01:00
34 lines
833 B
Fortran
34 lines
833 B
Fortran
! @@name: tasking.13f
|
|
! @@type: F-free
|
|
! @@compilable: yes
|
|
! @@linkable: no
|
|
! @@expect: success
|
|
recursive subroutine bin_search(pos, n, state)
|
|
use omp_lib
|
|
integer :: pos, n
|
|
character, pointer :: state(:)
|
|
character, target, dimension(n) :: new_state1, new_state2
|
|
integer, parameter :: LIMIT = 3
|
|
if (pos .eq. n) then
|
|
call check_solution(state)
|
|
return
|
|
endif
|
|
!$omp task final(pos > LIMIT) mergeable
|
|
if (.not. omp_in_final()) then
|
|
new_state1(1:pos) = state(1:pos)
|
|
state => new_state1
|
|
endif
|
|
state(pos+1) = 'z'
|
|
call bin_search(pos+1, n, state)
|
|
!$omp end task
|
|
!$omp task final(pos > LIMIT) mergeable
|
|
if (.not. omp_in_final()) then
|
|
new_state2(1:pos) = state(1:pos)
|
|
state => new_state2
|
|
endif
|
|
state(pos+1) = 'y'
|
|
call bin_search(pos+1, n, state)
|
|
!$omp end task
|
|
!$omp taskwait
|
|
end subroutine
|