@@ -29,8 +29,6 @@ class CuDNNActivationOp : public Operator {
29
29
case activation::kTanh :
30
30
mode_ = CUDNN_ACTIVATION_TANH;
31
31
break ;
32
- case activation::kSoftmax :
33
- break ;
34
32
default :
35
33
LOG (FATAL) << " Not implmented" ;
36
34
break ;
@@ -53,13 +51,11 @@ class CuDNNActivationOp : public Operator {
53
51
Stream<gpu> *s = ctx.get_stream <gpu>();
54
52
Tensor<gpu, 4 > data;
55
53
Tensor<gpu, 4 > out;
56
- cudnnSoftmaxMode_t softmax_mode;
57
54
if (in_data[activation::kData ].ndim () == 2 ) {
58
55
Shape<4 > dshape = Shape4 (in_data[activation::kData ].shape_ [0 ],
59
56
in_data[activation::kData ].shape_ [1 ], 1 , 1 );
60
57
data = in_data[activation::kData ].get_with_shape <gpu, 4 , real_t >(dshape, s);
61
58
out = out_data[activation::kOut ].get_with_shape <gpu, 4 , real_t >(dshape, s);
62
- softmax_mode = CUDNN_SOFTMAX_MODE_INSTANCE;
63
59
} else {
64
60
Shape<4 > dshape;
65
61
index_t size_left = in_data[activation::kData ].Size ();
@@ -74,7 +70,6 @@ class CuDNNActivationOp : public Operator {
74
70
dshape[3 ] = size_left;
75
71
data = in_data[activation::kData ].get_with_shape <gpu, 4 , real_t >(dshape, s);
76
72
out = out_data[activation::kOut ].get_with_shape <gpu, 4 , real_t >(dshape, s);
77
- softmax_mode = CUDNN_SOFTMAX_MODE_CHANNEL;
78
73
}
79
74
float alpha = 1 .0f ;
80
75
float beta = 0 .0f ;
@@ -90,26 +85,14 @@ class CuDNNActivationOp : public Operator {
90
85
data.shape_ [2 ],
91
86
data.shape_ [3 ]), CUDNN_STATUS_SUCCESS);
92
87
}
93
- if (param_.act_type == activation::kSoftmax ) {
94
- CHECK_EQ (cudnnSoftmaxForward (s->dnn_handle_ ,
95
- CUDNN_SOFTMAX_ACCURATE,
96
- softmax_mode,
97
- &alpha,
98
- shape_desc_,
99
- data.dptr_ ,
100
- &beta,
101
- shape_desc_,
102
- out.dptr_ ), CUDNN_STATUS_SUCCESS);
103
- } else {
104
- CHECK_EQ (cudnnActivationForward (s->dnn_handle_ ,
105
- mode_,
106
- &alpha,
107
- shape_desc_,
108
- data.dptr_ ,
109
- &beta,
110
- shape_desc_,
111
- out.dptr_ ), CUDNN_STATUS_SUCCESS);
112
- }
88
+ CHECK_EQ (cudnnActivationForward (s->dnn_handle_ ,
89
+ mode_,
90
+ &alpha,
91
+ shape_desc_,
92
+ data.dptr_ ,
93
+ &beta,
94
+ shape_desc_,
95
+ out.dptr_ ), CUDNN_STATUS_SUCCESS);
113
96
}
114
97
115
98
virtual void Backward (const OpContext &ctx,
@@ -122,9 +105,7 @@ class CuDNNActivationOp : public Operator {
122
105
using namespace mshadow ;
123
106
using namespace mshadow ::expr;
124
107
CHECK_EQ (out_grad.size (), 1 );
125
- if (param_.act_type != activation::kSoftmax ) {
126
- CHECK_EQ (in_data.size (), 1 );
127
- }
108
+ CHECK_EQ (in_data.size (), 1 );
128
109
CHECK_EQ (out_data.size (), 1 );
129
110
CHECK_EQ (req.size (), 1 );
130
111
CHECK_EQ (in_grad.size (), 1 );
@@ -135,17 +116,13 @@ class CuDNNActivationOp : public Operator {
135
116
Tensor<gpu, 4 > data;
136
117
Tensor<gpu, 4 > output_data;
137
118
Tensor<gpu, 4 > input_grad;
138
- cudnnSoftmaxMode_t softmax_mode;
139
119
if (in_grad[activation::kData ].ndim () == 2 ) {
140
120
Shape<4 > dshape = Shape4 (in_grad[activation::kData ].shape_ [0 ],
141
121
in_grad[activation::kData ].shape_ [1 ], 1 , 1 );
142
- if (param_.act_type != activation::kSoftmax ) {
143
- data = in_data[activation::kData ].get_with_shape <gpu, 4 , real_t >(dshape, s);
144
- }
122
+ data = in_data[activation::kData ].get_with_shape <gpu, 4 , real_t >(dshape, s);
145
123
grad = out_grad[activation::kOut ].get_with_shape <gpu, 4 , real_t >(dshape, s);
146
124
output_data = out_data[activation::kOut ].get_with_shape <gpu, 4 , real_t >(dshape, s);
147
125
input_grad = in_grad[activation::kData ].get_with_shape <gpu, 4 , real_t >(dshape, s);
148
- softmax_mode = CUDNN_SOFTMAX_MODE_INSTANCE;
149
126
} else {
150
127
Shape<4 > dshape;
151
128
index_t size_left = in_grad[activation::kData ].Size ();
@@ -158,41 +135,24 @@ class CuDNNActivationOp : public Operator {
158
135
size_left /= dshape[i];
159
136
}
160
137
dshape[3 ] = size_left;
161
- if (param_.act_type != activation::kSoftmax ) {
162
- data = in_data[activation::kData ].get_with_shape <gpu, 4 , real_t >(dshape, s);
163
- }
138
+ data = in_data[activation::kData ].get_with_shape <gpu, 4 , real_t >(dshape, s);
164
139
output_data = out_data[activation::kOut ].get_with_shape <gpu, 4 , real_t >(dshape, s);
165
140
grad = out_grad[activation::kOut ].get_with_shape <gpu, 4 , real_t >(dshape, s);
166
141
input_grad = in_grad[activation::kData ].get_with_shape <gpu, 4 , real_t >(dshape, s);
167
- softmax_mode = CUDNN_SOFTMAX_MODE_CHANNEL;
168
142
}
169
143
CHECK_EQ (s->dnn_handle_ownership_ , mshadow::Stream<gpu>::OwnHandle);
170
- if (param_.act_type == activation::kSoftmax ) {
171
- CHECK_EQ (cudnnSoftmaxBackward (s->dnn_handle_ ,
172
- CUDNN_SOFTMAX_ACCURATE,
173
- softmax_mode,
174
- &alpha,
175
- shape_desc_,
176
- output_data.dptr_ ,
177
- shape_desc_,
178
- grad.dptr_ ,
179
- &beta,
180
- shape_desc_,
181
- input_grad.dptr_ ), CUDNN_STATUS_SUCCESS);
182
- } else {
183
- CHECK_EQ (cudnnActivationBackward (s->dnn_handle_ ,
184
- mode_,
185
- &alpha,
186
- shape_desc_,
187
- output_data.dptr_ ,
188
- shape_desc_,
189
- grad.dptr_ ,
190
- shape_desc_,
191
- data.dptr_ ,
192
- &beta,
193
- shape_desc_,
194
- input_grad.dptr_ ), CUDNN_STATUS_SUCCESS);
195
- }
144
+ CHECK_EQ (cudnnActivationBackward (s->dnn_handle_ ,
145
+ mode_,
146
+ &alpha,
147
+ shape_desc_,
148
+ output_data.dptr_ ,
149
+ shape_desc_,
150
+ grad.dptr_ ,
151
+ shape_desc_,
152
+ data.dptr_ ,
153
+ &beta,
154
+ shape_desc_,
155
+ input_grad.dptr_ ), CUDNN_STATUS_SUCCESS);
196
156
}
197
157
198
158
private:
0 commit comments