How to define and use a distributable function
version
1.0.0
scope
Example.
This code is provided as example code for a user to base their code on.
description
How to define and use a distributable function
boards
Unless otherwise specified, this example runs on the SliceKIT Core Board, but can easily be run on any XMOS device by using a different XN file.
If a task is a never-ending loop containing a single select (like a combinable function) that only has cases responding to interface messages then the function can be marked as distributable. For example:
[[distributable]]
void port_wiggler(server interface wiggle_if c, port p)
{
// This task waits for a message on the interface c and
// wiggles the port p the required number of times.
while (1) {
select {
case c.wiggle(int n):
printstrln("Wiggling port.");
for (int i=0;i<n;i++) {
p <: 1;
p <: 0;
}
break;
case c.finish():
return;
}
}
}
A distributable task can be distributed within a par. This means that the task will not run on any particular core but will be run on the core of the task that calls to it.
int main() {
interface wiggle_if c;
par {
task1(c);
[[distribute]] port_wiggler(c, p);
}
return 0;
}
A distributed task must be on the same tile as the tasks it is connected to.