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.
mlock()
.Antworten:
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
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:
quelle
cudaHostRegister
auf den Zeiger auf eine Speicherzuordnungsdatei anwenden ?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.
quelle
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.
quelle
mlock()
schnell war (siehe Kommentar Nr. 2 zum Q).