Reorganization of codes.
[platform/upstream/caffeonacl.git] / examples / net_speed_benchmark.cpp
1 // Copyright 2013 Yangqing Jia
2
3 #include <cuda_runtime.h>
4 #include <fcntl.h>
5 #include <google/protobuf/text_format.h>
6
7 #include <cstring>
8 #include <ctime>
9
10 #include "caffe/blob.hpp"
11 #include "caffe/common.hpp"
12 #include "caffe/net.hpp"
13 #include "caffe/filler.hpp"
14 #include "caffe/proto/caffe.pb.h"
15 #include "caffe/util/io.hpp"
16 #include "caffe/solver.hpp"
17
18 using namespace caffe;
19
20 int main(int argc, char** argv) {
21   cudaSetDevice(1);
22   Caffe::set_mode(Caffe::GPU);
23   Caffe::set_phase(Caffe::TRAIN);
24   int repeat = 100;
25
26   NetParameter net_param;
27   ReadProtoFromTextFile(argv[1],
28       &net_param);
29   vector<Blob<float>*> bottom_vec;
30   Net<float> caffe_net(net_param, bottom_vec);
31
32   // Run the network without training.
33   LOG(ERROR) << "Performing Forward";
34   caffe_net.Forward(bottom_vec);
35   LOG(ERROR) << "Performing Backward";
36   LOG(ERROR) << "Initial loss: " << caffe_net.Backward();
37
38   const vector<shared_ptr<Layer<float> > >& layers = caffe_net.layers();
39   vector<vector<Blob<float>*> >& bottom_vecs = caffe_net.bottom_vecs();
40   vector<vector<Blob<float>*> >& top_vecs = caffe_net.top_vecs();
41   LOG(ERROR) << "*** Benchmark begins ***";
42   for (int i = 0; i < layers.size(); ++i) {
43     const string& layername = layers[i]->layer_param().name();
44     clock_t start = clock();
45     for (int j = 0; j < repeat; ++j) {
46       layers[i]->Forward(bottom_vecs[i], &top_vecs[i]);
47     }
48     LOG(ERROR) << layername << "\tforward: "
49         << float(clock() - start) / CLOCKS_PER_SEC << " seconds.";
50   }
51   for (int i = layers.size() - 1; i >= 0; --i) {
52     const string& layername = layers[i]->layer_param().name();
53     clock_t start = clock();
54     for (int j = 0; j < repeat; ++j) {
55       layers[i]->Backward(top_vecs[i], true, &bottom_vecs[i]);
56     }
57     LOG(ERROR) << layername << "\tbackward: "
58         << float(clock() - start) / CLOCKS_PER_SEC << " seconds.";
59   }
60   LOG(ERROR) << "*** Benchmark ends ***";
61   return 0;
62 }