IOLayers.cpp 8.41 KB
Newer Older
Benjamin Thomas Graham's avatar
Benjamin Thomas Graham committed
1
2
3
// Copyright 2016-present, Facebook, Inc.
// All rights reserved.
//
Benjamin Graham's avatar
Benjamin Graham committed
4
// This source code is licensed under the BSD-style license found in the
Benjamin Thomas Graham's avatar
Benjamin Thomas Graham committed
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// LICENSE file in the root directory of this source tree.

template <typename T>
void InputLayer_fp(T *input_features, T *output_features, Int nRows,
                   Int maxActive, Int nPlanes, Int *rules_cpu, Int *rules_gpu,
                   bool average);

template <typename T>
void InputLayer_bp(T *d_input_features, T *d_output_features, Int nRows,
                   Int maxActive, Int nPlanes, Int *rules_cpu, Int *rules_gpu,
                   bool average);

template <typename T, Int Dimension>
void cuda_InputLayer_updateOutput(Metadata<Dimension> &m,
Michal Pandy's avatar
Michal Pandy committed
19
20
21
22
                                  /*long*/ at::Tensor &spatialSize,
                                  /*long*/ at::Tensor &input_coords,
                                  /*cuda float*/ at::Tensor &input_features,
                                  /*cuda float*/ at::Tensor &output_features,
Benjamin Thomas Graham's avatar
Benjamin Thomas Graham committed
23
24
25
26
27
28
29
30
31
32
33
34
35
                                  long batchSize, long mode) {

  m.inputLayer(spatialSize, input_coords, batchSize, mode);
  Int nPlanes = input_features.size(1);
  auto &rules = m.inputLayerRuleBook;
  Int maxActive = rules[0][1];
  Int nRows = rules[0][3];
  if (mode == 0) {
    output_features.resize_as_(input_features);
    output_features.copy_(input_features);
  } else {
    output_features.resize_({*m.inputNActive, nPlanes});
    output_features.zero_();
Benjamin Thomas Graham's avatar
Benjamin Thomas Graham committed
36
    auto rulesBuffer = at::empty({(int)rules[1].size()}, at::CUDA(at_kINT));
37
38
39
    auto iF = input_features.data_ptr<T>();
    auto oF = output_features.data_ptr<T>();
    Int *rb = rulesBuffer.data_ptr<Int>();
Benjamin Thomas Graham's avatar
Benjamin Thomas Graham committed
40
41
42
43
44
45
46
    InputLayer_fp<T>(iF, oF, nRows, maxActive, nPlanes, &rules[1][0], rb,
                     mode == 4);
  }
}
template <typename T, Int Dimension>
void cuda_InputLayer_updateGradInput(
    Metadata<Dimension> &m,
Michal Pandy's avatar
Michal Pandy committed
47
48
    /*cuda float*/ at::Tensor &d_input_features,
    /*cuda float*/ at::Tensor &d_output_features) {
Benjamin Thomas Graham's avatar
Benjamin Thomas Graham committed
49
50
51
52
53
54
55
56
57
58
59
60

  auto &rules = m.inputLayerRuleBook;
  Int nPlanes = d_output_features.size(1);
  auto mode = rules[0][0];
  Int maxActive = rules[0][1];
  Int nRows = rules[0][3];
  if (mode == 0) {
    d_input_features.resize_as_(d_output_features);
    d_input_features.copy_(d_output_features);
  } else {
    d_input_features.resize_({rules[0][2], nPlanes});
    d_input_features.zero_();
Benjamin Thomas Graham's avatar
Benjamin Thomas Graham committed
61
    auto rulesBuffer = at::empty({(int)rules[1].size()}, at::CUDA(at_kINT));
62
63
64
    auto diF = d_input_features.data_ptr<T>();
    auto doF = d_output_features.data_ptr<T>();
    Int *rb = rulesBuffer.data_ptr<Int>();
Benjamin Thomas Graham's avatar
Benjamin Thomas Graham committed
65
66
67
68
69
70
71
    InputLayer_bp(diF, doF, nRows, maxActive, nPlanes, &rules[1][0], rb,
                  mode == 4);
  }
}

