Skip to content

Commit 36f0d0a

Browse files
authored
Merge pull request #243 from bonachea/prif_0.6_dev
Add `prif_initial_team_index` procedures to `caffeine:main`
2 parents 35fe896 + 8df1351 commit 36f0d0a

File tree

4 files changed

+197
-8
lines changed

4 files changed

+197
-8
lines changed

docs/implementation-status.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,9 @@ are accepted, but in some cases, the associated runtime behavior is not fully im
8989
| `prif_image_index` | **YES** | |
9090
| `prif_image_index_with_team` | **YES** | |
9191
| `prif_image_index_with_team_number` | *partial* | no support for sibling teams |
92+
| `prif_initial_team_index` | **YES** | expected in PRIF 0.6 |
93+
| `prif_initial_team_index_with_team` | **YES** | expected in PRIF 0.6 |
94+
| `prif_initial_team_index_with_team_number` | *partial* | expected in PRIF 0.6, no support for sibling teams |
9295

9396
---
9497

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

test/prif_image_index_test.F90

Lines changed: 112 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,10 @@ module caf_image_index_test
66
prif_this_image_no_coarray, &
77
prif_form_team, prif_change_team, prif_end_team, &
88
prif_image_index_with_team, prif_image_index_with_team_number, &
9+
prif_initial_team_index, prif_initial_team_index_with_team, prif_initial_team_index_with_team_number, &
910
prif_this_image_with_coarray, prif_this_image_with_dim, &
1011
prif_lcobound_no_dim, prif_ucobound_no_dim, &
11-
prif_num_images_with_team
12+
prif_num_images_with_team, PRIF_INITIAL_TEAM
1213
use veggies, only: result_t, test_item_t, assert_equals, assert_that, describe, it, succeed
1314

1415
implicit none
@@ -19,7 +20,7 @@ function test_prif_image_index() result(tests)
1920
type(test_item_t) :: tests
2021

