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 
版权声明:本文为博主原创文章,转载请附上博文链接!

caffe common 程序分析 类中定义类相关推荐

  1. java 在一个类中定义类_Java 中程序代码必须在一个类中定义,类使用( )关键字来定义。_学小易找答案...

    [填空题]每一个 else 子句都必须和它前面的一个距离它最近的 子句相对应. [单选题]有关类的说法,正确的是( ) [单选题]在JAVA中,无论测试条件是什么,下列( )循环体 将至少执行一次. ...

  2. python 类中定义类_Python中的动态类定义

    python 类中定义类 Here's a neat Python trick you might just find useful one day. Let's look at how you ca ...

  3. python中类的定义_python 类中定义类

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 现有自定义类(color.py)如下,类位于路径'userschuxingpyt ...

  4. 【Groovy】Groovy 扩展方法 ( Groovy 扩展方法引入 | 分析 Groovy 中 Thread 类的 start 扩展方法 )

    文章目录 一.Groovy 扩展方法引入 二. 分析 Groovy 中 Thread 类的 start 扩展方法 一.Groovy 扩展方法引入 Groovy 可以对 JDK 中的一些类进行 方法扩展 ...

  5. oop 类中定义 的函数_WordPress的高级OOP:自定义REST API端点

    oop 类中定义 的函数 This article on advanced OOP for WordPress was originally published by Torque Magazine, ...

  6. python中定义类

    3.2. 定义类 Python是完全面向对象的:可以定义自已的类,从自已的或内置类进行继承,然后对生成的类进行实例化. 在Python中定义类很简单:就象定义函数,没有独立的定义接口.只要定义类,然后 ...

  7. java method field_java_解析Java中的Field类和Method类,Field类 Field类中定义了一些方 - phpStudy...

    解析Java中的Field类和Method类 Field类Field类中定义了一些方法,可以用来查询字段的类型以及设置或读取字段的值.将这些方法与继承而来的member方法结合在一起.就可以使我们能够 ...

  8. java中定义类的关键字是_java中定义类的关键字是什么?

    java中定义类的关键字是:"class".在Java中定义一个类,需要使用"class"关键字.一个自定义的类名和一对表示程序体的大括号. 类是 Java 中 ...

  9. (1)定义一个Circle类,包含一个double型的radius属性代表圆的半径,一个 findArea()方法返回圆的面积。 (2)定义一个类PassObject,在类中定义一个方法printA

      (1)定义一个 Circle 类,包含一个 double 型的 radius 属性代表圆的半径,一个 findArea() 方法返回圆的面积. ( 2 )定义一个类 PassObject ,在类中 ...

最新文章

  1. R语言构建xgboost文本分类模型(bag of words):xgb.cv函数交叉验证确定xgboost模型的最优子树个数、交叉验证获取最优子树之后构建最优xgboost模型并评估模型文本分类效能
  2. 设置centos6.5虚拟机时间同步
  3. CopyCat 代码克隆检测发布,剑指开源软件抄袭
  4. mysql Decimal(M,D)解释
  5. Educational Codeforces Round 72 (Rated for Div. 2)
  6. Everything是如何搜索的
  7. 九个PHP很有用的功能
  8. [Ynoi2012]D1T3
  9. git全局配置用户名和密码_git---全局设置用户名、密码、邮箱
  10. TCP 三次握手和四次挥手详解
  11. php mysql旅游管理系统毕业设计网站作品
  12. QQ产品界面变更之路
  13. poi html转换成word文档,poi将html转换为word文档
  14. 华为云安装:宝塔linux+wordpress建站
  15. 开发服务器 k8s 设置 自定义 dns解析
  16. 目前宽带的接入方式有哪些
  17. 基于SSM的企业OA办公系统
  18. javaFx屏幕截图工具
  19. 移动平台开发工程训练
  20. ubuntu安装docker-生产环境(kubernetes推荐)

热门文章

  1. 前端学习:Vue.js基本使用
  2. 并发编程(多进程1)
  3. oracle orion hugepages_settings.sh(支持OEL 7,4.1内核)
  4. mysql语法替换字符串
  5. 修改2440里面的FriendlyARM
  6. 游三圣乡山中湖岛有感
  7. 安卓系统上的远程 JS 调试 Remote JavaScript Debugging on Android
  8. 极客招募令!兄弟杯区块链极客竞技大赛在上海等您来战!
  9. Eclipse中安装Ext插件(Spket IDE)
  10. 独家 | 一文读懂自然语言处理NLP(附学习资料)