Ich habe ein paar Multi-Core-Computer durch Infiniband-Netzwerk verbunden. Ich würde gerne einige Low-Latency-Berechnungen in einem Pool von gemeinsam genutztem Speicher mit entfernten atomaren Operationen durchführen. Ich weiß RDMA ist der Weg zu gehen. Auf jedem Knoten würde ich eine Speicherregion (und Schutzdomäne) für die gemeinsame Nutzung von Daten registrieren.
Die Online-RDMA-Beispiele konzentrieren sich häufig auf eine einzelne Verbindung zwischen einem Single-Thread-Server und einem Singlethread-Client. Jetzt möchte ich einen Multi-Thread-Prozess auf jedem der Infiniband-Knoten haben. Ich bin sehr verwirrt über die folgenden ...
Wie viele Warteschlangenpaare sollte ich auf jedem Knoten für einen Cluster aus insgesamt n Knoten und m Threads vorbereiten? Um genauer zu sein, können mehrere Threads auf demselben Knoten dasselbe Warteschlangenpaar teilen?
Wie viele Abschlusswarteschlangen sollte ich auf jedem Knoten vorbereiten? Ich werde mehrere Threads haben, die entfernte Lese- / Schreib- / Cas-Operationen auf jedem Knoten ausgeben. Wenn sie sich eine gemeinsame Beendigungswarteschlange teilen, werden die Fertigstellungsereignisse durcheinander gebracht. Wenn die Threads eigene getrennte Completion-Queues haben, gibt es sehr viele davon.
Schlagen Sie mir vor, vorhandene Bibliotheken zu haben, anstatt diese Software zu schreiben? (hmm, oder sollte ich einen schreiben und Open-Source es?: -)
Danke für Ihre freundlichen Vorschläge.
Unter Linux ist die Bibliothek der InfiniBand-Verben vollständig Thread-sicher. So können Sie so viele oder so wenige Warteschlangenpaare (QPs) in Ihrer Multithread-Anwendung verwenden, wie Sie möchten - mehrere Threads können Arbeitsanforderungen sicher an einen einzelnen QP senden, obwohl Sie natürlich sicherstellen müssen, dass alle ausstehenden Prozesse überwacht werden Anfragen usw., die Sie in Ihrer eigenen Anwendung ausführen, sind Thread-sicher.
Es ist richtig, dass jede Sendewarteschlange und jede Empfangswarteschlange (denken Sie daran, dass QP wirklich ein Paar von Warteschlangen ist :) an eine einzelne Beendigungswarteschlange (CQ) angehängt ist. Wenn also jeder Thread sein eigenes CQ haben soll, benötigt jeder Thread ein eigenes QP, in das er arbeiten kann.
Im Allgemeinen sind QPs und CQs nicht wirklich eine begrenzte Ressource - Sie können leicht Hunderte oder Tausende auf einem einzigen Knoten ohne Probleme haben. So können Sie Ihre App so gestalten, dass Sie sich nicht zu viele Gedanken über die absolute Anzahl der verwendeten Warteschlangen machen müssen. Das bedeutet nicht, dass Sie sich keine Gedanken über die Skalierbarkeit machen müssen. Wenn Sie beispielsweise viele Empfangswarteschlangen und viele Puffer pro Warteschlange haben, können Sie bei der Empfangspufferung zu viel Speicher binden, so dass Sie am Ende sind Sie müssen freigegebene Empfangswarteschlangen (SRQs) verwenden.
Es gibt eine Reihe von Middlewarebibliotheken, die IB verwenden; wahrscheinlich ist MPI (zB Ссылка ) der bekannteste, und es lohnt sich, dies zu prüfen, bevor Sie zu weit gehen, um Dinge neu zu erfinden. Die MPI-Entwickler haben auch eine Menge Forschung über die effiziente Verwendung von IB / RDMA veröffentlicht, was wahrscheinlich einen Besuch wert ist, falls Sie sich entscheiden, Ihr eigenes System zu bauen.
Tags und Links infiniband rdma