azai91 commented on a change in pull request #11608: [MXNET-489] MKLDNN Pool
test
URL: https://github.com/apache/incubator-mxnet/pull/11608#discussion_r202096903
##########
File path: tests/cpp/operator/mkldnn.cc
##########
@@ -1042,6 +1106,115 @@ void TestConcatOp(const OpAttrs &attrs, VerifyFunc
verify_fn,
}
}
+int CalculateWidthPoolOutput(int width, int kernel, int padding, int stride) {
+ return (width - kernel + 2 * padding) / stride + 1;
+}
+
+void TestPoolingOp(const OpAttrs &forward_attrs, const OpAttrs
&backwards_attrs) {
+ std::vector<NDArray*> inputs(forward_attrs.num_inputs);
+ std::vector<NDArray*> outputs(forward_attrs.num_outputs);
+ std::vector<NDArray*> ex_outputs(forward_attrs.num_outputs);
+
+ std::vector<NDArray*> backwards_input(backwards_attrs.num_inputs);
+ std::vector<NDArray*> backwards_outputs(backwards_attrs.num_outputs);
+ std::vector<NDArray*> backwards_ex_outputs(backwards_attrs.num_outputs);
+
+
+ std::vector<OpReqType> req(forward_attrs.num_outputs);
+ std::vector<OpReqType> back_req(backwards_attrs.num_outputs);
+ std::vector<DispatchMode> dispatches = forward_attrs.dispatches;
+
+ TestArrayShapes tas = GetTestArrayShapes();
+ std::vector<mkldnn::memory::primitive_desc> pds = tas.pds;
+
+ mxnet::op::PoolingParam param;
+ param.Init(forward_attrs.attrs.dict);
+ TShape kernel = param.kernel;
+ TShape padding = param.pad;
+ TShape stride = param.stride;
+
+ std::vector<NDArrayAttrs> in_arrs = GetTestInputArrays();
+ std::vector<std::vector<NDArrayAttrs>> out_arrs(forward_attrs.num_outputs);
+ std::vector<std::vector<NDArrayAttrs>>
ex_out_arrs(forward_attrs.num_outputs);
+
+ for (int i1 = 0; i1 < in_arrs.size(); i1++) {
+ auto in_arr = in_arrs[i1];
+
+ // can only pool only 3D and 4D inputs
+ TShape input_shape = in_arr.arr.shape();
+ if (input_shape.ndim() != kernel.ndim() + 2)
+ continue;
+
+ // skip if not default layout since memory layout must match
+ if (in_arr.arr.IsMKLDNNData())
+ continue;
+
+ std::vector<float> scale_vector(in_arr.arr.shape().ndim());
+ for (int i = 0; i < in_arr.arr.shape().ndim(); i++) {
+ if (i < 2)
+ scale_vector[i] = 1;
+ else
+ scale_vector[i] = CalculateWidthPoolOutput(
+ input_shape[i], kernel[i-2], padding[i-2], stride[i-2]) /
+ static_cast<float>(input_shape[i]);
+ }
+ for (int i = 0; i < forward_attrs.num_outputs; i++) {
+ out_arrs[i] = GetTestOutputArrays(in_arr.arr.shape(), pds, scale_vector);
+ ex_out_arrs[i] = GetTestOutputArrays(in_arr.arr.shape(), pds,
scale_vector);
+ }
+
+ for (int i = 0; i < forward_attrs.num_inputs; i++)
+ inputs[i] = &in_arr.arr;
+
+ for (size_t output_i = 0; output_i < out_arrs[0].size(); output_i++) {
+ for (int i = 0; i < forward_attrs.num_outputs; i++) {
+ req[i] = kWriteTo;
+ outputs[i] = &out_arrs[i][output_i].arr;
+ ex_outputs[i] = &ex_out_arrs[i][output_i].arr;
+ }
+ Imperative::Get()->set_is_training(true);
+
+ PrintVerifyMsg(in_arr, out_arrs[0][output_i]);
+ Imperative::Get()->InvokeOp(Context(), forward_attrs.attrs, inputs,
+ outputs, req, DispatchMode::kFCompute,
mxnet::OpStatePtr());
+ Imperative::Get()->InvokeOp(Context(), forward_attrs.attrs, inputs,
+ ex_outputs, req, DispatchMode::kFComputeEx,
mxnet::OpStatePtr());
+ Engine::Get()->WaitForAll();
+ VerifyCopyResult(outputs, ex_outputs);
+
+
+ // backwards test performed same time since output needed
+ if (backwards_attrs.num_inputs == 3) {
+ backwards_input[0] = outputs[0]; // output grad
+ backwards_input[1] = inputs[0]; // input
+ backwards_input[2] = outputs[0]; // output
+ } else if (backwards_attrs.num_inputs == 5) {
+ backwards_input[0] = outputs[0]; // output grad
+ backwards_input[1] = outputs[0]; // workspace grad
+ backwards_input[2] = inputs[0]; // input
+ backwards_input[3] = outputs[0]; // output
+ backwards_input[4] = ex_outputs[1]; // workspace
+ }
+
+ auto tmp_output = GetTestInputArrays(true)[i1];
+ auto tmp_output2 = GetTestInputArrays(true)[i1];
Review comment:
so I am using the input arrays as the output array for backprop. The issue
is that I write to them so I need a copy of the array. Copyfrom doesn't copy
the mkldnn memory I believe.
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]
With regards,
Apache Git Services