TensorFlow设备上下文、流和上下文切换

TensorFlow设备上下文、流和上下文切换,tensorflow,Tensorflow,在代码中,我注意到每个流都有一个 这样做的目的是,每个上下文都可以控制一个OpKernelContext,然后当需要执行各种流时,可以切换上下文,将不同的数据/代码推送到GPU上,然后执行 不同的流是否注册为不同的设备(即“/gpu:0”和“/gpu:1”) 根据,ThreadPoolDevice没有上下文,但如果我将上下文添加到ThreadPoolDevice中,它们是否最适合作为ThreadContext的一种 对于GPU,我们维护了一些用于执行的流:一个计算流(大多数计算内核在其上运行)和

在代码中,我注意到每个流都有一个

这样做的目的是,每个上下文都可以控制一个OpKernelContext,然后当需要执行各种流时,可以切换上下文,将不同的数据/代码推送到GPU上,然后执行

不同的流是否注册为不同的设备(即“/gpu:0”和“/gpu:1”)


根据,ThreadPoolDevice没有上下文,但如果我将上下文添加到ThreadPoolDevice中,它们是否最适合作为ThreadContext的一种

对于GPU,我们维护了一些用于执行的流:一个计算流(大多数计算内核在其上运行)和一些memcopy流(用于在主机和设备之间执行memcopies,反之亦然)。这样做是为了在GPU设备上重叠通信和计算,但对于我们使用GPU的方式来说是特殊的。也可以很容易地为所有计算和通信创建一个GPU流,这是正确的,尽管速度较慢

我们希望将计算流提供给执行计算的内核,将memcopy流提供给执行复制的内核。我们为每个流创建一个gpudevicontext对象,然后将正确的设备上下文对象传递给OpKernelContext

因此,这里的特定实现反映了异步硬件设备(GPU)的属性,这就是ThreadPoolDevice没有这些机制的原因。在CPU上,所有的计算都是同步的,所以不需要像流这样的抽象


自定义硬件的执行模型可能会决定自定义设备支持在TensorFlow中需要何种状态和管理。

我还关心设备上下文的实际初始化,但是,您似乎在
BaseGPUDevice
的构造函数中初始化它们,然后将它们保持到运行
FillContextMap
为止。最后,我想知道为什么执行引擎有空上下文。我想这是因为我没有把它们放到上下文映射中。您能否确认这会导致nullptr问题?