2122
tests = describe( &
22-
"prif_image_index", &
23+
"prif_image_index and prif_initial_team_index", &
2324
[ it("returns 1 for the simplest case", check_simple_case) &
2425
, it("returns 1 when given the lower bounds", check_lower_bounds) &
2526
, it("returns 0 with invalid subscripts", check_invalid_subscripts) &
@@ -36,13 +37,17 @@ function check_this_image_coarray(coarray_handle, corank, team) result(result_)
3637
type(result_t) :: result_
3738

3839
integer(c_int64_t) :: co, cosubscripts(corank), colbound(corank), coubound(corank)
39-
integer(c_int) :: i, me
40+
integer(c_int) :: i, me, me_initial
41+
type(prif_team_type) :: initial_team
42+
43+
call prif_get_team(PRIF_INITIAL_TEAM, team=initial_team)
4044

4145
result_ = succeed("")
4246

4347
call prif_lcobound_no_dim(coarray_handle, colbound)
4448
call prif_ucobound_no_dim(coarray_handle, coubound)
4549
call prif_this_image_no_coarray(team, me)
50+
call prif_this_image_no_coarray(initial_team, me_initial)
4651

4752
call prif_this_image_with_coarray(coarray_handle, team=team, cosubscripts=cosubscripts)
4853
do i=1,corank
@@ -60,6 +65,15 @@ function check_this_image_coarray(coarray_handle, corank, team) result(result_)
6065
call prif_image_index(coarray_handle, cosubscripts, i)
6166
end if
6267
result_ = result_ .and. assert_equals(i, me)
68+
69+
! and prif_initial_team_index
70+
if (present(team)) then
71+
call prif_initial_team_index_with_team(coarray_handle, cosubscripts, team, i)
72+
else
73+
call prif_initial_team_index(coarray_handle, cosubscripts, i)
74+
end if
75+
result_ = result_ .and. assert_equals(i, me_initial)
76+
6377
end function
6478

6579
function check_simple_case() result(result_)
@@ -80,6 +94,9 @@ function check_simple_case() result(result_)
8094
call prif_image_index(coarray_handle, [1_c_int64_t], image_index=answer)
8195
result_ = assert_equals(1_c_int, answer)
8296

97+
call prif_initial_team_index(coarray_handle, [1_c_int64_t], initial_team_index=answer)
98+
result_ = result_ .and. assert_equals(1_c_int, answer)
99+
83100
result_ = result_ .and. &
84101
check_this_image_coarray(coarray_handle, 1)
85102

@@ -104,6 +121,9 @@ function check_lower_bounds() result(result_)
104121
call prif_image_index(coarray_handle, [2_c_int64_t, 3_c_int64_t], image_index=answer)
105122
result_ = assert_equals(1_c_int, answer)
106123

124+
call prif_initial_team_index(coarray_handle, [2_c_int64_t, 3_c_int64_t], initial_team_index=answer)
125+
result_ = result_ .and. assert_equals(1_c_int, answer)
126+
107127
result_ = result_ .and. &
108128
check_this_image_coarray(coarray_handle, 2)
109129

@@ -139,7 +159,7 @@ function check_complicated_2d() result(result_)
139159

140160
type(prif_coarray_handle) :: coarray_handle
141161
type(c_ptr) :: allocated_memory
142-
integer(c_int) :: answer, ni
162+
integer(c_int) :: answer, ni, expected
143163
call prif_num_images(num_images=ni)
144164

145165
call prif_allocate_coarray( &
@@ -150,7 +170,13 @@ function check_complicated_2d() result(result_)
150170
coarray_handle = coarray_handle, &
151171
allocated_memory = allocated_memory)
152172
call prif_image_index(coarray_handle, [1_c_int64_t, 3_c_int64_t], image_index=answer)
153-
result_ = assert_equals(merge(3_c_int,0_c_int,ni >= 3), answer)
173+
expected = merge(3_c_int,0_c_int,ni >= 3)
174+
result_ = assert_equals(expected, answer)
175+
176+
if (expected > 0) then
177+
call prif_initial_team_index(coarray_handle, [1_c_int64_t, 3_c_int64_t], initial_team_index=answer)
178+
result_ = result_ .and. assert_equals(expected, answer)
179+
end if
154180

155181
result_ = result_ .and. &
156182
check_this_image_coarray(coarray_handle, 2)
@@ -163,7 +189,7 @@ function check_complicated_3d() result(result_)
163189

164190
type(prif_coarray_handle) :: coarray_handle
165191
type(c_ptr) :: allocated_memory
166-
integer(c_int) :: answer, ni
192+
integer(c_int) :: answer, ni, expected
167193
type(prif_team_type) :: initial_team
168194
call prif_get_team(team=initial_team)
169195
call prif_num_images_with_team(team=initial_team, num_images=ni)
@@ -178,7 +204,15 @@ function check_complicated_3d() result(result_)
178204
call prif_image_index_with_team(coarray_handle, &
179205
[2_c_int64_t, 1_c_int64_t, 1_c_int64_t], &
180206
team=initial_team, image_index=answer)
181-
result_ = assert_equals(merge(8_c_int,0_c_int,ni >= 8), answer)
207+
expected = merge(8_c_int,0_c_int,ni >= 8)
208+
result_ = assert_equals(expected, answer)
209+
210+
if (expected > 0) then
211+
call prif_initial_team_index_with_team(coarray_handle, &
212+
[2_c_int64_t, 1_c_int64_t, 1_c_int64_t], &
213+
team=initial_team, initial_team_index=answer)
214+
result_ = result_ .and. assert_equals(expected, answer)
215+
endif
182216

183217
result_ = result_ .and. &
184218
check_this_image_coarray(coarray_handle, 3)
@@ -209,12 +243,14 @@ function check_complicated_2d_team() result(result_)
209243
coarray_handle = coarray_handle, &
210244
allocated_memory = allocated_memory)
211245

212-
which_team = merge(1_c_int64_t, 2_c_int64_t, mod(me, 2) == 0)
246+
which_team = merge(2_c_int64_t, 1_c_int64_t, mod(me, 2) == 0)
213247
call prif_form_team(team_number = which_team, team = child_team)
214248
call prif_change_team(child_team)
215249

216250
call prif_num_images_with_team(team=child_team, num_images=cni)
217251

252+
! image_index lcobound
253+
218254
call prif_image_index_with_team(coarray_handle, &
219255
[0_c_int64_t, 2_c_int64_t], &
220256
team=initial_team, image_index=answer)
@@ -245,6 +281,40 @@ function check_complicated_2d_team() result(result_)
245281
result_ = result_ .and. &
246282
assert_equals(1_c_int, answer)
247283

284+
! initial_team_index lcobound
285+
286+
call prif_initial_team_index_with_team(coarray_handle, &
287+
[0_c_int64_t, 2_c_int64_t], &
288+
initial_team, answer)
289+
result_ = result_ .and. &
290+
assert_equals(1_c_int, answer)
291+
292+
call prif_initial_team_index_with_team_number(coarray_handle, &
293+
[0_c_int64_t, 2_c_int64_t], &
294+
-1_c_int64_t, answer)
295+
result_ = result_ .and. &
296+
assert_equals(1_c_int, answer)
297+
298+
call prif_initial_team_index_with_team(coarray_handle, &
299+
[0_c_int64_t, 2_c_int64_t], &
300+
child_team, answer)
301+
result_ = result_ .and. &
302+
assert_equals(merge(1_c_int,2_c_int,which_team==1), answer)
303+
304+
call prif_initial_team_index_with_team_number(coarray_handle, &
305+
[0_c_int64_t, 2_c_int64_t], &
306+
which_team, answer)
307+
result_ = result_ .and. &
308+
assert_equals(merge(1_c_int,2_c_int,which_team==1), answer)
309+
310+
call prif_initial_team_index(coarray_handle, &
311+
[0_c_int64_t, 2_c_int64_t], &
312+
answer)
313+
result_ = result_ .and. &
314+
assert_equals(merge(1_c_int,2_c_int,which_team==1), answer)
315+
316+
! image_index 3
317+
248318
call prif_image_index_with_team(coarray_handle, &
249319
[0_c_int64_t, 3_c_int64_t], &
250320
team=initial_team, image_index=answer)
@@ -275,6 +345,40 @@ function check_complicated_2d_team() result(result_)
275345
result_ = result_ .and. &
276346
assert_equals(merge(3_c_int,0_c_int,cni >= 3), answer)
277347

348+
! initial_team_index 3
349+
if (ni >= 3) then
350+
call prif_initial_team_index_with_team(coarray_handle, &
351+
[0_c_int64_t, 3_c_int64_t], &
352+
team=initial_team, initial_team_index=answer)
353+
result_ = result_ .and. &
354+
assert_equals(3_c_int, answer)
355+
356+
call prif_initial_team_index_with_team_number(coarray_handle, &
357+
[0_c_int64_t, 3_c_int64_t], &
358+
team_number=-1_c_int64_t, initial_team_index=answer)
359+
result_ = result_ .and. &
360+
assert_equals(3_c_int, answer)
361+
end if
362+
if (cni >= 3) then
363+
call prif_initial_team_index_with_team(coarray_handle, &
364+
[0_c_int64_t, 3_c_int64_t], &
365+
team=child_team, initial_team_index=answer)
366+
result_ = result_ .and. &
367+
assert_equals(merge(5_c_int,6_c_int,which_team==1), answer)
368+
369+
call prif_initial_team_index_with_team_number(coarray_handle, &
370+
[0_c_int64_t, 3_c_int64_t], &
371+
team_number=which_team, initial_team_index=answer)
372+
result_ = result_ .and. &
373+
assert_equals(merge(5_c_int,6_c_int,which_team==1), answer)
374+
375+
call prif_initial_team_index(coarray_handle, &
376+
[0_c_int64_t, 3_c_int64_t], &
377+
initial_team_index=answer)
378+
result_ = result_ .and. &
379+
assert_equals(merge(5_c_int,6_c_int,which_team==1), answer)
380+
end if
381+
278382
result_ = result_ .and. &
279383
check_this_image_coarray(coarray_handle, 2, initial_team)
280384
result_ = result_ .and. &

0 commit comments

Comments
 (0)