Skip to content

Commit a8a9516

Browse files
feat: create co_min implementation
1 parent 80ea45c commit a8a9516

File tree

4 files changed

+126
-9
lines changed

4 files changed

+126
-9
lines changed

src/caffeine/collective_subroutines/co_max_s.f90

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,8 @@
1010
call unimplemented("prif_co_max")
1111
end procedure
1212

13+
module procedure prif_co_max_character
14+
call unimplemented("prif_co_max_character")
15+
end procedure
16+
1317
end submodule co_max_s
Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,60 @@
11
! Copyright (c), The Regents of the University of California
22
! Terms of use are as specified in LICENSE.txt
33
submodule(prif:prif_private_s) co_min_s
4-
4+
use iso_c_binding, only: c_loc, c_f_pointer
55
implicit none
66

77
contains
88

99
module procedure prif_co_min
10-
call unimplemented("prif_co_min")
10+
call contiguous_co_min(a, result_image, stat, errmsg, errmsg_alloc)
11+
end procedure
12+
13+
subroutine contiguous_co_min(a, result_image, stat, errmsg, errmsg_alloc)
14+
implicit none
15+
type(*), intent(inout), target, contiguous :: a(..)
16+
integer(c_int), intent(in), optional :: result_image
17+
integer(c_int), intent(out), optional :: stat
18+
character(len=*), intent(inout), optional :: errmsg
19+
character(len=:), intent(inout), allocatable, optional :: errmsg_alloc
20+
21+
if (present(stat)) stat=0
22+
23+
call caf_co_min( &
24+
a, &
25+
optional_value(result_image), &
26+
int(product(shape(a)), c_size_t), &
27+
current_team%info%gex_team)
28+
end subroutine
29+
30+
module procedure prif_co_min_character
31+
call unimplemented("prif_co_min_character")
32+
! integer(c_size_t), target :: char_len
33+
! procedure(prif_operation_wrapper_interface), pointer :: op
34+
35+
! char_len = len(a)
36+
! op => char_min_wrapper
37+
! call prif_co_reduce(a, op, c_loc(char_len), result_image, stat, errmsg, errmsg_alloc)
1138
end procedure
1239

40+
! subroutine char_min_wrapper(arg1, arg2_and_out, count, cdata) bind(C)
41+
! type(c_ptr), intent(in), value :: arg1, arg2_and_out
42+
! integer(c_size_t), intent(in), value :: count
43+
! type(c_ptr), intent(in), value :: cdata
44+
45+
! integer(c_size_t), pointer :: char_len
46+
! integer(c_size_t) :: i
47+
48+
! if (count == 0) return
49+
! call c_f_pointer(cdata, char_len)
50+
! block
51+
! character(len=char_len,kind=c_char), pointer :: lhs(:), rhs_and_result(:)
52+
! call c_f_pointer(arg1, lhs, [count])
53+
! call c_f_pointer(arg2_and_out, rhs_and_result, [count])
54+
! do i = 1, count
55+
! if (lhs(i) <= rhs_and_result(i)) rhs_and_result(i) = lhs(i)
56+
! end do
57+
! end block
58+
! end subroutine
59+
1360
end submodule co_min_s

src/prif.F90

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ module prif
2929
public :: prif_failed_images, prif_stopped_images, prif_image_status
3030
public :: prif_local_data_pointer, prif_set_context_data, prif_get_context_data, prif_size_bytes
3131
public :: prif_co_sum, prif_co_max, prif_co_min, prif_co_reduce, prif_co_broadcast
32+
public :: prif_co_min_character, prif_co_max_character
3233
public :: prif_operation_wrapper_interface
3334
public :: prif_form_team, prif_change_team, prif_end_team, prif_get_team, prif_team_number
3435
public :: prif_sync_all, prif_sync_images, prif_sync_team, prif_sync_memory

test/caf_co_min_test.f90

Lines changed: 72 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
module caf_co_min_test
2-
use prif, only : prif_co_min, prif_this_image_no_coarray, prif_num_images
2+
use iso_c_binding, only: c_int32_t, c_int64_t, c_float, c_double
3+
use prif, only : prif_co_min, prif_co_min_character, prif_this_image_no_coarray, prif_num_images
34
use veggies, only: result_t, test_item_t, assert_equals, describe, it, succeed
45

56
implicit none
@@ -22,27 +23,91 @@ function test_prif_co_min() result(tests)
2223