template <typename T, Int Dimension>
void cuda_OutputLayer_updateOutput(Metadata<Dimension> &m,
Michal Pandy's avatar
Michal Pandy committed
72
73
                                   /*cuda float*/ at::Tensor &input_features,
                                   /*cuda float*/ at::Tensor &output_features) {
Benjamin Thomas Graham's avatar
Benjamin Thomas Graham committed
74
75
76
77
78
79
80
81
82
83
84
85

  auto &rules = m.inputLayerRuleBook;
  Int nPlanes = input_features.size(1);
  auto mode = rules[0][0];
  auto maxActive = rules[0][1];
  auto nRows = rules[0][3];
  if (mode == 0) {
    output_features.resize_as_(input_features);
    output_features.copy_(input_features);
  } else {
    output_features.resize_({rules[0][2], nPlanes});
    output_features.zero_();
Benjamin Thomas Graham's avatar
Benjamin Thomas Graham committed
86
    auto rulesBuffer = at::empty({(int)rules[1].size()}, at::CUDA(at_kINT));
87
88
89
    auto iF = input_features.data_ptr<T>();
    auto oF = output_features.data_ptr<T>();
    Int *rb = rulesBuffer.data_ptr<Int>();
Benjamin Thomas Graham's avatar
Benjamin Thomas Graham committed
90
91
92
93
94
95
    InputLayer_bp(oF, iF, nRows, maxActive, nPlanes, &rules[1][0], rb, false);
  }
}
template <typename T, Int Dimension>
void cuda_OutputLayer_updateGradInput(
    Metadata<Dimension> &m,
Michal Pandy's avatar
Michal Pandy committed
96
97
    /*cuda float*/ at::Tensor &d_input_features,
    /*cuda float*/ at::Tensor &d_output_features) {
Benjamin Thomas Graham's avatar
Benjamin Thomas Graham committed
98
99
100
101
102
103
104
105
106
107
108
109

  auto &rules = m.inputLayerRuleBook;
  Int nPlanes = d_output_features.size(1);
  auto mode = rules[0][0];
  auto maxActive = rules[0][1];
  auto nRows = rules[0][3];
  if (mode == 0) {
    d_input_features.resize_as_(d_output_features);
    d_input_features.copy_(d_output_features);
  } else {
    d_input_features.resize_({nRows, nPlanes});
    d_input_features.zero_();
Benjamin Thomas Graham's avatar
Benjamin Thomas Graham committed
110
    auto rulesBuffer = at::empty({(int)rules[1].size()}, at::CUDA(at_kINT));
111
112
113
    auto diF = d_input_features.data_ptr<T>();
    auto doF = d_output_features.data_ptr<T>();
    Int *rb = rulesBuffer.data_ptr<Int>();
Benjamin Thomas Graham's avatar
Benjamin Thomas Graham committed
114
115
116
117
118
119
120
    InputLayer_fp<T>(doF, diF, nRows, maxActive, nPlanes, &rules[1][0], rb,
                     false);
  }
}

template <typename T, Int Dimension>
void cuda_BLInputLayer_updateOutput(Metadata<Dimension> &m,
Michal Pandy's avatar
Michal Pandy committed
121
122
123
124
                                    /*long*/ at::Tensor &spatialSize,
                                    /*long*/ at::Tensor &input_coords,
                                    /*cuda float*/ at::Tensor &input_features,
                                    /*cuda float*/ at::Tensor &output_features,
Benjamin Thomas Graham's avatar
Benjamin Thomas Graham committed
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
                                    long mode) {

  m.blLayer(spatialSize, input_coords, mode);
  Int nPlanes = input_features.size(2);
  output_features.resize_({*m.inputNActive, nPlanes});
  output_features.zero_();
  auto &rules = m.blLayerRuleBook;
  Int maxActive = rules[0][1];
  Int nRows = rules[0][4];

  if (mode == 0) {
    output_features.resize_as_(input_features);
    output_features.copy_(input_features);
    output_features.resize_({*m.inputNActive, nPlanes});
  } else {
Benjamin Thomas Graham's avatar
Benjamin Thomas Graham committed
140
    auto rulesBuffer = at::empty({(int)rules[1].size()}, at::CUDA(at_kINT));
141
142
143
    auto iF = input_features.data_ptr<T>();
    auto oF = output_features.data_ptr<T>();
    Int *rb = rulesBuffer.data_ptr<Int>();
Benjamin Thomas Graham's avatar
Benjamin Thomas Graham committed
144
145
146
147
148
149
150
    InputLayer_fp<T>(iF, oF, nRows, maxActive, nPlanes, &rules[1][0], rb,
                     mode == 4);
  }
}
template <typename T, Int Dimension>
void cuda_BLInputLayer_updateGradInput(
    Metadata<Dimension> &m,
Michal Pandy's avatar
Michal Pandy committed
151
152
    /*cuda float*/ at::Tensor &d_input_features,
    /*cuda float*/ at::Tensor &d_output_features) {
Benjamin Thomas Graham's avatar
Benjamin Thomas Graham committed
153
154
155
156
157
158
159
160
161
162
163
164
165
166

  auto &rules = m.blLayerRuleBook;
  Int nPlanes = d_output_features.size(1);
  Int mode = rules[0][0];
  Int maxActive = rules[0][1];
  Int nRows = rules[0][4];

  if (mode == 0) {
    d_input_features.resize_as_(d_output_features);
    d_input_features.copy_(d_output_features);
    d_input_features.resize_({rules[0][2], rules[0][3], nPlanes});
  } else {
    d_input_features.resize_({rules[0][2], rules[0][3], nPlanes});
    d_input_features.zero_();
Benjamin Thomas Graham's avatar
Benjamin Thomas Graham committed
167
    auto rulesBuffer = at::empty({(int)rules[1].size()}, at::CUDA(at_kINT));
168
169
170
    auto diF = d_input_features.data_ptr<T>();
    auto doF = d_output_features.data_ptr<T>();
    Int *rb = rulesBuffer.data_ptr<Int>();
Benjamin Thomas Graham's avatar
Benjamin Thomas Graham committed
171
172
173
174
175
176
177
178
    InputLayer_bp(diF, doF, nRows, maxActive, nPlanes, &rules[1][0], rb,
                  mode == 4);
  }
}

