tensorflow源码解析之framework-device
目录
- 什么是设备
- 设备属性描述
- device_base
- 关系图
- 涉及的文件
- 迭代记录
1. 什么是设备
“设备”是一个很容易引起混淆的概念,在TF中,设备device专指能够执行实际计算的计算设备,比如CPU,GPU,SYNC设备等等。因此,一定要跟机器的概念区分开,一台机器可以包含多个设备。
2. 设备属性描述
对设备有了一个清晰的概念之后,我们看下TF为了描述设备属性准备的proto,DeviceAttributes:
message DeviceAttributes {
string name = 1;
string device_type = 2;//设备类型
int64 memory_limit = 4;//内存大小
DeviceLocality locality = 5;//平台相关的,为支持数据有效传输而准备的数据
fixed64 incarnation = 6;//每个设备在初始化后会被赋予一个全局唯一的编号,这个编号必须不能为0
string physical_device_desc = 7;//该设备所对应的物理设备的字符串描述
};
关于其中locality字段的详细含义,笔者还没找到具体的应用,有知道的读者还请告知。
3. device_base
DeviceAttributes只是对设备属性的一些简单描述,真正的设备基类是DeviceBase,我们来看一下它的结构:
class DeviceBase {
public:
explicit DeviceBase(Env* env) : env_(env){}
//...
private:
Env* const env_;
CpuWorkerThreads* cpu_worker_threads_ = nullptr;
GpuDeviceInfo* gpu_device_info_ = nullptr;
Eigen::ThreadPoolDevice* eigen_cpu_device_ = nullptr;
};
我们看到,DeviceBase构造函数的参数是Env指针,这里的Env在lib文件夹中定义,是对操作系统相关功能的统一封装,包括了文件系统等功能,使framework的实现尽量对操作系统层透明。
另外,DeviceBase的私有成员中,还出现了两个没见过的类,分别是CpuWorkerThreads和GpuDeviceInfo,我们分别看下它们的定义:
struct CpuWorkerThreads {
int num_threads = 0;
thread::ThreadPool* workers = nullptr;
}
struct GpuDeviceInfo {
perftools::gputools::Stream* stream = nullptr;
DeviceContext* default_context = nullptr;
EventMgr* event_mgr = nullptr;
int gpu_id = -1;
};
可以看出,前者是一个对线程池的简单封装,后者用于描述GPU相关的信息,其中的stream是流执行器,我们在后面会详细介绍。EventMgr是一个事件管理器,用于响应特殊的事件。那么DeviceContext是什么呢?
class DeviceContext : public core::RefCounted {
public:
//...
virtual void CopyCPUTensorToDevice(const Tensor* cpu_tensor, Device* device, Tensor* device_tensor, StatusCallback done) const;
virtual void CopyDeviceTensorToCPU(const Tensor* device_tensor, StringPiece tensor_name, Device* device, Tensor* cpu_tensor, StatusCallback done);
};
它是一个基于引用计数的类,主要的API包含CPU和设备之间的张量拷贝。也就是说,任何一个GPU设备都包含了CPU张量与设备张量之间相互拷贝的API接口。
到这里我们总结一下,DeviceBase针对CPU设备,包含了一个CPU的线程池,和一个eigen_cpu_device,而对于GPU设备,包含了一个GpuDeviceInfo,这个结构中除了包含GPU执行器、事件响应器之外,还包含了一个DeviceContext,这个结构中包含了CPU和GPU之间相互拷贝张量的API。
4. 关系图
DeviceBase-.包含.->CpuWorkerThreads
CpuWorkerThreads-.包含.->thread::ThreadPool
DeviceBase-.包含.->GpuDeviceInfo
GpuDeviceInfo-.包含.->DeviceContext
core::RefCounted-->|派生|DeviceContext
DeviceBase-.包含.->Eigen::ThreadPoolDevice
DeviceContext-.包含.->CopyCPUTensorToDevice
DeviceContext-.包含.->CopyDeviceTensorToCPU
5. 涉及的文件
- device_attributes
- device_base
6. 迭代记录
- v1.0 2018-08-28 文档创建
- v2.0 2018-09-09 文档重构
tensorflow源码解析之framework-device的更多相关文章
- tensorflow源码解析之framework拾遗
把framework中剩余的内容,按照文件名进行了简单解析.时间原因写的很仓促,算是占个坑,后面有了新的理解再来补充. allocation_description.proto 一个对单次内存分配结果 ...
- tensorflow源码解析系列文章索引
文章索引 framework解析 resource allocator tensor op node kernel graph device function shape_inference 拾遗 c ...
- Tensorflow源码解析1 -- 内核架构和源码结构
1 主流深度学习框架对比 当今的软件开发基本都是分层化和模块化的,应用层开发会基于框架层.比如开发Linux Driver会基于Linux kernel,开发Android app会基于Android ...
- tensorflow源码解析之common_runtime-executor-上
目录 核心概念 executor.h Executor NewLocalExecutor ExecutorBarrier executor.cc structs GraphView ExecutorI ...
- tensorflow源码解析之common_runtime-executor-下
目录 核心概念 executor.h Executor NewLocalExecutor ExecutorBarrier executor.cc structs GraphView ExecutorI ...
- tensorflow源码解析之framework-allocator
目录 什么是allocator 内存分配器的管理 内存分配追踪 其它结构 关系图 涉及的文件 迭代记录 1. 什么是allocator Allocator是所有内存分配器的基类,它定义了内存分配器需要 ...
- tensorflow源码解析之common_runtime拾遗
把common_runtime中剩余的内容,按照文件名排序进行了简单的解析,时间原因写的很仓促,算是占个坑,后续有了新的理解再来补充. allocator_retry 有时候内存分配不可能一次完成,为 ...
- Tensorflow源码解析2 -- 前后端连接的桥梁 - Session
Session概述 1. Session是TensorFlow前后端连接的桥梁.用户利用session使得client能够与master的执行引擎建立连接,并通过session.run()来触发一次计 ...
- tensorflow源码解析之distributed_runtime
本篇主要介绍TF的分布式运行时的基本概念.为了对TF的分布式运行机制有一个大致的了解,我们先结合/tensorflow/core/protobuf中的文件给出对TF分布式集群的初步理解,然后介绍/te ...
- tensorflow源码解析之common_runtime-device
目录 核心概念 device device_factory device_mgr device_set 1. 核心概念 在framework部分,我们介绍了DeviceAttributes和Devic ...
随机推荐
- Git简单多人协作
感谢廖雪峰老师,引自他的Git教程. Git简单多人协作 首先,可以试图用git push origin <branch-name>推送自己的修改: 如果推送失败,则因为远程分支比你的本地 ...
- 记项目中ES6+gulp+angularjs里的问题
AngualrJs中可用来注入的有三种类型,service.factory.provider,这三种写法不样,用法也都不一样.其中,service只实例化一次,其实就是单例模式的思想.无论我们在什么地 ...
- SendMessage 键值
转载请注明来源:https://www.cnblogs.com/hookjc/ SendMessage(hWnd,WM_SETFOCUS,0,0); SendMessage(hWnd,WM_ACTIV ...
- getter/setter方法
1.setter方法 作用:用来设置成员变量,可以在方法里面过滤掉一些不合理的值 命名规范: 必须是对象方法 返回值类型为void 方法名必须以set开头,而且后面跟上成员变量名去掉"_&q ...
- JAVA String介绍、常量池及String、StringBuilder和StringBuffer得区别. 以及8种基本类型的包装类和常量池得简单介绍
一.概述 String是代表字符串的类,本身是一个最终类,使用final修饰,不能被继承. 二.定义方式 方式一:直接赋值法 String str1 = "hello"; 方式 ...
- term&match得区别 text&keyword区别
Text 概念 Text 数据类型被用来索引长文本,比如说电子邮件的主体部分或者一款产品的介绍.这些文本会被分析,在建立索引前会将这些文本进行分词,转化为词的组合,建立索引.允许 ES来检索这些词语. ...
- 使用haproxy的ACL实现基于文件后缀名的动静分离
一.环境准备 二.实现proxy [root@localhost ~]# yum -y install haproxy #创建子配置 [root@localhost ~]# mkdir /etc/ha ...
- Solution -「CF 1392H」ZS Shuffles Cards
\(\mathcal{Description}\) Link. 打乱的 \(n\) 张编号 \(1\sim n\) 的数字排和 \(m\) 张鬼牌.随机抽牌,若抽到数字,将数字加入集合 \(S ...
- 我们一起来学Shell - shell的条件判断
文章目录 Shell 条件测试语法 符号说明 Shell 测试表达式 文件测试表达式 字符串测试表达式 整数操作符 逻辑操作符 测试表达式的区别总结 Shell 条件判断之if语句 单分支 IF 条件 ...
- Java 使用jcifs读写共享文件夹报错jcifs.smb.SmbException: Failed to connect: 0.0.0.0<00>/10.1.*.*
Q:使用jcifs读写Windows 10 共享文件夹中的文件报jcifs.smb.SmbException: Failed to connect: 0.0.0.0<00>/10.1.*. ...