2016-07-04 4 views
0

Ich habe ein Multi-Thread-Programm, das auf 6 GPU-Geräten laufen soll. Ich möchte auf jedem Gerät 6 Streams öffnen, die ich während der Laufzeit meines Programms wiederverwenden kann (insgesamt 36).mehrere Streams in einem GPU-Gerät

Ich benutze cudaStreamCreate() cublasCreate() cublasSetStream() um jeden Stream und Handle zu erstellen. Ich verwende auch einen GPU-Speichermonitor, um die Speicherbelegung für jeden Griff zu sehen. Wenn ich jedoch die GPU-Speicherauslastung für jedes Gerät anschaue, wächst sie nur bei der ersten Stream-Erstellung und ändert sich nicht in den übrigen von mir erstellten Streams.

Soweit ich weiß gibt es keine Begrenzung für die Anzahl der Streams, die ich verwenden möchte. Aber ich kann nicht herausfinden, warum die Speichernutzung der Handles und der Streams nicht auf der GPU-Speichernutzung angezeigt wird.

+1

Die Erstellung des ersten Streams auf jedem Gerät initialisiert wahrscheinlich den CUDA-Kontext für dieses Gerät. Dies wird eine signifikante/spürbare Menge an Speicherverbrauch mit sich bringen. Die zusätzlichen Stream-Kreationen auf jedem Gerät beinhalten diese Kontextinitialisierung nicht, so dass die zusätzliche Speicherbelegung im Vergleich dazu winzig (oder null) ist. –

Antwort

2

Alle von Ihnen erstellten Streams befinden sich in einem einzigen Kontext auf einem bestimmten Gerät, sodass beim Erstellen zusätzlicher Streams nach dem ersten kein kontextbezogener Overhead entsteht. Die Ströme selbst sind leichtgewichtig und sind (meistens) eine Host-seitige Scheduler-Abstraktion. Wie Sie gesehen haben, verbrauchen sie nicht viel (wenn überhaupt) Gerätespeicher.