這裏是爲了澄清我的意思是一個例子:
首先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操作在哪裏「分裂」?
感謝您的幫助!
謝謝,這有助於很多!因此,我認爲所有在GPU上運行時將常規操作拆分爲多個流操作的情況都是由於cuDNN和/或cuBLAS造成的? –
我不是100%確定的,但我認爲還有一些情況是Eigen實現的內核會生成多個流操作(例如多個小型memcpy操作)。但是,大多數性能關鍵的內核使用cuDNN/cuBLAS。 – mrry