Receive(data, source_process);
Receives a value into the variable or array data from the specified
source process.
Broadcast(data, source_process);
The specified process sends the data with all of the other processes.
Each process must call this function with a variable of the same type and
size as the first argument.
Barrier();
When a process encounters this function call, it must wait until all
of the other processes have reached a call of the same function. After
that they can all continue with the execution of the program.
int main()
{
int my_id;
... // Initialize and get process id.
if (my_id == 0)
Master();
else
Slave();
... // Some final statements.
return 0;
}
Send-Receive. For each process i1 calling the function
Send(data1, i2);the process i2 must call the function
Receive(data2, i1);Unless specified otherwise, these are blocking send and receive: each process must wait until the matching call has been issued by the second process for the Send/Receive calls to be finished.
In these function calls, data1 and data2 must have the same type and size. The combination of the two function calls has the effect that
| Master function (id = 0) | Slave function (id = 1 to n-1) |
| Input(a);
Broadcast(a, 0); Input(b); Broadcast(b, 0); sum_i = Integral(a, a+(b-a)/n, F); integral = sum_i; for (i=0; i<n; i++) { Receive(sum_i, i); integral = integral + sum_i; } Output(integral); |
Broadcast(a, 0);
Broadcast(b, 0);
Send(sum_i, 0);
|
Second example: the IVP solver. s0 and s, are real arrays of size n, which is both the number of dimensions of the curve s and the number of processes. We have a different function to compute the derivative of the curve for each dimension.
if (id == 0)
Read(s0); // master
Broadcast(s0, 0);
Copy(s0, s);
for (t=0.0; t<c; t=t+delta_t) {
sprime=Fid(s);
s[id] = s[id]+sprime* delta_t;
for (i=0; i<n; i++)
Broadcast(s[i],
i);
if (id == 0)
Write(s); // master
}