Skip to content

Commit ec39bc7

Browse files
committed
Implement prif_initial_team_index
Based on the proposed spec currently in PRIF PR 126
1 parent 35fe896 commit ec39bc7

File tree

2 files changed

+82
-0
lines changed

2 files changed

+82
-0
lines changed

src/caffeine/coarray_queries_s.F90

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,61 @@ subroutine image_index_helper(coarray_handle, sub, num_images, image_index)
102102
end if
103103
end procedure
104104

105+
!---------------------------------------------------------------------
106+
107+
subroutine initial_index_helper(coarray_handle, sub, team, initial_team_index)
108+
implicit none
109+
type(prif_coarray_handle), intent(in) :: coarray_handle
110+
integer(c_int64_t), intent(in) :: sub(:)
111+
type(prif_team_type), intent(in) :: team
112+
integer(c_int), intent(out) :: initial_team_index
113+
114+
integer :: dim
115+
integer(c_int) :: prior_size, image_index
116+
117+
call_assert(coarray_handle_check(coarray_handle))
118+
119+
associate (info => coarray_handle%info)
120+
call_assert(size(sub) == info%corank)
121+
call_assert(sub(1) .ge. info%lcobounds(1) .and. sub(1) .le. info%ucobounds(1))
122+
image_index = 1 + INT(sub(1) - info%lcobounds(1), c_int)
123+
prior_size = 1
124+
! Future work: values of prior_size are invariant across calls w/ the same coarray_handle
125+
! We could store them in the coarray metadata at allocation rather than redundantly
126+
! computing them here, which would accelerate calls with corank > 1 by removing
127+
! corank multiply/add operations and the loop-carried dependence
128+
do dim = 2, size(sub)
129+
prior_size = prior_size * INT(info%ucobounds(dim-1) - info%lcobounds(dim-1) + 1, c_int)
130+
call_assert(sub(dim) .ge. info%lcobounds(dim) .and. sub(dim) .le. info%ucobounds(dim))
131+
image_index = image_index + INT(sub(dim) - info%lcobounds(dim), c_int) * prior_size
132+
end do
133+
end associate
134+
135+
call_assert(image_index .le. team%info%num_images)
136+
initial_team_index = caf_image_to_initial(team%info%gex_team, image_index)
137+
call_assert(initial_team_index .ge. 1 .and. initial_team_index .le. initial_team%num_images)
138+
end subroutine
139+
140+
module procedure prif_initial_team_index
141+
call initial_index_helper(coarray_handle, sub, current_team, initial_team_index)
142+
end procedure
143+
144+
module procedure prif_initial_team_index_with_team
145+
call initial_index_helper(coarray_handle, sub, team, initial_team_index)
146+
end procedure
147+
148+
module procedure prif_initial_team_index_with_team_number
149+
if (team_number == -1) then
150+
call initial_index_helper(coarray_handle, sub, prif_team_type(initial_team), initial_team_index)
151+
else if (team_number == current_team%info%team_number) then
152+
call initial_index_helper(coarray_handle, sub, current_team, initial_team_index)
153+
else
154+
call unimplemented("prif_initial_team_index_with_team_number: no support for sibling teams")
155+
end if
156+
end procedure
157+
158+
!---------------------------------------------------------------------
159+
105160
module procedure prif_local_data_pointer
106161
call_assert(coarray_handle_check(coarray_handle))
107162

src/prif.F90

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ module prif
2424
public :: prif_alias_create, prif_alias_destroy
2525
public :: prif_lcobound_with_dim, prif_lcobound_no_dim, prif_ucobound_with_dim, prif_ucobound_no_dim, prif_coshape
2626
public :: prif_image_index, prif_image_index_with_team, prif_image_index_with_team_number
27+
public :: prif_initial_team_index, prif_initial_team_index_with_team, prif_initial_team_index_with_team_number
2728
public :: prif_this_image_no_coarray, prif_this_image_with_coarray, prif_this_image_with_dim
2829
public :: prif_num_images, prif_num_images_with_team, prif_num_images_with_team_number
2930
public :: prif_failed_images, prif_stopped_images, prif_image_status
@@ -503,6 +504,32 @@ module subroutine prif_image_index_with_team_number(coarray_handle, sub, team_nu
503504
integer(c_int), intent(out) :: image_index
504505
end subroutine
505506

507+
module subroutine prif_initial_team_index(coarray_handle, sub, initial_team_index, stat)
508+
implicit none
509+
type(prif_coarray_handle), intent(in) :: coarray_handle
510+
integer(c_int64_t), intent(in) :: sub(:)
511+
integer(c_int), intent(out) :: initial_team_index
512+
integer(c_int), intent(out), optional :: stat
513+
end subroutine
514+
515+
module subroutine prif_initial_team_index_with_team(coarray_handle, sub, team, initial_team_index, stat)
516+
implicit none
517+
type(prif_coarray_handle), intent(in) :: coarray_handle
518+
integer(c_int64_t), intent(in) :: sub(:)
519+
type(prif_team_type), intent(in) :: team
520+
integer(c_int), intent(out) :: initial_team_index
521+
integer(c_int), intent(out), optional :: stat
522+
end subroutine
523+
524+
module subroutine prif_initial_team_index_with_team_number(coarray_handle, sub, team_number, initial_team_index, stat)
525+
implicit none
526+
type(prif_coarray_handle), intent(in) :: coarray_handle
527+
integer(c_int64_t), intent(in) :: sub(:)
528+
integer(c_int64_t), intent(in) :: team_number
529+
integer(c_int), intent(out) :: initial_team_index
530+
integer(c_int), intent(out), optional :: stat
531+
end subroutine
532+
506533
module subroutine prif_num_images(num_images)
507534
implicit none
508535
integer(c_int), intent(out) :: num_images

0 commit comments

Comments
 (0)