2324
function check_32_bit_integer() result(result_)
2425
type(result_t) :: result_
25-
result_ = succeed("temporarily")
26+
27+
integer(c_int32_t), parameter :: values(*) = [1, 19, 5, 13, 11, 7, 17, 3]
28+
integer :: me, ni, i
29+
integer(c_int32_t) :: my_val, expected
30+
31+
call prif_this_image_no_coarray(this_image=me)
32+
call prif_num_images(ni)
33+
34+
my_val = values(mod(me-1, size(values))+1)
35+
call prif_co_min(my_val)
36+
37+
expected = minval([(values(mod(i-1,size(values))+1), i = 1, ni)])
38+
result_ = assert_equals(expected, my_val)
2639
end function
2740

2841
function check_64_bit_integer() result(result_)
2942
type(result_t) :: result_
30-
result_ = succeed("temporarily")
43+
44+
integer(c_int64_t), parameter :: values(*,*) = reshape([1, 19, 5, 13, 11, 7, 17, 3], [2, 4])
45+
integer :: me, ni, i
46+
integer(c_int64_t), dimension(size(values,1)) :: my_val, expected
47+
48+
call prif_this_image_no_coarray(this_image=me)
49+
call prif_num_images(ni)
50+
51+
my_val = values(:, mod(me-1, size(values,2))+1)
52+
call prif_co_min(my_val)
53+
54+
expected = minval(reshape([(values(:, mod(i-1,size(values,2))+1), i = 1, ni)], [size(values,1),ni]), dim=2)
55+
result_ = assert_equals(int(expected), int(my_val))
3156
end function
3257

3358
function check_32_bit_real() result(result_)
3459
type(result_t) :: result_
35-
result_ = succeed("temporarily")
60+
61+
real(c_float), parameter :: values(*,*,*) = reshape([1, 19, 5, 13, 11, 7, 17, 3], [2,2,2])
62+
integer :: me, ni, i
63+
real(c_float), dimension(size(values,1), size(values,2)) :: my_val, expected
64+
65+
call prif_this_image_no_coarray(this_image=me)
66+
call prif_num_images(ni)
67+
68+
my_val = values(:, :, mod(me-1, size(values,3))+1)
69+
call prif_co_min(my_val)
70+
71+
expected = minval(reshape([(values(:,:,mod(i-1,size(values,3))+1), i = 1, ni)], [size(values,1), size(values,2), ni]), dim=3)
72+
result_ = assert_equals(real(expected,kind=c_double), real(my_val,kind=c_double))
3673
end function
3774

3875
function check_64_bit_real() result(result_)
3976
type(result_t) :: result_
40-
result_ = succeed("temporarily")
77+
78+
real(c_double), parameter :: values(*,*) = reshape([1, 19, 5, 13, 11, 7, 17, 3], [2, 4])
79+
integer :: me, ni, i
80+
real(c_double), dimension(size(values,1)) :: my_val, expected
81+
82+
call prif_this_image_no_coarray(this_image=me)
83+
call prif_num_images(ni)
84+
85+
my_val = values(:, mod(me-1, size(values,2))+1)
86+
call prif_co_min(my_val)
87+
88+
expected = minval(reshape([(values(:, mod(i-1,size(values,2))+1), i = 1, ni)], [size(values,1),ni]), dim=2)
89+
result_ = assert_equals(expected, my_val)
4190
end function
4291

4392
function check_character() result(result_)
44-
type(result_t) :: result_
45-
result_ = succeed("temporarily")
93+
type(result_t) result_
94+
result_ = succeed("skip for now")
95+
! character(len=*), parameter :: values(*) = &
96+
! [ "To be ","or not " &
97+
! , "to ","be. " &
98+
! , "that ","is " &
99+
! , "the ","question"]
100+
! integer :: me, ni, i
101+
! character(len=len(values)) :: my_val, expected
102+
103+
! call prif_this_image_no_coarray(this_image=me)
104+
! call prif_num_images(ni)
105+
106+
! my_val = values(mod(me-1, size(values))+1)
107+
! call prif_co_min_character(my_val)
108+
109+
! expected = minval([(values(mod(i-1,size(values))+1), i = 1, ni)])
110+
! result_ = assert_equals(expected, my_val)
46111
end function
47112

48113
end module caf_co_min_test

0 commit comments

Comments
 (0)