Merge pull request #203 from sergeyk/hdf5_data
[platform/upstream/caffeonacl.git] / src / caffe / layers / hdf5_data_layer.cu
1 // Copyright Sergey Karayev 2014
2 /*
3 TODO:
4 - only load parts of the file, in accordance with a prototxt param "max_mem"
5 */
6
7 #include <stdint.h>
8 #include <string>
9 #include <vector>
10
11 #include "hdf5.h"
12 #include "hdf5_hl.h"
13
14 #include "caffe/layer.hpp"
15 #include "caffe/util/io.hpp"
16 #include "caffe/vision_layers.hpp"
17
18 using std::string;
19
20 namespace caffe {
21
22 template <typename Dtype>
23 void HDF5DataLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom,
24       vector<Blob<Dtype>*>* top) {
25   const int batchsize = this->layer_param_.batchsize();
26   const int data_count = (*top)[0]->count() / (*top)[0]->num();
27   const int label_data_count = (*top)[1]->count() / (*top)[1]->num();
28
29   for (int i = 0; i < batchsize; ++i, ++current_row_) {
30     if (current_row_ == data_blob_.num()) {
31       if (num_files_ > 1) {
32         current_file_ += 1;
33
34         if (current_file_ == num_files_) {
35           current_file_ = 0;
36           LOG(INFO) << "looping around to first file";
37         }
38
39         load_hdf5_file_data(hdf_filenames_[current_file_].c_str());
40       }
41       current_row_ = 0;
42     }
43
44     CUDA_CHECK(cudaMemcpy(
45             &(*top)[0]->mutable_gpu_data()[i * data_count],
46             &data_blob_.cpu_data()[current_row_ * data_count],
47             sizeof(Dtype) * data_count,
48             cudaMemcpyHostToDevice));
49
50     CUDA_CHECK(cudaMemcpy(
51             &(*top)[1]->mutable_gpu_data()[i * label_data_count],
52             &label_blob_.cpu_data()[current_row_ * label_data_count],
53             sizeof(Dtype) * label_data_count,
54             cudaMemcpyHostToDevice));
55   }
56 }
57
58 template <typename Dtype>
59 Dtype HDF5DataLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top,
60       const bool propagate_down, vector<Blob<Dtype>*>* bottom) {
61   return Dtype(0.);
62 }
63
64 INSTANTIATE_CLASS(HDF5DataLayer);
65
66 }  // namespace caffe