2016-09-14 4 views
1

GPUDeviceコードでは、ストリームごとに1つずつGPUDeviceContextが作成されています。TensorFlowデバイスのコンテキスト、ストリーム、およびコンテキストの切り替え

すべてのコンテキストが1つのOpKernelContextを制御できるようにし、さまざまなストリームを実行する必要があるときにコンテキストを切り替えるだけで、異なるデータ/コードをGPUにプッシュして実行します。

さまざまなストリームが異なるデバイス(つまり、 '/ gpu:0'と '/ gpu:1')として登録されますか?

thisの場合、ThreadPoolDeviceにはコンテキストはありませんが、ThreadPoolDeviceにコンテキストを追加すると、ThreadContextの一種として最も適していますか?

答えて

1

GPUでは、計算ストリーム(ほとんどの計算カーネルが実行される)といくつかのmemcopyストリーム(ホストとデバイスの間でmemcopiesを実行するために、逆も同様)を実行するストリームをいくつか維持します。これは、GPUデバイス上で通信と計算を重複させるために行われますが、GPUを使用する方法に特有です。 1つのGPUストリームをすべての計算と通信用に簡単に作成することもできますが、遅くても正しいはずです。

計算ストリームは計算を行い、memcopyストリームはコピーを行うカーネルに渡します。ストリームごとにGPUDeviceContextオブジェクトを作成し、正しいデバイスコンテキストオブジェクトをOpKernelContextに渡します。

ここでの特定の実装は、非同期ハードウェアデバイス(GPU)のプロパティを反映しているため、ThreadPoolDeviceにはこのような種類のメカニズムがありません。 CPU上ではすべての計算が同期的なので、ストリームなどの抽象化の必要はありません。

カスタムハードウェアの実行モデルは、TensorFlowでカスタムデバイスサポートが必要とする状態と管理の種類を決定する可能性があります。

+0

私はデバイスコンテキストの実際の初期化についても心配していましたが、 'BaseGPUDevice'のコンストラクタでそれらを初期化し、' FillContextMap'を実行するまでそれらを保持するように見えます。最終的に、なぜ実行エンジンにnullコンテキストがあるのか​​不思議です。私はコンテキストマップにそれらをプッシュしていなかったので、これが仮定しています。これがnullptrの問題を引き起こすかどうか確認できますか? https://github.com/tensorflow/tensorflow/blob/73ced9d797056c7e67a06ed2098dd809d85ec44a/tensorflow/core/common_runtime/gpu/gpu_device.cc#L338 –

関連する問題