接下来介绍一下tensorflow对设备devices的发现和管理,负责运行kernel的具体硬件设备抽象成为devices;实现某种操作的算法叫做kernel,可以将kernel看做是一段能够跑在具体硬件设备上的算法程序,所以相同的算法实现,在gpu上有一套实现,在cpu上有一套实现。
在session初始化时会调用add_device接口,把cpu gpu设备添加到session到devices_表中。
上图主要介绍再本地运行时tensorflow内部对设备的抽象模型以及在源码中对设备抽象的类的继承关系,非本地的设备抽象类时remotedevice,这里不再详细介绍。
GPUCompatibleCPUDevice实例:
1)将 cpu 的计算资源抽象为thread pool,以支持多thread之间的并发执行;
2)将主机内存抽象为 CPUAllocator 实例来进行管理,为cpu kernel、gpu kernel提供主机内存的申请、释放功能;
(如何对cpu资源抽象可以进一步研究的点)
GPUDevice实例:
1)将gpu的计算资源抽象为streams, 由于目前只支持NVIDIA的gpu,所以这里我们可以看作抽象为cuda streams,多个cuda streams之间的计算可以并发处理;
2)通过GPUBFCAllocator实例来管理显存,为gpu kernel提供显存的申请、释放功能。
(gpu资源管理以及与cuda库的配合可以作为可以继续研究的点)
Tensorflow系统中可用的device实例在session初始化时创建,并由该session使用,归属于该session,device的创建使用的是factory模式。
该图主要描述了graph运行时时如何与device的抽象类交互,devices_是在session初始化时构建生成,里面包含了该session所有的可用设备,executor执行器会把graph中相应得node交给设备运行,其实就是在设备上执行node对应得opkernel。