This is an automated email from the ASF dual-hosted git repository. taolv pushed a commit to branch mkldnn-v1.0 in repository https://gitbox.apache.org/repos/asf/incubator-mxnet.git
commit 99145a5014f62375a36a23da26efd77527385136 Merge: 1ff9429 a37a76c Author: Tao Lv <[email protected]> AuthorDate: Thu Sep 19 23:18:25 2019 +0800 Merge remote-tracking branch 'origin' into mkldnn-v1.0 Conflicts: src/operator/nn/mkldnn/mkldnn_base-inl.h 3rdparty/dmlc-core | 2 +- CODEOWNERS | 15 +- README.md | 2 +- amalgamation/amalgamation.py | 3 +- cd/Jenkinsfile_cd_pipeline | 10 +- cd/Jenkinsfile_release_job | 4 +- cd/README.md | 4 +- cd/mxnet_lib/dynamic/Jenkins_pipeline.groovy | 57 ++++ ci/docker/runtime_functions.sh | 111 ++++++- ci/windows/test_jl07_cpu.ps1 | 2 +- ci/windows/test_jl10_cpu.ps1 | 2 +- docs/faq/env_var.md | 4 +- docs/mxdoc.py | 8 +- docs/tutorials/gluon/custom_layer.md | 2 +- docs/tutorials/python/profiler.md | 3 + docs/tutorials/sparse/train_gluon.md | 2 +- include/mxnet/c_api.h | 12 + julia/NEWS.md | 7 - julia/deps/build.jl | 33 +- julia/docs/src/user-guide/install.md | 20 +- julia/src/base.jl | 30 +- julia/src/executor.jl | 2 +- julia/test/unittest/bind.jl | 15 + python/mxnet/__init__.py | 4 + python/mxnet/_ctypes/ndarray.py | 28 +- python/mxnet/_numpy_op_doc.py | 353 ++++++++++++++++++++- python/mxnet/cython/base.pyi | 8 + python/mxnet/cython/ndarray.pyx | 16 +- python/mxnet/gluon/block.py | 37 +++ python/mxnet/gluon/data/dataloader.py | 50 ++- python/mxnet/gluon/data/dataset.py | 31 ++ python/mxnet/gluon/data/sampler.py | 10 +- python/mxnet/gluon/loss.py | 10 +- python/mxnet/ndarray/ndarray.py | 4 +- python/mxnet/ndarray/numpy/_op.py | 178 ++++++++++- python/mxnet/ndarray/numpy/linalg.py | 48 ++- python/mxnet/ndarray/numpy/random.py | 38 ++- python/mxnet/numpy/linalg.py | 42 ++- python/mxnet/numpy/multiarray.py | 328 +++++++++++++++++-- python/mxnet/numpy/random.py | 10 +- python/mxnet/numpy_dispatch_protocol.py | 216 +++++++++++++ python/mxnet/symbol/numpy/_symbol.py | 168 +++++++++- python/mxnet/symbol/numpy/linalg.py | 48 ++- python/mxnet/symbol/numpy/random.py | 39 ++- python/mxnet/test_utils.py | 5 + .../org/apache/mxnet/utils/CToScalaUtils.scala | 4 +- src/c_api/c_api_ndarray.cc | 20 ++ src/common/utils.cc | 57 ++++ src/common/utils.h | 9 + src/imperative/cached_op.cc | 23 +- src/imperative/cached_op.h | 8 + src/imperative/imperative_utils.cc | 20 +- src/imperative/imperative_utils.h | 9 +- src/operator/mshadow_op.h | 10 + src/operator/nn/mkldnn/mkldnn_base-inl.h | 17 +- src/operator/nn/mkldnn/mkldnn_base.cc | 23 +- src/operator/numpy/np_elemwise_broadcast_op.cc | 36 +++ src/operator/numpy/np_elemwise_broadcast_op.cu | 21 ++ src/operator/numpy/np_init_op.cc | 33 ++ src/operator/numpy/np_init_op.cu | 4 + src/operator/numpy/np_init_op.h | 107 +++++++ src/operator/numpy/np_matrix_op.cc | 1 + .../{np_multinomial_op.cu => dist_common.cc} | 21 +- .../{np_multinomial_op.cu => dist_common.cu} | 21 +- src/operator/numpy/random/dist_common.h | 7 + src/operator/numpy/random/np_multinomial_op.cu | 13 + src/operator/numpy/random/np_multinomial_op.h | 26 +- .../random/{np_uniform_op.cc => np_normal_op.cc} | 34 +- .../{np_multinomial_op.cu => np_normal_op.cu} | 11 +- src/operator/numpy/random/np_normal_op.h | 233 ++++++++++++++ src/operator/numpy/random/np_uniform_op.cc | 6 + src/operator/operator_tune.cc | 5 + src/operator/optimizer_op-inl.h | 50 ++- src/operator/random/multisample_op.h | 2 +- src/operator/rnn.cc | 16 +- src/operator/sequence_last-inl.h | 12 +- src/operator/sequence_last.cc | 10 +- src/operator/subgraph/build_subgraph.cc | 33 +- .../subgraph/mkldnn/mkldnn_conv_property.h | 10 +- .../mkldnn/mkldnn_fc_post_quantize_property.h | 2 +- src/operator/subgraph/mkldnn/mkldnn_fc_property.h | 8 +- .../mkldnn_post_quantize_align_scale_property.h | 2 +- .../mkldnn/mkldnn_post_quantize_property.h | 8 +- .../mkldnn/mkldnn_subgraph_base-inl.h} | 37 +-- src/operator/subgraph/subgraph_property.h | 110 +++++-- src/operator/tensor/elemwise_unary_op_trig.cc | 51 ++- src/operator/tensor/matrix_op-inl.h | 2 +- src/storage/pooled_storage_manager.h | 24 +- tests/nightly/JenkinsfileForBinaries | 10 +- .../JenkinsfileForMBCC | 2 +- tests/nightly/test_large_array.py | 10 +- tests/nightly/test_large_vector.py | 13 +- tests/python/gpu/test_operator_gpu.py | 1 + tests/python/mkl/test_mkldnn.py | 6 +- tests/python/mkl/test_subgraph.py | 21 ++ tests/python/unittest/test_exc_handling.py | 9 + tests/python/unittest/test_gluon.py | 69 ++++ tests/python/unittest/test_gluon_data.py | 23 +- tests/python/unittest/test_higher_order_grad.py | 29 ++ tests/python/unittest/test_library_loading.py | 3 +- tests/python/unittest/test_ndarray.py | 33 +- tests/python/unittest/test_numpy_gluon.py | 38 ++- .../python/unittest/test_numpy_interoperability.py | 211 ++++++++++++ tests/python/unittest/test_numpy_ndarray.py | 163 +++++++--- tests/python/unittest/test_numpy_op.py | 287 +++++++++++++++-- tests/python/unittest/test_operator.py | 51 ++- tests/python/unittest/test_optimizer.py | 14 +- tests/tutorials/test_tutorials.py | 17 +- tests/utils/notebook_test/__init__.py | 2 +- 109 files changed, 3688 insertions(+), 501 deletions(-) diff --cc src/operator/nn/mkldnn/mkldnn_base-inl.h index 054f422,34f4a0b..0148a6e --- a/src/operator/nn/mkldnn/mkldnn_base-inl.h +++ b/src/operator/nn/mkldnn/mkldnn_base-inl.h @@@ -46,19 -46,20 +46,20 @@@ #ifndef MXNET_OPERATOR_NN_MKLDNN_MKLDNN_BASE_INL_H_ #define MXNET_OPERATOR_NN_MKLDNN_MKLDNN_BASE_INL_H_ -#if MXNET_USE_MKLDNN == 1 +#if MXNET_USE_MKLDNN == 100 + #include <algorithm> #include <iterator> + #include <memory> #include <string> #include <unordered_map> - #include <vector> #include <utility> - #include <algorithm> - #include <memory> + #include <vector> #include "mkldnn.hpp" + #include "mxnet/graph_attr_types.h" #include "mxnet/ndarray.h" - #include "mxnet/resource.h" #include "mxnet/op_attr_types.h" + #include "mxnet/resource.h" -using namespace mkldnn; + namespace mxnet { // ===== CpuEngine ======================================= diff --cc src/operator/nn/mkldnn/mkldnn_base.cc index cfd7ad7,862947e..240e366 --- a/src/operator/nn/mkldnn/mkldnn_base.cc +++ b/src/operator/nn/mkldnn/mkldnn_base.cc @@@ -319,42 -292,136 +319,43 @@@ mkldnn_format_tag_t GetDefaultFormat(in } } -mkldnn_memory_format_t GetDefaultFormat(const mkldnn::memory::desc &desc) { - if (desc.data.ndims == 1) { - return desc.data.format; - } else if (desc.data.ndims == 2) { - if (desc.data.format == mkldnn_io) - return mkldnn_oi; - else - return desc.data.format; - } else if (desc.data.ndims == 3) { - switch (desc.data.format) { - case mkldnn_ncw: - case mkldnn_nwc: - case mkldnn_nCw8c: - case mkldnn_nCw16c: - return mkldnn_ncw; - case mkldnn_oiw: - case mkldnn_wio: - case mkldnn_Owi8o: - case mkldnn_OIw8i8o: - case mkldnn_OIw8o8i: - case mkldnn_OIw16i16o: - case mkldnn_OIw16o16i: - case mkldnn_Oiw16o: - case mkldnn_Owi16o: - case mkldnn_OIw8i16o2i: - case mkldnn_OIw8o16i2o: - case mkldnn_IOw16o16i: - return mkldnn_oiw; - default: - LOG(FATAL) << "Unknown MKLDNN format for 3 dimensions: " << desc.data.format; - return mkldnn_format_undef; - } - } else if (desc.data.ndims == 4) { - switch (desc.data.format) { - case mkldnn_nchw: - case mkldnn_nhwc: - case mkldnn_chwn: - case mkldnn_nChw4c: - case mkldnn_nChw8c: - case mkldnn_nChw16c: - return mkldnn_nchw; - case mkldnn_oihw: - case mkldnn_ihwo: - case mkldnn_hwio: - case mkldnn_iohw: - case mkldnn_oIhw8i: - case mkldnn_oIhw16i: - case mkldnn_OIhw4i4o: - case mkldnn_OIhw8i8o: - case mkldnn_hwio_s8s8: - case mkldnn_OIhw16i16o: - case mkldnn_OIhw4i16o4i: - case mkldnn_OIhw4i16o4i_s8s8: - case mkldnn_OIhw8i16o2i: - case mkldnn_OIhw8o16i2o: - case mkldnn_OIhw8o8i: - case mkldnn_OIhw16o16i: - case mkldnn_IOhw16o16i: - case mkldnn_Oihw8o: - case mkldnn_Oihw16o: - case mkldnn_Ohwi8o: - case mkldnn_Ohwi16o: - case mkldnn_OhIw16o4i: - return mkldnn_oihw; - case mkldnn_goiw: - case mkldnn_gOwi8o: - case mkldnn_gOIw8o8i: - case mkldnn_gOIw8i8o: - case mkldnn_gOIw16i16o: - case mkldnn_gOIw16o16i: - case mkldnn_gOiw16o: - case mkldnn_gOwi16o: - case mkldnn_gOIw8i16o2i: - case mkldnn_gOIw8o16i2o: - case mkldnn_gIOw16o16i: - return mkldnn_goiw; - default: - LOG(FATAL) << "Unknown MKLDNN format for 4 dimensions: " << desc.data.format; - return mkldnn_format_undef; - } - } else if (desc.data.ndims == 5) { - switch (desc.data.format) { - case mkldnn_goihw: - case mkldnn_giohw: - case mkldnn_hwigo: - case mkldnn_hwigo_s8s8: - case mkldnn_gOIhw4i4o: - case mkldnn_gOIhw8i8o: - case mkldnn_gOIhw16i16o: - case mkldnn_gOIhw4i16o4i: - case mkldnn_gOIhw4i16o4i_s8s8: - case mkldnn_gOIhw8i16o2i: - case mkldnn_gOIhw8o16i2o: - case mkldnn_gOIhw8o8i: - case mkldnn_gOIhw4o4i: - case mkldnn_gOIhw16o16i: - case mkldnn_gIOhw16o16i: - case mkldnn_gOihw8o: - case mkldnn_Goihw8g: - case mkldnn_gOihw16o: - case mkldnn_Goihw16g: - case mkldnn_gOhwi8o: - case mkldnn_gOhwi16o: - case mkldnn_gOhIw16o4i: - case mkldnn_Goihw16g_s8s8: - return mkldnn_goihw; - default: - LOG(FATAL) << "Unknown MKLDNN format for 5 dimensions: " << desc.data.format; - return mkldnn_format_undef; +mkldnn_format_tag_t GetDefaultFormat(const mkldnn::memory::desc &desc) { + return GetDefaultFormat(desc.data.ndims); +} + +bool IsDefaultFormat(const mkldnn::memory::desc &desc) { + bool rslt = false; + if (desc.data.format_kind == mkldnn_blocked) { + if (desc.data.format_desc.blocking.inner_nblks == 0) { + int i = 0; + for (i = 0; i < desc.data.ndims-1; i++) { + if (desc.data.format_desc.blocking.strides[i] + < desc.data.format_desc.blocking.strides[i + 1]) { + break; + } + } + if (i == desc.data.ndims-1) { + rslt = true; + } } - } else { - LOG(FATAL) << "Unsupported dimensions: " << desc.data.ndims; - return mkldnn_format_undef; } + return rslt; } -mkldnn::memory::primitive_desc GetPrimitiveDesc(mkldnn::memory::primitive_desc pd, - mkldnn_memory_format_t format) { - mkldnn::memory::dims dims(pd.desc().data.ndims); +mkldnn::memory::desc GetDesc(const mkldnn::memory::desc &desc, + const mkldnn_format_tag_t &format) { + mkldnn::memory::dims dims(desc.data.ndims); for (size_t i = 0; i < dims.size(); i++) - dims[i] = pd.desc().data.dims[i]; - mkldnn::memory::format cpp_format = static_cast<mkldnn::memory::format>(format); + dims[i] = desc.data.dims[i]; + mkldnn::memory::format_tag cpp_format = static_cast<mkldnn::memory::format_tag>(format); mkldnn::memory::data_type cpp_type = static_cast<mkldnn::memory::data_type>( - pd.desc().data.data_type); + desc.data.data_type); mkldnn::memory::desc data_md(dims, cpp_type, cpp_format); - return mkldnn::memory::primitive_desc(data_md, pd.get_engine()); + return mkldnn::memory::desc(dims, cpp_type, cpp_format); } - void FallBackCompute(FCompute fn, const nnvm::NodeAttrs &attrs, + template <typename Compute, typename AttrState> + void FallBackCompute(Compute fn, const AttrState &attrs_states, const OpContext &ctx, const std::vector<NDArray> &inputs, const std::vector<OpReqType> &req,
