Channels

Channels are streamed connections or pipes between a pair of chares. They simplify the expression of sends/receives from inside a coroutine without having to exit the coroutine.

Creation

To create a Channel:

  • Channel(chare, remote):

    Establish a channel between chare and remote, returning a channel object.

    Note that chare is an actual chare object, not a proxy. remote is a proxy to the remote chare.

    Channels do not have to be created from coroutines, but they can only be used from coroutines.

    There is no restriction on the number of channels that a chare can establish, and it can establish multiple channels with the same remote.

Methods

Channel objects have the following methods:

  • send(self, *args):

    Send the arguments through the channel to the remote chare.

  • recv(self):

    Receives arguments (unpacked) from the channel. Messages are received in order.

Example

from charm4py import charm, Chare, Array, coro, Channel

NUM_ITER = 100

class A(Chare):

    def __init__(self, numchares):
        myidx = self.thisIndex[0]
        neighbors = []
        neighbors.append(self.thisProxy[(myidx + 1) % numchares])
        neighbors.append(self.thisProxy[(myidx - 1) % numchares])
        self.channels = []
        for nb in neighbors:
            self.channels.append(Channel(self, remote=nb))

    @coro
    def work(self):
        for i in range(NUM_ITER):
            for ch in self.channels:
                ch.send(x, y, z)

            for ch in charm.iwait(self.channels):
                x, y, z = ch.recv()
                # ... do something with data ...

def main(args):
    numchares = charm.numPes() * 8
    array = Array(A, numchares, args=[numchares])
    future = array.work(awaitable=True)
    future.get()
    exit()

charm.start(main)