Caffe源碼解析2:SycedMem

from:https://www.cnblogs.com/louyihang-loves-baiyan/p/5150554.html

轉載請注明出處,樓燚(yì)航的blog,http://www.cnblogs.com/louyihang?loves baiyan/

看到SyncedMem就知道,這是在做內存同步的操作。這類個類的代碼比較少,但是作用是非常明顯的。文件對應著syncedmem.hpp,著syncedmem.cpp

首先是兩個全局的內聯函數。如果機器是支持GPU的并且安裝了cuda,通過cudaMallocHost分配的host memory將會被pinned,這里我谷歌了一下,pinned的意思就是內存不會被paged out,我們知道內存里面是由頁作為基本的管理單元。分配的內存可以常駐在內存空間中對效率是有幫助的,空間不會被別的進程所搶占。同樣如果內存越大,能被分配的Pinned內存自然也越大。還有一點是,對于單一的GPU而言提升并不會太顯著,但是對于多個GPU的并行而言可以顯著提高穩定性。

這里是兩個封裝過的函數,內部通過cuda來分配主機和釋放內存的接口

inline void CaffeMallocHost(void** ptr, size_t size, bool* use_cuda) {
#ifndef CPU_ONLYif (Caffe::mode() == Caffe::GPU) {CUDA_CHECK(cudaMallocHost(ptr, size));// GPU模式下cuda分配內存*use_cuda = true;return;}
#endif*ptr = malloc(size);//如果沒有cuda則通過c的malloc函數分配*use_cuda = false;CHECK(*ptr) << "host allocation of size " << size << " failed";
}inline void CaffeFreeHost(void* ptr, bool use_cuda) {
#ifndef CPU_ONLYif (use_cuda) {CUDA_CHECK(cudaFreeHost(ptr));//cuda的主機內存釋放操作return;}
#endiffree(ptr);//c的釋放操作
}

SyncedMemory類,首先是構造函數和析構函數

class SyncedMemory {public:SyncedMemory() //參數構造函數,負責初始化: cpu_ptr_(NULL), gpu_ptr_(NULL), size_(0), head_(UNINITIALIZED),own_cpu_data_(false), cpu_malloc_use_cuda_(false), own_gpu_data_(false),gpu_device_(-1) {}explicit SyncedMemory(size_t size)//帶explicit關鍵字的,單個參數構造函數,explicit禁止單參數構造函數的隱式轉換: cpu_ptr_(NULL), gpu_ptr_(NULL), size_(size), head_(UNINITIALIZED),own_cpu_data_(false), cpu_malloc_use_cuda_(false), own_gpu_data_(false),gpu_device_(-1) {}~SyncedMemory();//其在析構時調用的也是CaffeFreeHost

這幾個函數分別是

  const void* cpu_data();void set_cpu_data(void* data);const void* gpu_data();void set_gpu_data(void* data);

cpu_data()主要是獲得cpu上data的地址,set_cpu_data是將cpu的data指針指向一個新的區域由data指針傳入,并且將原來申請的內存釋放。下面兩個同理,分別是獲得gpu數據地址和set gpu數據地址。

  void* mutable_cpu_data();void* mutable_gpu_data();enum SyncedHead { UNINITIALIZED, HEAD_AT_CPU, HEAD_AT_GPU, SYNCED };SyncedHead head() { return head_; }size_t size() { return size_; }

前兩個分別是返回cpu和gpu上的data指針,并且置狀態為head_ = HEAD_AT_CPU和響應的gpu版本。SyncedHead主要是個枚舉類型,用來設定head_的狀態,head()函數即返回相應的數據狀態,而size()函數返回數據大小

#ifndef CPU_ONLYvoid async_gpu_push(const cudaStream_t& stream);
#endif

這是一個cuda拷貝的異步傳輸,從數據從cpu拷貝到gpu,異步傳輸是已經假定caller會在使用之前做同步操作。

 private:void to_cpu();void to_gpu();void* cpu_ptr_;void* gpu_ptr_;size_t size_;SyncedHead head_;bool own_cpu_data_;bool cpu_malloc_use_cuda_;bool own_gpu_data_;int gpu_device_;DISABLE_COPY_AND_ASSIGN(SyncedMemory);//禁止該類的拷貝與賦值
};  // class SyncedMemory

