2015-11-02 3 views
2

Я слышал, что PSM - это библиотека, поддерживающая соответствие меток. Что такое интерфейс соответствия меток? Почему соответствие меток важно для производительности в контексте MPI?Что такое интерфейс соответствия меток?

+1

[Данная презентация] (HTTPS://www.youtube.com/watch?v=jf3C9kmRABc) на PSM, вероятно, прольет много света. –

ответ

3

Краткое введение в согласовании тегов для MPI: https://www.hpcwire.com/2006/08/18/a_critique_of_rdma-1/ раздел «Совпадение»

MPI представляет собой двусторонний интерфейс с большим согласующего пространство: MPI Recv связан с MPI Отправить по нескольким критериям таких как Отправитель, Тег и Контекст, причем первые два, возможно, игнорируются (подстановочный знак). Согласование не обязательно в порядке, и, что еще хуже, отправка MPI может быть отправлена ​​до того, как соответствующий MPI Recv ... MPI требует 64 бит соответствующей информации, а MX, Portals и QsNet предоставляют такую ​​возможность сопоставления.

InfiniBand Глаголы и другой RDMA на основе API-интерфейсы не поддерживают сопоставления на всех

Итак, это звучит как PSM является способом включить быстрое согласование в сетевых адаптеры Infiniband стиля (первые версии с подбором программного обеспечения, но с возможностью перемещения части согласования с оборудованием).

Я не могу найти общедоступную документацию PSM (в руководстве пользователя нет данных http://storusint.com/pdf/qlogic/InfiniPath%20User%20Guide%202_0.pdf). Но есть источники библиотеки: https://github.com/01org/psm

Некоторые детали перечислены в PSM2 презентации https://www.openfabrics.org/images/eventpresos/2016presentations/304PSM2Features.pdf

Что такое ПСМ? Сопрягано очереди (MQ) компонент

  • • семантически соответствует потребностям MPI с помощью тега сопоставления
  • • Обеспечивает вызовы прогресса связи гарантирует
  • • семантики завершения MQ (стандарт по сравнению с синхронизированы)

PSM API

  • • Глобальный согласующего тег API с 64-разрядные метки
  • • масштабироваться до 64К процессов на работу
  • • MQ API для обеспечения точка-точка сообщение проходит между конечными точками
  • • например psm_mq_send, psm_mq_irecv
  • • Нет функциональности «recvfrom» - необходимо для некоторых приложений

Итак, есть 64-битные метки. Каждое сообщение имеет тег, а в строке совпадающей очереди - тег (в некоторых реализациях соответствия меток есть также маска тегов). По словам источника psm_mq_internal.h: mq_req_match()https://github.com/01org/psm/blob/67c0807c74e9d445900d5541358f0f575f22a630/psm_mq_internal.h#L381, есть маска в PSM:

typedef struct psm_mq_req { 
... 
    /* Tag matching vars */ 
    uint64_t tag; 
    uint64_t tagsel;  /* used for receives */ 
... 
} psm_mq_req_t; 

mq_req_match(struct mqsq *q, uint64_t tag, int remove) 
) 
{ 
    psm_mq_req_t *curp; 
    psm_mq_req_t cur; 

    for (curp = &q->first; (cur = *curp) != NULL; curp = &cur->next) { 
     if (!((tag^cur->tag) & cur->tagsel)) { /* match! */ 
     if (remove) { 
      if ((*curp = cur->next) == NULL) /* fix tail */ 
      q->lastp = curp; 
      cur->next = NULL; 
     } 
     return cur; 
     } 
    } 

Итак, матч, когда входящий тег операции XOR с tag из принимает, отправил к MQ, результат операции AND с tagsel приемных , Если после этих операций есть только нулевые биты, совпадение найдено, иначе обрабатывается следующий прием.

Комментарий от psm_mq.h, psm_mq_irecv() функции, https://github.com/01org/psm/blob/4abbc60ab02c51efee91575605b3430059f71ab8/psm_mq.h#L206

/* Post a receive to a Matched Queue with tag selection criteria 
* 
* Function to receive a non-blocking MQ message by providing a preposted 
* buffer. For every MQ message received on a particular MQ, the tag and @c 
* tagsel parameters are used against the incoming message's send tag as 
* described in tagmatch. 
* 
* [in] mq Matched Queue Handle 
* [in] rtag Receive tag 
* [in] rtagsel Receive tag selector 
* [in] flags Receive flags (None currently supported) 
* [in] buf Receive buffer 
* [in] len Receive buffer length 
* [in] context User context pointer, available in psm_mq_status_t 
*     upon completion 
* [out] req PSM MQ Request handle created by the preposted receive, to 
*     be used for explicitly controlling message receive 
*     completion. 
* 
* [post] The supplied receive buffer is given to MQ to match against incoming 
*  messages unless it is cancelled via psm_mq_cancel @e before any 
*  match occurs. 
* 
* The following error code is returned. Other errors are handled by the PSM 
* error handler (psm_error_register_handler). 
* 
* [retval] PSM_OK The receive buffer has successfully been posted to the MQ. 
*/ 
psm_error_t 
psm_mq_irecv(psm_mq_t mq, uint64_t rtag, uint64_t rtagsel, uint32_t flags, 
     void *buf, uint32_t len, void *context, psm_mq_req_t *req); 

Пример кодирования данных в теге:

*  uint64_t tag = (((context_id & 0xffff) << 48) | 
*      ((my_rank & 0xffff) << 32) | 
*      ((send_tag & 0xffffffff))); 

С tagsel маской мы можем закодировать как "соответствовать все", «матч метки с некоторыми байты или биты, равные значению, и все в другом "," точно совпадают ".

Существует новый API PSM2, с открытым исходным кодом - https://github.com/01org/opa-psm2, руководство для программистов опубликовано в http://www.intel.com/content/dam/support/us/en/documents/network/omni-adptr/sb/Intel_PSM2_PG_H76473_v1_0.pdf.

В тегах PSM2 длиннее, а правило соответствия определяется (Олень "Message Send Tag" - значение тега передается в сообщении, и rtag является тег приема запроса): https://www.openfabrics.org/images/eventpresos/2016presentations/304PSM2Features.pdf#page=7

Tag соответствие улучшение

  • • Увеличенный размер тега до 96 бит
  • • Фундаментально ((stag^rtag) & rtagsel) == 0
  • • Поддержка wildca выстр, такие как MPI_ANY_SOURCE или MPI_ANY_TAG с использованием нулевых битов в rtagsel
  • • Позволяет практически неограниченной масштабируемостью
  • • До 64м процессов на работу

PSM2 TAG MATCHING

#define PSM_MQ_TAG_ELEMENTS 3 
typedef 
struct 
psm2_mq_tag { 
    union { 
     uint32_t tag[PSM_MQ_TAG_ELEMENTS] __attribute__((aligned(16))); 
     struct { 
      uint32_t tag0; 
      uint32_t tag1; 
      uint32_t tag2; 
     }; 
    }; 
} psm2_mq_tag_t; 
  • • Применение заполняет 'тег' или 'tag0/tag1/tag2' и переходит к PSM
  • • Оба теги и теги маска используют один и тот же 96 битного тип тега

И на самом деле есть источник равный адрес вблизи соответствующие переменные в psm2_mq_req структуре: https://github.com/01org/opa-psm2/blob/master/psm_mq_internal.h#L180

/* Tag matching vars */ 
    psm2_epaddr_t peer; 
    psm2_mq_tag_t tag; 
    psm2_mq_tag_t tagsel; /* used for receives */ 

И список программного обеспечения сканирования для матча , mq_list_scan() вызывается из mq_req_match()https://github.com/01org/opa-psm2/blob/85c07c656198204c4056e1984779fde98b00ba39/psm_mq_recv.c#L188:

psm2_mq_req_t 
mq_list_scan(struct mqq *q, psm2_epaddr_t src, psm2_mq_tag_t *tag, int which, uint64_t *time_threshold) 
{ 
    psm2_mq_req_t *curp, cur; 

    for (curp = &q->first; 
     ((cur = *curp) != NULL) && (cur->timestamp < *time_threshold); 
     curp = &cur->next[which]) { 
     if ((cur->peer == PSM2_MQ_ANY_ADDR || src == cur->peer) && 
      !((tag->tag[0]^cur->tag.tag[0]) & cur->tagsel.tag[0]) && 
      !((tag->tag[1]^cur->tag.tag[1]) & cur->tagsel.tag[1]) && 
      !((tag->tag[2]^cur->tag.tag[2]) & cur->tagsel.tag[2])) { 
      *time_threshold = cur->timestamp; 
      return cur; 
     } 
    } 
    return NULL; 
} 
Смежные вопросы