[caffe]thread
来源:互联网 发布:淘宝网1元秒杀在哪里找 编辑:程序博客网 时间:2024/06/06 01:09
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->BaseDataLayerBaseDataLayer, InternalThread->BasePrefetchingDataLayer->ImageLayer//2.shareinparallel -> true
当上面的4个线程初始化imagelayer的时候:
主线程在BasePrefetchingDataLayer
的layersetup
函数中调用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的ShareInParallel
是false
,
所以,4个线程会有各自的datalayer(共4个)
但是,在主线程初始化它的datalayer时 -> reader_(主线程私有)-> body(4个线程公有)
就是说,主线程新建body后, 剩下三个线程只要调用这个body就好了,不会再新建.
而这个body又对应了一个boost thread: bt_data2
summary
无论是imagelayer还是datalayer, 最后都保证只有一个线程在读数据.
- [caffe]thread
- Caffe学习笔记5-BLAS与boost::thread加速
- Caffe学习笔记5-BLAS与boost::thread加速
- Caffe
- Caffe
- Caffe
- caffe
- Caffe
- Caffe
- Caffe
- caffe
- caffe
- caffe
- caffe
- Caffe
- Caffe
- caffe
- caffe
- 练习三1006
- 不安装oracle客户端,用plsql连接oracle
- 关于NSRunLoop和NSTimer的深入理解
- CSS 元素垂直居中的 6种方法
- SimpleAdapter使用案例
- [caffe]thread
- ip default-network 用法举例(使用静态默认路由实现网络互连)
- win10快捷键大全
- ECMAScrpt6 异步最终解决方案
- android中include标签的使用
- c++作业5
- 神奇的 BlocksKit(1):源码分析(下)
- matlab 源码阅读
- Oracle 11.2.0.4.5 RAC升级OJVM_11.2.0.4.160419_psu出现的问题