}
template<typename Dtype>
-void P2PSync<Dtype>::run(const vector<int>& gpus) {
+void P2PSync<Dtype>::Prepare(const vector<int>& gpus,
+ vector<shared_ptr<P2PSync<Dtype> > >* syncs) {
// Pair devices for map-reduce synchronization
vector<DevicePair> pairs;
DevicePair::compute(gpus, &pairs);
LOG(INFO)<< "GPUs pairs " << s.str();
SolverParameter param(solver_->param());
- vector<shared_ptr<P2PSync<Dtype> > > syncs(gpus.size());
// Build the GPU tree by finding the parent for each solver
for (int attempts = 0; attempts < pairs.size(); ++attempts) {
for (int i = 1; i < pairs.size(); ++i) {
- if (!syncs[i].get()) {
+ if (!syncs->at(i).get()) {
P2PSync<Dtype>* parent = NULL;
- for (int j = 0; j < syncs.size(); ++j) {
- P2PSync<Dtype>* sync = j == 0 ? this : syncs[j].get();
+ for (int j = 0; j < syncs->size(); ++j) {
+ P2PSync<Dtype>* sync = j == 0 ? this : syncs->at(j).get();
if (sync) {
const SolverParameter& p = sync->solver()->param();
if (p.device_id() == pairs[i].parent()) {
}
if (parent) {
param.set_device_id(pairs[i].device());
- syncs[i].reset(new P2PSync<Dtype>(solver_, parent, param));
- parent->children_.push_back((P2PSync<Dtype>*) syncs[i].get());
+ syncs->at(i).reset(new P2PSync<Dtype>(solver_, parent, param));
+ parent->children_.push_back((P2PSync<Dtype>*) syncs->at(i).get());
}
}
}
}
+}
+
+template<typename Dtype>
+void P2PSync<Dtype>::Run(const vector<int>& gpus) {
+ vector<shared_ptr<P2PSync<Dtype> > > syncs(gpus.size());
+ Prepare(gpus, &syncs);
LOG(INFO)<< "Starting Optimization";