Warum ist CUDA-Speicher so schnell fixiert?

83

Ich beobachte erhebliche Beschleunigungen bei der Datenübertragung, wenn ich für die CUDA-Datenübertragung fixierten Speicher verwende. Unter Linux ist mlock der zugrunde liegende Systemaufruf, um dies zu erreichen. In der Manpage von mlock heißt es, dass das Sperren der Seite das Austauschen verhindert:

mlock () sperrt Seiten im Adressbereich, beginnend mit addr und weiter für len Bytes. Alle Seiten, die einen Teil des angegebenen Adressbereichs enthalten, befinden sich garantiert im RAM, wenn der Anruf erfolgreich zurückgegeben wird.

In meinen Tests hatte ich ein paar Gigs freien Speicher auf meinem System, so dass nie das Risiko bestand, dass die Speicherseiten ausgetauscht wurden, aber ich beobachtete trotzdem die Beschleunigung. Kann jemand erklären, was hier wirklich los ist? Jeder Einblick oder jede Information wird sehr geschätzt.

Gearoid Murphy
quelle
Haben Sie die Zeit von mlock selbst gemessen?
Osgx
Nein, die tatsächliche Zeit, die zum Ausführen des mlock-Aufrufs benötigt wird, wird als vernachlässigbar angesehen (wenn Sie danach fragen). Der tatsächliche Overhead ist die tatsächliche Datenübertragung, die in meinem Algorithmus einen erheblichen Bruchteil der gesamten Zykluszeit ausmacht.
Gearoid Murphy
Was ist deine CPU? Möglicherweise profitieren NUMA-fähige Knoten nicht von einfach mlock().
Osgx
AMD Phenom (tm) II X4 970 Prozessor
Gearoid Murphy

Antworten:

81

Der CUDA-Treiber prüft , ob der Speicherbereich gesperrt ist oder nicht, und verwendet dann einen anderen Codepfad. Der gesperrte Speicher wird im physischen Speicher (RAM) gespeichert, sodass das Gerät ihn ohne Hilfe von der CPU abrufen kann (DMA, auch bekannt als Async-Kopie; Gerät benötigt nur eine Liste der physischen Seiten). Nicht gesperrter Speicher kann beim Zugriff einen Seitenfehler erzeugen und wird nicht nur im Speicher gespeichert (z. B. kann er ausgetauscht werden). Daher muss der Treiber auf jede Seite des nicht gesperrten Speichers zugreifen, sie in einen angehefteten Puffer kopieren und übergeben zu DMA (Syncronious, Seite für Seite Kopie).

Wie hier beschrieben http://forums.nvidia.com/index.php?showtopic=164661

Der vom asynchronen Mem-Kopieraufruf verwendete Hostspeicher muss über cudaMallocHost oder cudaHostAlloc seitengesperrt sein.

Ich kann auch empfehlen, die Handbücher von cudaMemcpyAsync und cudaHostAlloc unter developer.download.nvidia.com zu lesen. HostAlloc sagt, dass der Cuda-Treiber einen fixierten Speicher erkennen kann:

Der Treiber verfolgt die mit dieser Funktion (cudaHostAlloc) zugewiesenen virtuellen Speicherbereiche und beschleunigt automatisch Aufrufe von Funktionen wie cudaMemcpy ().

osgx
quelle
1
Ich frage mich, wie viel Chaos Sie anrichten können, wenn ein anderer Thread versucht, die Seiten nach dem Ausgeben der asynchronen Kopierbefehle zu blockieren.
Zan Lynx
1
Zan Lynx, Interessante Frage. Warum möchten Sie diesen Speicher entsperren? Selbst auf einem 32-Bit-PC können bis zu 2-4 GB Speicher gesperrt sein, und mehr, wenn die PCI-Express-Karte Zugriff auf 64-Bit-Adressen (in echten 40- oder 48-Bit-Adressen) hat. Es ist viel, viel billiger, mehr Speicher zu kaufen, als für einen hoch abgelaufenen Programmierer (18.000 Wiederholungen! Auf SO) zu bezahlen. Wie unter Linux denke ich (glaube), wird Munlock blockiert oder gibt einen Fehler zurück und es wird kein Schaden am System verursacht.
Osgx
Kann ich cudaHostRegisterauf den Zeiger auf eine Speicherzuordnungsdatei anwenden ?
Tomilov Anatoliy
12

CUDA verwendet DMA, um fixierten Speicher an die GPU zu übertragen. Pageable Host-Speicher kann nicht mit DMA verwendet werden, da sie sich möglicherweise auf der Festplatte befinden. Wenn der Speicher nicht fixiert ist (dh seitengesperrt), wird er zuerst in einen seitengesperrten "Staging" -Puffer kopiert und dann über DMA auf die GPU kopiert. Wenn Sie also den fixierten Speicher verwenden, sparen Sie Zeit beim Kopieren vom pagbaren Hostspeicher in den seitengesperrten Hostspeicher.

Shen Yang
quelle
5

Wenn auf die Speicherseiten noch nicht zugegriffen wurde, wurden sie wahrscheinlich zunächst nie ausgetauscht . Insbesondere sind neu zugewiesene Seiten virtuelle Kopien der universellen "Nullseite" und haben keine physische Instanziierung, bis sie beschrieben werden. Neue Karten von Dateien auf der Festplatte bleiben ebenfalls nur auf der Festplatte, bis sie gelesen oder geschrieben werden.

R .. GitHub HÖREN SIE AUF, EIS ZU HELFEN
quelle
Ich denke, es ist kein Fall (ich schreibe darüber in einer frühen Variante meiner Antwort), da es sich um ein echtes Programm handelt und das Programm mlock()schnell war (siehe Kommentar Nr. 2 zum Q).
Osgx