其實這里的東西也不多了,to_cpu(),to_gpu()這個看名字就知道了,需要注意的是,如果head 是未被初始化的狀態,那么首先需要先分配內存,這個根據cpu和gpu視情況而定,之后再將數據從cpu或者gpu拷貝到另一處。之后函數會重新標記Head的狀態,數據是否在cpu或者在gpu中,cpu這里是簡稱,其實是主機。
cpu_ptr和gpu_ptr分別是在cpu和gpu中的數據指針,size_這就不再說了,head_之前也液晶提到過了,后面都是幾個相應的標記為,以及gpu的ID號

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/458113.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/458113.shtml
英文地址,請注明出處:http://en.pswp.cn/news/458113.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

REST學習

RPC架構與REST架構 RPC&#xff1a;RPC將服務器看作一些列動作的集合(需要做某件事) REST&#xff1a;將服務器看作分布式對象集合&#xff0c;客戶端通過調用這些對象上的方法來執行特定的任務&#xff0c;組件交互的可伸縮性、接口的通用性、組件的獨立部署、以及用來減少交互…

HI3559A和AI深度學習框架caffe

from:http://blog.sina.com.cn/s/blog_156e567660102ygdf.html 1、HI3559A支持深度學習框架caffe。其中的NNIE神經網絡加速單元是主要的屬性。 2、caffe是一種快速深度學習框架和TensorFlow一樣是一組標準深度學習開源框架。 3、對應想嘗試AI深度學習的朋友可以按照網上的流…

UValive4195 Heroes of Money and Magic

斜率優化 想罵人了&#xff0c;馬格吉最后調了半小時 TMD造數據的人是SB吧&#xff1f; 我寫 while(scanf("%d%d",&n,&m)!EOF&&n) 然后就TMD無限WA...WA...WA... 尼瑪 改成while(scanf("%d%d",&n,&m),n) 就過了&#xff0c;就過了…

Google Protocol Buffer 的使用和原理

from: https://www.ibm.com/developerworks/cn/linux/l-cn-gpb/index.html 簡介 什么是 Google Protocol Buffer&#xff1f; 假如您在網上搜索&#xff0c;應該會得到類似這樣的文字介紹&#xff1a; Google Protocol Buffer( 簡稱 Protobuf) 是 Google 公司內部的混合語言…

Electron

跨平臺桌面app開發 Appjs hex nwjs electron 官網&#xff1a;http://electron.atom.io/ 中文文檔&#xff1a;https://github.com/atom/electron/tree/master/docs-translations/zh-CN zcbenz&#xff1a; https://github.com/zcbenz https://github.com/atom/electron simple…

WCF技術剖析之十八:消息契約(Message Contract)和基于消息契約的序列化

在本篇文章中&#xff0c;我們將討論WCF四大契約&#xff08;服務契約、數據契約、消息契約和錯誤契約&#xff09;之一的消息契約&#xff08;Message Contract&#xff09;。服務契約關注于對服務操作的描述&#xff0c;數據契約關注于對于數據結構和格式的描述&#xff0c;而…

【深度學習數據集】常用公開圖片數據集下載

1.MNIST MNIST是一個手寫數字數據庫&#xff0c;它有60000個訓練樣本集和10000個測試樣本集&#xff0c;每個樣本圖像的寬高為28*28。此數據集是以二進制存儲的&#xff0c;不能直接以圖像格式查看&#xff0c;不過很容易找到將其轉換成圖像格式的工具。 最早的深度卷積網絡Le…

常用的幾種卷積神經網絡介紹

常用的幾種卷積神經網絡介紹 標簽&#xff08;空格分隔&#xff09;&#xff1a; 深度學習 這是一篇基礎理論的博客&#xff0c;基本手法是抄、刪、改、查&#xff0c;畢竟介紹這幾個基礎網絡的博文也挺多的&#xff0c;就算是自己的一個筆記吧&#xff0c;以后忘了多看看。主…

計算客 (人人都有極客精神)爆力

人人公司是一家極為鼓舞極客精神的公司&#xff0c;當有重要的項目須要上線但又時間太緊。甚至須要當天上線的時候。往往會掛起海盜旗開啟電子日期顯示。讓大家能夠在對時間有更明白的感知的情況下&#xff0c;同心協力搞定重要的項目。海盜旗下方的電子屏顯示的日期形式為 YYY…

