7.1. GM

GM je knihovna pro přenos zpráv po síti Myrinet. Procesy v GM vlastní send a receive tokens, které reprezentují buffer na jednu zprávu. Adresace v GM používá ID uzlů, která přiděluje daemon současně vyhledávající routes, programy pak k odesílání používají porty, což jsou struktury v podstatě reprezentující otevřené spojení na daném rozhraní.

K odeslání zprávy se volá gm_send_with_callback (data, size, priority, callback, context, port, target ...), které odebere jeden send token a asynchronně odešle zprávu, pak gm_receive (), které čeká na GM událost, při příjmu správné události pak gm_unknown (), které zpracovává default události, z něj GM zavolá callback (context, status ...) a vrátí jeden send token.

void gm_send_with_callback (
  struct gm_port *p,
  void *message,
  unsigned int size,
  gm_size_t len,
  unsigned int priority,
  unsigned int target_node_id,
  unsigned int target_port_id,
  gm_send_completion_callback_t callback,
  void *context
);
gm_recv_event_t *gm_receive (
  gm_port_t *p);

void gm_unknown (
  gm_port_t *p,
  gm_recv_event_t *e
);

K přijetí zprávy konkrétní délky a priority se volá gm_provide_receive_buffer (port, buffer, size, priority ...), které odebere jeden receive token, pak gm_receive (), které čeká na GM událost, při příjmu správné události GM vyplní buffer a vrátí jeden receive token.

void gm_provide_receive_buffer_with_tag (
  gm_port_t *p,
  void *ptr,
  unsigned size,
  unsigned priority,
  unsigned int tag
);

Od aplikací se očekává, že dají GM vždy nejméně jeden, lépe dva buffery, pro každou délku a prioritu zprávy, kterou mohou přijmout. To dovoluje aplikaci vždy jeden buffer zpracovávat, zatímco GM druhý plní. Všechny buffery musí být alokovány pomocí gm_dma_alloc (), aby je GM mohla efektivně použít.

Hlavní myšlenkou je rozhraní, kde se nemusí během komunikace nic dynamicky alokovat, což dovoluje dosáhnout minimální režie knihovny.

http://www.myri.com/scs/GM/doc/html

http://www.myri.com/scs/GM-2/doc/html