2016-09-14 3 views
1

In der GPUDevice Code, habe ich festgestellt, dass eine GPUDeviceContext pro Stream gemacht wird.TensorFlow Device Kontexte, Streams und Kontextwechsel

Dies ist der Zweck, so dass jeder Kontext einen OpKernelContext steuern kann und dann, da die verschiedenen Streams ausgeführt werden müssen, die Kontexte einfach umgeschaltet werden können, die unterschiedliche Daten/Codes auf die GPU schieben und dann ausführen.

Werden die verschiedenen Streams als unterschiedliche Geräte registriert (z. B. '/ gpu: 0' und '/ gpu: 1')?

Pro this, ThreadPoolDevices haben keine Kontexte, aber wenn ich Kontexte in ThreadPoolDevice hinzufügen würde, würden sie am besten als eine Art ThreadContext passen?

Antwort

1

Für die GPU führen wir einige Streams zur Ausführung: einen Compute-Stream (auf dem die meisten Rechenkerne laufen) und einige Memcopy-Streams (zur Ausführung von Memcopies zwischen Host und Gerät und umgekehrt). Dies geschieht, um die Kommunikation und die Berechnung auf GPU-Geräten zu überlappen, ist aber speziell auf die Art und Weise, wie wir GPUs verwenden, zurückzuführen. Man könnte leicht auch nur einen GPU-Stream für alle Berechnungen und Kommunikation erstellen und es wäre korrekt, obwohl langsamer.

Wir wollen den Berechnungsstrom zu Kerneln, die Berechnungen durchführen, und den Memcopy-Stream zu den Kerneln, die kopieren. Wir erstellen ein GPUDeviceContext-Objekt für jeden Stream und übergeben dann das richtige Gerätekontextobjekt an den OpKernelContext.

Die einzelnen Implementierungen spiegeln also die Eigenschaften des asynchronen Hardwaregeräts (GPU) wider, weshalb das ThreadPoolDevice nicht über diese Mechanismen verfügt. Auf der CPU ist die gesamte Berechnung synchron, so dass keine Abstraktion wie Streams erforderlich ist.

Das Ausführungsmodell der benutzerdefinierten Hardware bestimmt wahrscheinlich, welche Art von Status und Verwaltung eine benutzerdefinierte Geräteunterstützung in TensorFlow erfordert.

+0

Ich war auch besorgt über die tatsächliche Initialisierung der Gerätekontexte, aber es scheint, dass Sie sie im Konstruktor des 'BaseGPUDevice' initialisieren und sie dann halten, bis Sie' FillContextMap' ausführen. Letztendlich frage ich mich, warum die Ausführungsengine null Kontexte hatte. Ich nehme an, das liegt daran, dass ich sie nicht in die Kontextkarte gedrängt habe. Können Sie bestätigen, dass dies zu einem Nullptr-Problem führen würde? https://github.com/tensorflow/tensorflow/blob/73ced9d797056c7e67a06ed2098dd809d85ec44a/tensorflow/core/common_runtime/gpu/gpu_device.cc#L338 –