co_reduce
determines element-wise the reduction of the value of a
on all images of the current team. The pure function passed as operator
is used to pairwise reduce the values of a
by passing either the value of a
of different images or the result values of such a reduction as argument. If a
is an array, the deduction is done element wise. If result_image
is present, the result values are returned in a
on the specified image only and the value of a
on the other images become undefined. If result_image
is not present, the value is returned on all images. If the execution was successful and stat
is present, it is assigned the value zero. If the execution failed, stat
gets assigned a nonzero value and, if present, errmsg
gets assigned a value describing the occurred error.
TS 18508 or later
call co_reduce(a, operator, [, result_image, stat, errmsg])
a
- is an intent(inout)
argument and shall be nonpolymorphic. If it is allocatable, it shall be allocated; if it is a pointer, it shall be associated. a
shall have the same type and type parameters on all images of the team; if it is an array, it shall have the same shape on all images.operator
- pure function with two scalar nonallocatable arguments, which shall be nonpolymorphic and have the same type and type parameters as a
. The function shall return a nonallocatable scalar of the same type and type parameters as a
. The function shall be the same on all images and with regards to the arguments mathematically commutative and associative. Note that operator
may not be an elemental function, unless it is an intrisic function.result_image
- (optional) a scalar integer expression; if present, it shall have the same the same value on all images and refer to an image of the current team.stat
- (optional) a scalar integer variableerrmsg
- (optional) a scalar character variableprogram test
integer :: val
val = this_image()
call co_reduce(val, result_image=1, operator=myprod)
if (this_image() == 1) then
write(*,*) "Product value", val ! prints num_images() factorial
end if
contains
pure function myprod(a, b)
integer, value :: a, b
integer :: myprod
myprod = a * b
end function myprod
end program test
While the rules permit in principle an intrinsic function, none of the intrinsics in the standard fulfill the criteria of having a specific function, which takes two arguments of the same type and returning that type as result.
co_min, co_max, co_sum, co_broadcast