Virtual Channels

Top  Previous  Next

By default, if the tasks joined by a CONNECT statement are on different processors, the configurer attempts to use a virtual channel to connect the two tasks. Virtual channels are very flexible:


Messages sent to tasks on distant processors are automatically forwarded via intermediate network nodes;

A single WIRE can support any number of virtual channels;

Virtual connections between tasks are not limited to the available physical links between processors.

In short, any task can communicate with any other task, on any processor, irrespective of the physical network layout. This flexibility must clearly come at a price; a certain amount of software overhead is required to implement virtual channels.

 

The throughput of a virtual channel may be up to 50-55% of a physical channel for long messages sent to a procesor via an intermediate processor. Performance drops for shorter messages, down to about 30% of a physical channel for messages of 1KB, and below 10% for short messages of fewer than 100 words. Performance also drops when messages must be forwarded through many intermediate nodes. Note that these overheads are to a large extent inherent in any software message-routing system, especially when, like Diamond, the routing is managed in such a way as to prevent transmission deadlocks being introduced. It is possible to tune virtual channel performance for your application using the UPR MAX and UPR BUFFERS configuration language statements.

 

There is a current limitation in the use of virtual channels: a virtual channel can connect two processors only of the same general type, for example both must be C6000 processors; an FPGA cannot actively participate in supporting a virtual channel although it can support devices used by WIREs involved in the path. In addition, there must be a path of wires between these processors that passes through only other processors of the same type. For example, you cannot have a virtual channel between ROOT and N3 in the following example:

 

PROCESSOR ROOT TYPE=C6000

PROCESSOR N1   TYPE=ARM

PROCESSOR N2   TYPE=C6000

PROCESSOR N3   TYPE=C6000

WIRE ? ROOT[DEV:0] N1[DEV:3]

WIRE ? N1[DEV:0]   N2[DEV:3]

WIRE ? N2[DEV:0]   N3[DEV:3]

 

However, if you added another WIRE from ROOT to N2, you would be able to have a virtual channel between ROOT and N3.