template <typename T, Int Dimension>
void cuda_BLOutputLayer_updateOutput(
    Metadata<Dimension> &m,
Michal Pandy's avatar
Michal Pandy committed
179
180
    /*cuda float*/ at::Tensor &input_features,
    /*cuda float*/ at::Tensor &output_features) {
Benjamin Thomas Graham's avatar
Benjamin Thomas Graham committed
181
182
183
184
185
186
187
188
189
190
191
192
193

  auto &rules = m.blLayerRuleBook;
  Int nPlanes = input_features.size(1);
  auto mode = rules[0][0];
  Int maxActive = rules[0][1];
  Int nRows = rules[0][4];
  if (mode == 0) {
    output_features.resize_as_(input_features);
    output_features.copy_(input_features);
    output_features.resize_({rules[0][2], rules[0][3], nPlanes});
  } else {
    output_features.resize_({rules[0][2], rules[0][3], nPlanes});
    output_features.zero_();
Benjamin Thomas Graham's avatar
Benjamin Thomas Graham committed
194
    auto rulesBuffer = at::empty({(int)rules[1].size()}, at::CUDA(at_kINT));
195
196
197
    auto iF = input_features.data_ptr<T>();
    auto oF = output_features.data_ptr<T>();
    Int *rb = rulesBuffer.data_ptr<Int>();
Benjamin Thomas Graham's avatar
Benjamin Thomas Graham committed
198
199
200
201
202
203
    InputLayer_bp(oF, iF, nRows, maxActive, nPlanes, &rules[1][0], rb, false);
  }
}
template <typename T, Int Dimension>
void cuda_BLOutputLayer_updateGradInput(
    Metadata<Dimension> &m,
Michal Pandy's avatar
Michal Pandy committed
204
205
    /*cuda float*/ at::Tensor &d_input_features,
    /*cuda float*/ at::Tensor &d_output_features) {
Benjamin Thomas Graham's avatar
Benjamin Thomas Graham committed
206
207
208
209
210
211
212
213
214
215
216
217
218

  auto &rules = m.blLayerRuleBook;
  Int nPlanes = d_output_features.size(2);
  Int mode = rules[0][0];
  Int maxActive = rules[0][1];
  Int nRows = rules[0][4];
  if (mode == 0) {
    d_input_features.resize_as_(d_output_features);
    d_input_features.copy_(d_output_features);
    d_input_features.resize_({nRows, nPlanes});
  } else {
    d_input_features.resize_({nRows, nPlanes});
    d_input_features.zero_();
Benjamin Thomas Graham's avatar
Benjamin Thomas Graham committed
219
    auto rulesBuffer = at::empty({(int)rules[1].size()}, at::CUDA(at_kINT));
220
221
222
    auto diF = d_input_features.data_ptr<T>();
    auto doF = d_output_features.data_ptr<T>();
    Int *rb = rulesBuffer.data_ptr<Int>();
Benjamin Thomas Graham's avatar
Benjamin Thomas Graham committed
223
224
225
226
    InputLayer_fp<T>(doF, diF, nRows, maxActive, nPlanes, &rules[1][0], rb,
                     false);
  }
}