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 ...
随机推荐
- synchronize类锁用父类作为锁能否锁住代码块
如果有一个父类,Demo如下 public class Demo { public void demo1(){ synchronized (Demo.class){ while (true){ Sys ...
- 啥叫IP地址及子网掩码?
啥叫IP地址及子网掩码 ??? 1.IP地址的定义及分类 1.1IP地址的定义 1.2IP地址的分类 2.子网掩码 1.1 互联网上连接的网络设备和计算机都有唯一的地址,此作为该主机在Interne ...
- 纯JS脚本发送HTTP请求
1 var xmlHttp; 2 var iii = 0; 3 if (window.XMLHttpRequest) { 4 xmlHttp = new XMLHttpRequest(); 5 if ...
- 针对某p社游戏某整合包的研究
软件分析 垃圾re手 最近在玩群星 创意工坊里面下载了整合包 进群下载排序文件后竟然发现要付费() 28R够吃一顿好的 马上来分析一下这个软件 这是一个四版整合包的mod安装器 其中樱花远征和新星纪元 ...
- C# 在PDF中添加墨迹注释Ink Annotation
PDF中的墨迹注释(Ink Annotation),表现为徒手涂鸦式的形状:该类型的注释,可任意指定形状顶点的位置及个数,通过指定的顶点,程序将连接各点绘制成平滑的曲线.下面,通过C#程序代码介绍如何 ...
- suse 12 利用缓存创建本地源供内网服务使用
文章目录 服务端获取 添加源 刷新源 清除缓存 安装软件 获取rpm包 客户端测试 zypper --help 前言: 其实,咱也不知道为啥写了这篇博客,咱就是想学一学suse,咱也不会,咱也只能学, ...
- Paxos 学习笔记2 - Multi-Paxos
Paxos 学习笔记2 - Multi-Paxos 图片来自 John Ousterhout 的 Raft user study 系列课程 Multi-Paxos 论文里对很多问题并没有描述清楚,所以 ...
- [Python]数据类型、常量、变量和运算符(未完待续)
标识符 一个ASCII标识符需要同时满足以下三个条件: 1.第一个字符必须是字母表中的字母或者下划线_ 2.标识符的其他部分由字母.数字.下划线组成 3.标识符对大小写是敏感的,即A与a是不同的 一般 ...
- Tabluea、Smartbi可视化仪表盘创建流程图分享
你知道Tableau.Smartbi在可视化仪表盘制作步骤上有何差异吗?下面一起来了解吧~ 根据上面的流程图我们可以了解到,不同于Smartbi是在同一界面即可完成的,Tableau是由很多个工作表组 ...
- Vue框架简介和环境搭建
前言: 此篇随笔为个人学习前端框架Vue,js的技术笔记,主要记录一些自己在学习Vue框架的心得体会和技术总结,作为回顾和笔记使用. 这种写博客的方式,对刚开始学习Vue框架的我,也是一种激励,我相信 ...