文章(7)介绍的DeviceBase类是TensorFlow设备的基类,它提供了CPU,GPU管理需要的基本数据结构。Device类在DeviceBase的基础上,添加了一些新的数据结构,这些数据结构覆盖了内存,显存管理,线程同步,远程调用等功能。粗略说来,DeviceBase专注于单个设备的管理,而Device类也关注多设备协作。
首先看Device类的构造函数,路径为tensorflow/core/common_runtime/device.cc。
Device::Device(Env* env, const DeviceAttributes& device_attributes)
: DeviceBase(env), device_attributes_(device_attributes) {
CHECK(DeviceNameUtils::ParseFullName(name(), &parsed_name_))
<< "Invalid device name: " << name();
rmgr_ = new ResourceMgr(parsed_name_.job);
}
Device类有两个参数。env定义了一些与操作系统相关的一些函数(如文件操作),device_attributes是一个Proto Buffer对象,在文章(8)和文章(9)中已经重点介绍了。除了保存这两个参数外,构造函数还做了如下两件事情。
- 创建parsed_name_成员变量。这个parse_name_是设备在一个TensorFlow集群中唯一的名字,这个名字在分布式计算中至关重要,我们稍后详细讨论。
- 创建Resource Manager对象。一个Resource Manager保存了设备上创建的资源,这些资源有一个计数器,记录资源对象的引用次数。当引用次数为0时,会自动销毁该资源对象。这种方式,在Linux内核中非常常见。C和C++没有自己的资源回收机制,因此需要自己实现类似的功能。

3705

被折叠的 条评论
为什么被折叠?



