BatchNormalization.cu 4.58 KB
Newer Older
Benjamin Thomas Graham's avatar
Benjamin Thomas Graham committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// Copyright 2016-present, Facebook, Inc.
// All rights reserved.
//
// This source code is licensed under the license found in the
// LICENSE file in the root directory of this source tree.

#ifndef TH_GENERIC_FILE
#define TH_GENERIC_FILE "generic/GPU/BatchNormalization.cu"
#else
#include "BatchNormalization.h"

#define BN_F_MACRO(N)                                                          \
  if (nPlanes % N == 0) {                                                      \
    BatchNormalization_ForwardPass<real, N, 64>(                               \
        THCTensor_(data)(state, input_features),                               \
        THCTensor_(data)(state, output_features), nPlanes, input_stride,       \
        output_stride, nActive, THCTensor_(data)(state, saveMean),             \
        THCTensor_(data)(state, saveInvStd),                                   \
        THCTensor_(data)(state, runningMean),                                  \
        THCTensor_(data)(state, runningVar),                                   \
        weight ? THCTensor_(data)(state, weight) : 0,                          \
        bias ? THCTensor_(data)(state, bias) : 0, eps, momentum, train,        \
        leakiness);                                                            \
  }

extern "C" void scn_R_(BatchNormalization_updateOutput)(
    THCTensor *input_features, THCTensor *output_features, THCTensor *saveMean,
    THCTensor *saveInvStd, THCTensor *runningMean, THCTensor *runningVar,
    THCTensor *weight, THCTensor *bias, real eps, real momentum, bool train,
    real leakiness) {

  THCTensor_(resizeAs)(state, output_features, input_features);
33
34
35
36
37
38
39
40
  if (input_features->nDimension == 2) {
    auto nActive = input_features->size[0];
    auto nPlanes = input_features->size[1];
    auto input_stride = input_features->stride[0];
    auto output_stride = output_features->stride[0];
    BN_F_MACRO(16)
    else BN_F_MACRO(12) else BN_F_MACRO(8) else BN_F_MACRO(4) else BN_F_MACRO(1)
  }
Benjamin Thomas Graham's avatar
Benjamin Thomas Graham committed
41
42
43
44
45
46
47
}

extern "C" void scn_R_(BatchNormalizationInTensor_updateOutput)(
    THCTensor *input_features, THCTensor *output_features, THCTensor *saveMean,
    THCTensor *saveInvStd, THCTensor *runningMean, THCTensor *runningVar,
    THCTensor *weight, THCTensor *bias, real eps, real momentum, bool train,
    real leakiness) {
48
49
50
51
52
53
54
55
  if (input_features->nDimension == 2) {
    auto nActive = input_features->size[0];
    auto nPlanes = input_features->size[1];
    auto input_stride = input_features->stride[0];
    auto output_stride = output_features->stride[0];
    BN_F_MACRO(16)
    else BN_F_MACRO(12) else BN_F_MACRO(8) else BN_F_MACRO(4) else BN_F_MACRO(1)
  }
Benjamin Thomas Graham's avatar
Benjamin Thomas Graham committed
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
}

#undef BN_F_MACRO

#define BN_B_MACRO(N)                                                          \
  if (nPlanes % N == 0) {                                                      \
    BatchNormalization_BackwardPass<real, N, 64>(                              \
        THCTensor_(data)(state, input_features),                               \
        THCTensor_(data)(state, d_input_features),                             \
        THCTensor_(data)(state, output_features),                              \
        THCTensor_(data)(state, d_output_features), nPlanes, input_stride,     \
        output_stride, nActive, THCTensor_(data)(state, saveMean),             \
        THCTensor_(data)(state, saveInvStd),                                   \
        THCTensor_(data)(state, runningMean),                                  \
        THCTensor_(data)(state, runningVar),                                   \
        weight ? THCTensor_(data)(state, weight) : 0,                          \
        bias ? THCTensor_(data)(state, bias) : 0,                              \
        d_weight ? THCTensor_(data)(state, d_weight) : 0,                      \
        d_bias ? THCTensor_(data)(state, d_bias) : 0, leakiness);              \
  }

extern "C" void scn_R_(BatchNormalization_backward)(
    THCTensor *input_features, THCTensor *d_input_features,
    THCTensor *output_features, THCTensor *d_output_features,
    THCTensor *saveMean, THCTensor *saveInvStd, THCTensor *runningMean,
    THCTensor *runningVar, THCTensor *weight, THCTensor *bias,
    THCTensor *d_weight, THCTensor *d_bias, real leakiness) {

  THCTensor_(resizeAs)(state, d_input_features, d_output_features);
85
86
87
88
89
90
91
92
  if (input_features->nDimension == 2) {
    auto nActive = input_features->size[0];
    auto nPlanes = input_features->size[1];
    auto input_stride = input_features->stride[0];
    auto output_stride = output_features->stride[0];
    BN_B_MACRO(16)
    else BN_B_MACRO(12) else BN_B_MACRO(8) else BN_B_MACRO(4) else BN_B_MACRO(1)
  }
Benjamin Thomas Graham's avatar
Benjamin Thomas Graham committed
93
94
}
#endif