深度學習案例

1. neural-style&#xff1a;利用卷積神經網絡將一幅圖像的內容與另一幅圖像的風格相結合 https://github.com/jcjohnson/neural-style 2.Nerual Doodles&#xff1a;把 2 位的 Doodle 轉成精良的藝術品 https://github.com/alexjc/neural-doodle 3. srez&#xff1a;通過深度…

深度學習圖像標注工具匯總

對于監督學習算法而言&#xff0c;數據決定了任務的上限&#xff0c;而算法只是在不斷逼近這個上限。世界上最遙遠的距離就是我們用同一個模型&#xff0c;但是卻有不同的任務。但是數據標注是個耗時耗力的工作&#xff0c;下面介紹幾個圖像標注工具&#xff1a; Labelme Labe…

UIBarbuttonItem

APPDelegate: - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds]; //創建主界面&#xff0c;導航欄的第一個頁面 FirstViewContr…

深度殘差網絡ResNet解析

ResNet在2015年被提出&#xff0c;在ImageNet比賽classification任務上獲得第一名&#xff0c;因為它“簡單與實用”并存&#xff0c;之后很多方法都建立在ResNet50或者ResNet101的基礎上完成的&#xff0c;檢測&#xff0c;分割&#xff0c;識別等領域都紛紛使用ResNet&#x…

Oracle-一個中文漢字占幾個字節?

Oracle 一個中文漢字占用幾個字節 Oracle 一個中文漢字 占用幾個字節&#xff0c;要根據Oracle中字符集編碼決定!!! 1. 如果定義為VARCHAR2(32 CHAR),那么該列最多就可以存儲32個漢字&#xff0c;如果定義字段為VARCHAR2&#xff08;32&#xff09; 或VARCHAR2&#xff08;32 B…

基于深度學習的目標檢測技術演進:R-CNN、Fast R-CNN、Faster R-CNN

object detection我的理解&#xff0c;就是在給定的圖片中精確找到物體所在位置&#xff0c;并標注出物體的類別。object detection要解決的問題就是物體在哪里&#xff0c;是什么這整個流程的問題。然而&#xff0c;這個問題可不是那么容易解決的&#xff0c;物體的尺寸變化范…

iPhone屏幕尺寸/launch尺寸/icon尺寸

屏幕尺寸 6p/6sp 414 X 7366/6s 375 X 6675/5s 320 X 568 4/4s 320 X 480launch尺寸 6p/6sp 1242 X 2208 3x6/6s 750 X 1334 2x5/5s 640 X 1136 2x4/4s 640 X 960 2x仔細觀察會發現l…

CNN的發展歷史(LeNet,Alexnet,VGGNet,GoogleNet,ReSNet)

歡迎轉載&#xff0c;轉載請注明&#xff1a;本文出自Bin的專欄blog.csdn.net/xbinworld。 關于卷積神經網絡CNN&#xff0c;網絡和文獻中有非常多的資料&#xff0c;我在工作/研究中也用了好一段時間各種常見的model了&#xff0c;就想著簡單整理一下&#xff0c;以備查閱之需…

讀取csv格式的數據

1.直接上代碼&#xff0c;關鍵是會用 2.代碼如下&#xff1a; <?php #添加推薦到英文站 $file fopen(code.csv,r); while ($data fgetcsv($file)) { //每次讀取CSV里面的一行內容 //print_r($data); //此為一個數組&#xff0c;要獲得每一個數據&#xff0c;訪問數組下…

如何在VMWare的Ubuntu虛擬機中設置共享文件夾

親測有效&#xff1a;Ubuntu18.04 LTS、虛擬機VMware Workstation 14 Pro 14.1.3 build-9474260、Window7 自己的第一篇博文&#xff0c;由于時&#xff08;shuǐ&#xff09;間&#xff08;png&#xff09;原&#xff08;yǒu&#xff09;因&#xff08;xin&#xff09;&…

容器+AOP實現動態部署(四)

上篇咱們介紹了容器和AOP的結合&#xff0c;結合后怎樣將對象增強服務并沒有過多的說明&#xff0c;這里將詳細說明怎樣將對象 進行增強 &#xff0c;達到一個一對多和多對多的增強方式 先從簡單的方式說起 /** *JDK代理類&#xff0c;實現動態調用對象方法 */ public class JD…