2012-02-27 13 views
8

Ho alcuni computer multi-core collegati dalla rete Infiniband. Mi piacerebbe avere un calcolo a bassa latenza su un pool di memoria condivisa, con operazioni atomiche remote. So che RDMA è la strada da percorrere. Su ciascun nodo vorrei registrare un'area di memoria (e un dominio di protezione) per la condivisione dei dati.Condivisione della memoria RDMA

Gli esempi RDMA in linea spesso si concentrano su una singola connessione tra un server a thread singolo e un client a thread singolo. Ora mi piacerebbe avere un processo multi-thread su ciascuno dei nodi Infiniband. Sono molto perplesso circa la seguente ...

  1. Quante paia coda devo prepararmi su ciascun nodo, per un cluster di n nodi e le discussioni m in totale? Per essere più specifici, più thread sullo stesso nodo condividono la stessa coppia di code?

  2. Quante code di completamento devo preparare su ciascun nodo? Avrò più thread che pubblicano operazioni remote read/write/cas su ciascun nodo. Se dovessero condividere una coda di completamento comune, gli eventi di completamento verranno confusi. Se i thread hanno le loro code di completamento separate, ce ne sarebbero davvero molte.

  3. Mi consigliate di avere eventuali librerie esistenti invece di scrivere questo software? (Hmm, o dovrei scrivere una e open-source è? :-)

Grazie per il suggerimento tipo (s).

risposta

8

Su Linux, almeno, la libreria dei verbi InfiniBand è completamente sicura per i thread. In questo modo puoi utilizzare tante o poche coppie di code (QP) nella tua app multi-thread come desideri: più thread possono inviare le richieste di lavoro a un singolo QP in modo sicuro, anche se ovviamente dovrai assicurarti che il monitoraggio di tutte le eccezioni richieste, ecc. che fai nella tua applicazione sono thread-safe.

È vero che ogni coda di invio e ogni coda di ricezione (ricorda che QP è in realtà una coppia di code :) è collegata a una singola coda di completamento (CQ). Quindi, se vuoi che ogni thread abbia il proprio CQ, ogni thread avrà bisogno del proprio QP per inviare il lavoro.

In generale, QP e CQ non sono in realtà una risorsa limitata: si possono facilmente avere centinaia o migliaia su un singolo nodo senza problemi. Così puoi progettare la tua app senza preoccuparti troppo del numero assoluto di code che stai utilizzando. Questo non vuol dire che non ci si debba preoccupare della scalabilità - ad esempio se si hanno molte code di ricezione e molti buffer per coda, allora si può accumulare troppa memoria nel buffer di ricezione, quindi si finisce bisogno di usare le code di ricezione condivise (SRQ).

Esistono numerose librerie middleware che utilizzano IB; probabilmente MPI (es. http://open-mpi.org/) è il più noto e probabilmente vale la pena di valutarlo prima di andare troppo lontano a reinventare le cose. Gli sviluppatori di MPI hanno anche pubblicato molte ricerche sull'uso efficiente di IB/RDMA, che probabilmente vale la pena cercare nel caso in cui decidessi di costruire il tuo sistema.

+0

E il codice sorgente delle coppie di code (QP), coda di completamento (CQ) e code di ricezione condivise (SRQ) devono scrivere da soli, oppure posso preparare la loro implementazione (come best practice) e dove possono prendere? – Alex

Problemi correlati