caffe common 程序分析 類中定義類

caffe中 有 common.hpp 和common.cpp

// The main singleton of Caffe class and encapsulates the boost and CUDA random number
// generation function, providing a unified interface.

caffe的singleton?類, 封裝boost和cuda等操作。 提供一個統一的接口, 是一種常見的設計模式

(1) 設置cuda 隨機數

在具體實現中,這里還在類中定義一個類,例如:

class Caffe {
?public:
??~Caffe();
??inline static Caffe& Get() {
????if (!singleton_.get()) {
??????singleton_.reset(new Caffe());
????}
????return *singleton_;
??}
??enum Brew { CPU, GPU };


??// This random number generator facade hides boost and CUDA rng
??// implementation from one another (for cross-platform compatibility).
??class RNG {
???public:
????RNG();
????explicit RNG(unsigned int seed);
????explicit RNG(const RNG&);
????RNG& operator=(const RNG&);
????void* generator();
???private:
????class Generator;
????shared_ptr<Generator> generator_;
??};

}

類中定義一個類,雖然可以,但是建議盡量不要用,可讀性不好。類都應當對是可以獨立存在的抽象

這種方法主要是用于封裝,要訪問 RNG類,可以通過使用Caffe::RNG來用

這種方法可以 在類中封裝結構體。但是在c++中結構體和類其實是一個東西,唯一區別是類的成員默認是private,而結構體是public

但是由于一直以來的習慣,結構體一般只是作為存儲數據用的數據結構,沒有具體行為,這點也可以看做和類的區別, 因為類是有行為的(成員函數)

結構體定義在類的內部和外部都是可以的,但是為了程序的可讀性, 一般定義在類的外部。

----------------------------------------------------------------------------------------------------------------------------

其中用到一個宏定義CUDA_KERNEL_LOOP

在common.hpp中有。

#defineCUDA_KERNEL_LOOP(i,n) \

for(inti = blockIdx.x * blockDim.x + threadIdx.x; \

i < (n); \

i +=blockDim.x * gridDim.x)

先看看caffe采取的線程格和線程塊的維數設計,

還是從common.hpp可以看到

CAFFE_CUDA_NUM_THREADS

CAFFE_GET_BLOCKS(constintN)

明顯都是一維的。

整理一下CUDA_KERNEL_LOOP格式看看,

for(inti = blockIdx.x * blockDim.x + threadIdx.x;

i< (n);

i+= blockDim.x * gridDim.x)

blockDim.x* gridDim.x表示的是該線程格所有線程的數量。

n表示核函數總共要處理的元素個數。

有時候,n會大于blockDim.x* gridDim.x,因此并不能一個線程處理一個元素。

由此通過上面的方法,讓一個線程串行(for循環)處理幾個元素。

這其實是常用的伎倆,得借鑒學習一下。

再來看一下這個核函數的實現。

template<typename Dtype>

__global__void mul_kernel(const int n, const Dtype* a,

constDtype* b, Dtype* y)

{

CUDA_KERNEL_LOOP(index,n)

{

y[index]= a[index] * b[index];

}

}

明顯就是算兩個向量的點積了。

由于向量的維數可能大于該kernel函數線程格的總線程數量。

因此有些線程可以要串行處理幾個元素。


其中用到一個宏定義CUDA_KERNEL_LOOP

在common.hpp中有。

#defineCUDA_KERNEL_LOOP(i,n) \

for(inti = blockIdx.x * blockDim.x + threadIdx.x; \

i < (n); \

i +=blockDim.x * gridDim.x)

先看看caffe采取的線程格和線程塊的維數設計,

還是從common.hpp可以看到

CAFFE_CUDA_NUM_THREADS

CAFFE_GET_BLOCKS(constintN)

明顯都是一維的。

整理一下CUDA_KERNEL_LOOP格式看看,

for(inti = blockIdx.x * blockDim.x + threadIdx.x;

i< (n);

i+= blockDim.x * gridDim.x)

blockDim.x* gridDim.x表示的是該線程格所有線程的數量。

n表示核函數總共要處理的元素個數。

有時候,n會大于blockDim.x* gridDim.x,因此并不能一個線程處理一個元素。

由此通過上面的方法,讓一個線程串行(for循環)處理幾個元素。

這其實是常用的伎倆,得借鑒學習一下。

再來看一下這個核函數的實現。

template<typename Dtype>

__global__void mul_kernel(const int n, const Dtype* a,

constDtype* b, Dtype* y)

{

CUDA_KERNEL_LOOP(index,n)

{

y[index]= a[index] * b[index];

}

}

明顯就是算兩個向量的點積了。

由于向量的維數可能大于該kernel函數線程格的總線程數量。

因此有些線程可以要串行處理幾個元素。
---------------------?
作者:deep_learninger?
來源:CSDN?
原文:https://blog.csdn.net/u014114990/article/details/47606635?
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

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

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

相關文章

相機標定究竟在標定什么?

https://mp.weixin.qq.com/s/sWpVgwXmPvIEbObXvo1HRg

SpringMVC+Shiro權限管理

SpringMVCShiro權限管理 什么是權限呢&#xff1f;舉個簡單的例子&#xff1a; 我有一個論壇&#xff0c;注冊的用戶分為normal用戶&#xff0c;manager用戶。對論壇的帖子的操作有這些&#xff1a;添加&#xff0c;刪除&#xff0c;更新&#xff0c;查看&#xff0c;回復我們規…

Caffe源碼解析1:Blob

from:https://www.cnblogs.com/louyihang-loves-baiyan/p/5149628.html 轉載請注明出處&#xff0c;樓燚(y)航的blog&#xff0c;http://www.cnblogs.com/louyihang-loves-baiyan/ 首先看到的是Blob這個類&#xff0c;Blob是作為Caffe中數據流通的一個基本類&#xff0c;網絡…

學后感

今天上了構建之法&#xff0c;我加深了對軟件工程的了解&#xff0c;也明白了單元測試和回歸測試對軟件開發的重要性&#xff0c;然而在軟件開發的過程中&#xff0c; 一個團隊是需要一定的流程來管理開發活動&#xff0c;每個工程師在軟件生命周期所做的工作也應該有一個流程&…

Caffe源碼解析2:SycedMem

from:https://www.cnblogs.com/louyihang-loves-baiyan/p/5150554.html 轉載請注明出處&#xff0c;樓燚(y)航的blog&#xff0c;http://www.cnblogs.com/louyihang loves baiyan/ 看到SyncedMem就知道&#xff0c;這是在做內存同步的操作。這類個類的代碼比較少&#xff0c;…

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;物體的尺寸變化范…