pvm_reduce - Performs a reduce operation over members of the specified group.
C int info = pvm_reduce( void (*func)(), void *data, int count, int datatype, int msgtag, char *group, int rootginst)
Fortran call pvmfreduce(func, data, count, datatype, msgtag, group, rootginst, info)
func Function which defines the operation performed on the global data. Predefined are PvmMax, PvmMin, PvmSum and PvmProduct. Users can define their own function.
SYNOPSIS for func
count Integer specifying the number of elements of datatype in the data array.
Integer specifying the type of the entries in the data array. (See below for defined types)
msgtag Integer message tag supplied by the user. msgtag should be >= 0. It allows the user's program to distinguish between different kinds of messages.
group Character string group name of an existing group.
Integer instance number of group member who gets the result.
info Integer status code returned by the routine. Values less than zero indicate an error.
pvm_reduce() performs global operations such as max, min, and sum over all the tasks in a group. All group members call pvm_reduce() with their local data, and the result of the reduction operation appears on the user specified root task root. The root task is identified by its instance number in the group.
PVM supplies the following predefined functions that can be specified in func.
PvmMax and PvmMin are implemented for datatypes byte, short, integer, long, float, double, complex, and double complex. For complex values the minimum [maximum] is that complex pair with the minimum [maximum] modulus. PvmSum and PvmProduct are implemented for datatypes short, integer, long, float, double, complex, and double complex.
C and Fortran defined datatypes are:
Note: pvm_reduce() does not block. If a task calls pvm_reduce and then leaves the group before the root has called pvm_reduce an error may occur.
The current algorithm is very simple and robust. A future implementation may make more efficient use of the architecture to allow greater parallelism.
info = pvm_reduce(PvmMax, &myvals, 10, PVM_INT, msgtag, "workers", rootginst);
CALL PVMFREDUCE(PvmMax, MYVALS, COUNT, INT4, & MTAG, `workers', ROOT, INFO)
These error conditions can be returned by pvm_reduce