码迷,mamicode.com
首页 > 其他好文 > 详细

[caffe]thread

时间:2016-05-12 17:38:08      阅读:301      评论:0      收藏:0      [点我收藏+]

标签:

CODE

三处定义

class P2PSync : public GPUParams<Dtype>, public Solver<Dtype>::Callback,
    public InternalThread {
class BasePrefetchingDataLayer :
    public BaseDataLayer<Dtype>, public InternalThread {
class DataLayer : public BasePrefetchingDataLayer<Dtype> {
 public:
  // DataLayer uses DataReader instead for sharing for parallelism
  virtual inline bool ShareInParallel() const { return false; }
 protected:
  DataReader reader_;
};
class DataReader {
 protected:
  // A single body is created per source
  class Body : public InternalThread {

启动thread

src/caffe/parallel.cpp: syncs[i]->StartInternalThread();
src/caffe/layers/base_data_layer.cpp: StartInternalThread();
src/caffe/data_reader.cpp: StartInternalThread();

具体分析

设有4个gpu: GPU0, GPU1, GPU2, GPU3

跑root_solver的线程这里叫主线程(GPU0),
主线程进入sync.run(gpus)这个函数之后,

for (int i = 1; i < syncs.size(); ++i) {
    //主线程生成了3个新线程(boost thread): bt1,bt2,bt3.
    //GPU1,2,3
    //这三个线程就会先分别初始化自己的solver->net->layer,
    //然后前传后传啥的
    syncs[i]->StartInternalThread();
  }

  // Run root solver on current thread
  //主线程()
  //已经初始化完了solver->net->layer,准备开始前传后传了
  solver_->Solve();

技术分享

imageDataLayer

//1.继承
layer->BaseDataLayer
BaseDataLayer, InternalThread->BasePrefetchingDataLayer->ImageLayer
//2.
shareinparallel -> true

当上面的4个线程初始化imagelayer的时候:
主线程BasePrefetchingDataLayerlayersetup函数中调用StartInternalThread,也就是生成了一个prefetch的新线程(boost thread):bt_data1
因为imagelayershareinparallel -> true,所以剩下的三个boost thread(bt1,bt2,bt3)根本就不会有对imagelayer进行layersetup的必要.
所以可以说,只有一个imageLayer

DataLayer

class DataLayer : public BasePrefetchingDataLayer<Dtype> {
 public:
  // DataLayer uses DataReader instead for sharing for parallelism
  virtual inline bool ShareInParallel() const { return false; }
 protected:
  DataReader reader_;
};
class DataReader {
 protected:
  // A single body is created per source
  class Body : public InternalThread {

不同于imagelayer, datalayer的ShareInParallelfalse,
所以,4个线程会有各自的datalayer(共4个)
但是,在主线程初始化它的datalayer时 -> reader_(主线程私有)-> body(4个线程公有)
就是说,主线程新建body后, 剩下三个线程只要调用这个body就好了,不会再新建.
而这个body又对应了一个boost thread: bt_data2

summary

无论是imagelayer还是datalayer, 最后都保证只有一个线程在读数据.

[caffe]thread

标签:

原文地址:http://blog.csdn.net/apsvvfb/article/details/51365377

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!