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.mzph.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;物体的尺寸变化范…