azai91 commented on a change in pull request #11608: [MXNET-489] MKLDNN Pool
test
URL: https://github.com/apache/incubator-mxnet/pull/11608#discussion_r202809094
##########
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:
we cannot. the purpose of this inner block is as followed:
- get input arrays (outer for loop)
- get output arrays (inner for loop)
- run input and outputs through operators (outputs have now been modified)
- use modified outputs as inputs for backwards operators and the inputs as
the outputs. we need the inputs to be copies because will will use then in the
next round of the inner loop.
we need to create a new copy of the inputs for every run of the inner loop.
if we move the array creation outside the inner loop, we will be referencing
the same inputs every time. the ptr does not move until the outer loop moves.
----------------------------------------------------------------
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