-
Notifications
You must be signed in to change notification settings - Fork 18.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #2903 from ronghanghu/multi_gpu
Multi-GPU Data Parallelism
- Loading branch information
Showing
35 changed files
with
1,769 additions
and
312 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,82 @@ | ||
#ifndef CAFFE_DATA_READER_HPP_ | ||
#define CAFFE_DATA_READER_HPP_ | ||
|
||
#include <map> | ||
#include <string> | ||
#include <vector> | ||
|
||
#include "caffe/common.hpp" | ||
#include "caffe/internal_thread.hpp" | ||
#include "caffe/util/blocking_queue.hpp" | ||
#include "caffe/util/db.hpp" | ||
|
||
namespace caffe { | ||
|
||
/** | ||
* @brief Reads data from a source to queues available to data layers. | ||
* A single reading thread is created per source, even if multiple solvers | ||
* are running in parallel, e.g. for multi-GPU training. This makes sure | ||
* databases are read sequentially, and that each solver accesses a different | ||
* subset of the database. Data is distributed to solvers in a round-robin | ||
* way to keep parallel training deterministic. | ||
*/ | ||
class DataReader { | ||
public: | ||
explicit DataReader(const LayerParameter& param); | ||
~DataReader(); | ||
|
||
inline BlockingQueue<Datum*>& free() const { | ||
return queue_pair_->free_; | ||
} | ||
inline BlockingQueue<Datum*>& full() const { | ||
return queue_pair_->full_; | ||
} | ||
|
||
protected: | ||
// Queue pairs are shared between a body and its readers | ||
class QueuePair { | ||
public: | ||
explicit QueuePair(int size); | ||
~QueuePair(); | ||
|
||
BlockingQueue<Datum*> free_; | ||
BlockingQueue<Datum*> full_; | ||
|
||
DISABLE_COPY_AND_ASSIGN(QueuePair); | ||
}; | ||
|
||
// A single body is created per source | ||
class Body : public InternalThread { | ||
public: | ||
explicit Body(const LayerParameter& param); | ||
virtual ~Body(); | ||
|
||
protected: | ||
void InternalThreadEntry(); | ||
void read_one(db::Cursor* cursor, QueuePair* qp); | ||
|
||
const LayerParameter param_; | ||
BlockingQueue<shared_ptr<QueuePair> > new_queue_pairs_; | ||
|
||
friend class DataReader; | ||
|
||
DISABLE_COPY_AND_ASSIGN(Body); | ||
}; | ||
|
||
// A source is uniquely identified by its layer name + path, in case | ||
// the same database is read from two different locations in the net. | ||
static inline string source_key(const LayerParameter& param) { | ||
return param.name() + ":" + param.data_param().source(); | ||
} | ||
|
||
const shared_ptr<QueuePair> queue_pair_; | ||
shared_ptr<Body> body_; | ||
|
||
static map<const string, boost::weak_ptr<DataReader::Body> > bodies_; | ||
|
||
DISABLE_COPY_AND_ASSIGN(DataReader); | ||
}; | ||
|
||
} // namespace caffe | ||
|
||
#endif // CAFFE_DATA_READER_HPP_ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.