mxnet 源码阅读 6

mxnet/src/storage/storage.cc

mxnet/include/mxnet/storage.h

mxnet/include/mxnet/base.h

以上三个文件共同描述了Storage虚类以及其实例化的结果,其中storage.h中定义了Storage抽象接口(虚函数) Alloc Free DirectFree 以及静态方法Get ,其中定义了以后用以操作和管理内存的Handle句柄,其内部有两个部分组成一个是描述内存本身属性的包括地址 void *dptr 和大小 size_t size 以及描述内存所在设备的Context ctx; 其中Context结构在base.h中定义,其成员有两个一个是 dev_type (1-CPU 2-GPU 3-CPU_PINNED ) 另一是 dev_id ,同时在base中还有一些构建Context的相关函数,如GPU(...) CPU(...) CPUPinned(,,,) FromString(...) 等可以直接构建相关设备环境。

StorageImpl是 Stroage的具体继承类接口有 返回Handle 的 Alloc 函数 Free 函数 和 DirectFree函数,同时多了静态函数 ActivateDevice用以切换GPU设备,CPU设备其实不用切换,所以实现也只是直接break而已。

从Alloc的实现看,其申请的内存包括 CPU内存,CPUpinned 内存 和 GPU内存池,没有单纯的申请一块GPU内存的接口。

同时总结一下mxnet/src/storage 目录中文件和类的情况:

cpu_device_storage.h gpu_device_storage.h pinned_memory_storage.h 分别构建了负责CPU GPU 和 CPUpinned 内存申请的类。

storage_manager.h 是纯粹的抽象的接口类。naive_storage_manager.h 和  pooled_storage_manager.h 是抽象类storage_manager是具体实现。实质使用是通过C++多态,分别管理了 CPU(包括CPUpinned)和GPU(内存池)。

整个storage目录中的内容在mxnet框架中属于底层模块python等接口涉及不到该接口。

总结起来讲,其提供了以Handle为操作的句柄的内存申请和释放接口,即 Handle Alloc(size_t size, Context ctx),void Free(Handle handle),void DirectFree(Handle handle) 函数,统一了CPU GPU 接口。CPU 和CPUpinned 是随时申请随时释放模式,GPU内存采用内存池的模式。

猜测gpu_device_storage.h是为了以后临时资源的申请之用。

时间: 2024-12-12 00:36:19

mxnet 源码阅读 6的相关文章

mxnet 源码阅读 7

mxnet/src/engine/thread_poll.h thread_pool头文件在mxnet engine名字空间中定义了ThreadPool线程池类,该类通过显式构造函数传入某一个函数接口,并且指定启动的线程数,在析构函数中join这些线程.所以该线程池实现的是并发的执行同一个函数n次.类的生命周期决定了函数的周期.同时该类和以前类似,禁用了默认的拷贝和=操作符,以及禁用了默认无参构造函数. 实质上,常规的线程池不是只有一个入口函数,而是可以不断加入不同的函数.

mxnet 源码阅读 8

mxnet/include/mxnet/engine.h 在名字空间 mxnet engine 中定义了抽象类Engine,用以规范接口,其接口有 NotifyShutdown NewVariable DeleteVariable NewOperator DeleteOperator Push PushAsync PushSync WaitForVar WaitForAll DeduplicateVarHandle 等 mxnet/src/engine/engine_impl.h 定义了多态实现

mxnet 源码阅读 2

mxnet/src/storage/gpu_device_storage.h 同cpu_device_storage.h 类似通过两级命名空间 mxnet 和 storage 定义了类 GPUDeviceStorage ,内部有两个静态成员函数 Alloc 和 Free 其实现通过调用CUDA API cudaMalloc 和 cudaFree 实现 ,同时对于内存申请和释放出错的情况写出了日志信息,CPU部分是没有日志的. 个人感觉include的头文件有点大了,可以更细化的只include

mxnet 源码阅读 1

mxnet/src/storage/cpu_device_storage.h 通过两个名字空间 mxnet 和 storage 定义了CPUDeviceStorage类,然后在其中定义了两个静态函数 Alloc 和 Free 负责申请CPU内存,内存是按照 alignment_=16 对齐的 用 宏 _MSC_VER 区分了Windows 平台和 Linux/Unix 平台,Windows 用 _aligned_malloc 申请特定字节对齐的内存 : Linux 等用Posix 提供的  po

CI框架源码阅读笔记3 全局函数Common.php

从本篇开始,将深入CI框架的内部,一步步去探索这个框架的实现.结构和设计. Common.php文件定义了一系列的全局函数(一般来说,全局函数具有最高的加载优先权,因此大多数的框架中BootStrap引导文件都会最先引入全局函数,以便于之后的处理工作). 打开Common.php中,第一行代码就非常诡异: if ( ! defined('BASEPATH')) exit('No direct script access allowed'); 上一篇(CI框架源码阅读笔记2 一切的入口 index

淘宝数据库OceanBase SQL编译器部分 源码阅读--生成逻辑计划

body, td { font-family: tahoma; font-size: 10pt; } 淘宝数据库OceanBase SQL编译器部分 源码阅读--生成逻辑计划 SQL编译解析三部曲分为:构建语法树,生成逻辑计划,指定物理执行计划.第一步骤,在我的上一篇博客淘宝数据库OceanBase SQL编译器部分 源码阅读--解析SQL语法树里做了介绍,这篇博客主要研究第二步,生成逻辑计划. 一. 什么是逻辑计划?我们已经知道,语法树就是一个树状的结构组织,每个节点代表一种类型的语法含义.如

JDK部分源码阅读与理解

本文为博主原创,允许转载,但请声明原文地址:http://www.coselding.cn/article/2016/05/31/JDK部分源码阅读与理解/ 不喜欢重复造轮子,不喜欢贴各种东西.JDK代码什么的,让整篇文章很乱...JDK源码谁都有,没什么好贴的...如果你没看过JDK源码,建议打开Eclipse边看源码边看这篇文章,看过的可以把这篇文章当成是知识点备忘录... JDK容器类中有大量的空指针.数组越界.状态异常等异常处理,这些不是重点,我们关注的应该是它的一些底层的具体实现,这篇

如何阅读Java源码 阅读java的真实体会

刚才在论坛不经意间,看到有关源码阅读的帖子.回想自己前几年,阅读源码那种兴奋和成就感(1),不禁又有一种激动. 源码阅读,我觉得最核心有三点:技术基础+强烈的求知欲+耐心. 说到技术基础,我打个比方吧,如果你从来没有学过Java,或是任何一门编程语言如C++,一开始去啃<Core Java>,你是很难从中吸收到营养的,特别是<深入Java虚拟机>这类书,别人觉得好,未必适合现在的你. 虽然Tomcat的源码很漂亮,但我绝不建议你一开始就读它.我文中会专门谈到这个,暂时不展开. 强烈

Memcache-Java-Client-Release源码阅读(之七)

一.主要内容 本章节的主要内容是介绍Memcache Client的Native,Old_Compat,New_Compat三个Hash算法的应用及实现. 二.准备工作 1.服务器启动192.168.0.106:11211,192.168.0.106:11212两个服务端实例. 2.示例代码: String[] servers = { "192.168.0.106:11211", "192.168.0.106:11212" }; SockIOPool pool =