は、私が何を意味するかを明確にする例を示します
まずsession.run():
First run of a TensorFlow session最初のtf.session.run()は、後の実行とは大幅に異なります。どうして?ここ
その後session.run():
Later runs of a TensorFlow session
私はTensorFlowがここにいくつかの初期化を行っている理解しますしかし、私はソースのどこにこれが現れているか知りたいと思います。これはCPUおよびGPUで発生しますが、その効果はGPUでより顕著です。たとえば、明示的なConv2D操作の場合、最初の実行では、GPUストリームのConv2D操作量がはるかに大きくなります。実際、Conv2Dの入力サイズを変更すると、数十から数百のストリームConv2D操作になる可能性があります。しかし、後の実行では、GPUストリームには(入力サイズに関係なく)常に5つのConv2D操作しか存在しません。 CPUで実行している場合、最初の実行では後の実行と比較して同じ操作リストが保持されますが、同じ時間の不一致があります。
TensorFlowソースのどの部分がこの動作を担当していますか? GPU操作はどこに分かれていますか?
ありがとうございました!デフォルトで— TensorFlowは、できるだけ速く、後続の畳み込みを実行する方法を選択することcuDNNの自動チューニング機能を使用しています—ので
ありがとう、これは多くの助けになります!これから、私は、通常の操作が複数のストリーム操作に分割され、GPU上で実行されるケースがcuDNNおよび/またはcuBLASに起因すると仮定します。 –
私は100%確信しているわけではありませんが、固有の実装カーネルが複数のストリーム操作(複数の小さなmemcpy操作など)を生成するケースもあると思います。しかし、パフォーマンスに重要なカーネルのほとんどはcuDNN/cuBLASを使用します。 – mrry