Skip to content
This repository has been archived by the owner on Nov 17, 2023. It is now read-only.

[OpPerf] Consolidate array manipulation related operators #17487

Merged
merged 21 commits into from Mar 10, 2020

Conversation

ChaiBapchya
Copy link
Contributor

@ChaiBapchya ChaiBapchya commented Jan 30, 2020

Description

Rename array_rearrange.py file to array_manipulation_operators because there are 4 categories that we identified

  1. Array Rearrange
  2. Array Shape Manipulation
  3. Array Expansion
  4. Array Rounding
  5. Array Join & Split

Accordingly operators that didn't fall in previous existing categories (unary/binary/etc) have been allocated to these 4 categories as found meaningful.

These are the groupings

Array Rearrange Operators

  1. transpose
  2. swapaxes (alias SwapAxis)
  3. flip (alias reverse)
  4. depth_to_space
  5. space_to_depth

Array Shape Manipulation Operators

  1. split (alias SliceChannel)
  2. diag
  3. reshape
  4. reshape_like
  5. size_array
  6. shape_array

Array Expanding Operators

  1. broadcast_axes (alias broadcast_axis)
  2. broadcast_to
  3. broadcast_like
  4. repeat
  5. tile
  6. pad
  7. expand_dims

Array Rounding Operators

  1. round
  2. rint
  3. fix
  4. floor
  5. ceil
  6. trunc

Array Join & Split Operators

  1. concat
  2. split
  3. stack

Checklist

Essentials

Please feel free to remove inapplicable items for your PR.

  • Changes are complete (i.e. I finished coding on this PR)
  • All changes have test coverage:
  • Code is well-documented:
  • To the best of my knowledge, examples are either not affected by this change, or have been fixed to be compatible with this change

Changes

   deleted:    benchmark/opperf/nd_operations/array_rearrange.py
    modified:   benchmark/opperf/opperf.py
    modified:   benchmark/opperf/utils/op_registry_utils.py
   added:       benchmark/opperf/nd_operations/array_manipulation_operators.py

@ChaiBapchya
Copy link
Contributor Author

ChaiBapchya commented Feb 4, 2020

All 5 categories

>>> from benchmark.opperf.nd_operations.array_manipulation_operators import run_rearrange_operators_benchmarks, run_shape_operators_benchmarks, run_expanding_operators_benchmarks, run_rounding_operators_benchmarks

Results

run_expanding_operators_benchmarks()
INFO:root:Begin Benchmark - broadcast_axes
INFO:root:Complete Benchmark - broadcast_axes
INFO:root:Begin Benchmark - broadcast_axis
INFO:root:Complete Benchmark - broadcast_axis
INFO:root:Begin Benchmark - broadcast_like
INFO:root:Complete Benchmark - broadcast_like
INFO:root:Begin Benchmark - broadcast_to
INFO:root:Complete Benchmark - broadcast_to
INFO:root:Begin Benchmark - expand_dims
INFO:root:Complete Benchmark - expand_dims
INFO:root:Begin Benchmark - pad
INFO:root:Complete Benchmark - pad
INFO:root:Begin Benchmark - repeat
INFO:root:Complete Benchmark - repeat
INFO:root:Begin Benchmark - tile
INFO:root:Complete Benchmark - tile
{'broadcast_axis': [{'avg_time_forward_broadcast_axis': 0.0342, 'max_storage_mem_alloc_cpu/0': 4.096, 'inputs': {'data': (1, 1024), 'axis': 0, 'size': 2}}, {'avg_time_forward_broadcast_axis': 0.0302, 'max_storage_mem_alloc_cpu/0': 0.008, 'inputs': {'data': (1, 1), 'axis': 0, 'size': 2}}, {'avg_time_forward_broadcast_axis': 0.024, 'max_storage_mem_alloc_cpu/0': 0.8, 'inputs': {'data': (1, 100), 'axis': 0, 'size': 2}}], 'broadcast_like': [{'avg_time_forward_broadcast_like': 1.5138, 'max_
storage_mem_alloc_cpu/0': 4194.3042, 'inputs': {'lhs': (1024, 1024), 'rhs': (1024, 1024)}}, {'avg_time_forward_broadcast_like': 0.1705, 'max_storage_mem_alloc_cpu/0': 400.0, 'inputs': {'lhs': (10000, 10), 'rhs': (10000, 10)}}, {'avg_time_forward_broadcast_like': 0.0446, 'max_storage_mem_alloc_cpu/0': 20.0, 'inputs': {'lhs': (10000, 1), 'rhs': (10000, 1)}}], 'pad': [{'max_storage_mem_alloc_cpu/0': 0.192, 'inputs': {'data': (1, 4, 2, 4), 'mode': 'constant', 'pad_width': (0, 0, 0, 0, 1, 1
, 1, 1)}}, {'max_storage_mem_alloc_cpu/0': 612.0, 'inputs': {'data': (10, 25, 10, 100), 'mode': 'constant', 'pad_width': (0, 0, 0, 0, 1, 1, 1, 1)}}], 'repeat': [{'avg_time_forward_repeat': 7.5347, 'avg_time_backward_repeat': 10.3592, 'max_storage_mem_alloc_cpu/0': 4194.3042, 'inputs': {'data': (1024, 1024), 'repeats': 2, 'axis': 0}}, {'avg_time_forward_repeat': 0.0664, 'avg_time_backward_repeat': 0.0716, 'max_storage_mem_alloc_cpu/0': 40.0, 'inputs': {'data': (10000, 1), 'repeats': 2,
'axis': 0}}, {'avg_time_forward_repeat': 6.0047, 'avg_time_backward_repeat': 8.3208, 'max_storage_mem_alloc_cpu/0': 4000.0, 'inputs': {'data': (10000, 100), 'repeats': 2, 'axis': 0}}], 'tile': [{'avg_time_backward_tile': 7.2161, 'max_storage_mem_alloc_cpu/0': 4194.3042, 'avg_time_forward_tile': 5.2652, 'inputs': {'data': (1024, 1024), 'reps': 2}}, {'avg_time_backward_tile': 0.0631, 'max_storage_mem_alloc_cpu/0': 40.0, 'avg_time_forward_tile': 0.1274, 'inputs': {'data': (10000, 1), 'rep
s': 2}}, {'avg_time_backward_tile': 6.7835, 'max_storage_mem_alloc_cpu/0': 4000.0, 'avg_time_forward_tile': 4.8181, 'inputs': {'data': (10000, 100), 'reps': 2}}], 'broadcast_to': [{'max_storage_mem_alloc_cpu/0': 2097.1521, 'avg_time_forward_broadcast_to': 1.4573, 'inputs': {'data': (1, 1024), 'shape': (1024, 1024)}}, {'max_storage_mem_alloc_cpu/0': 40.0, 'avg_time_forward_broadcast_to': 0.0741, 'inputs': {'data': (1, 1), 'shape': (10000, 1)}}, {'max_storage_mem_alloc_cpu/0': 2000.0, 'a
vg_time_forward_broadcast_to': 1.5039, 'inputs': {'data': (1, 100), 'shape': (10000, 100)}}], 'expand_dims': [{'avg_time_forward_expand_dims': 0.15, 'max_storage_mem_alloc_cpu/0': 2097.1521, 'inputs': {'data': (1024, 1024), 'axis': 0}}, {'avg_time_forward_expand_dims': 0.029, 'max_storage_mem_alloc_cpu/0': 20.0, 'inputs': {'data': (10000, 1), 'axis': 0}}, {'avg_time_forward_expand_dims': 0.0524, 'max_storage_mem_alloc_cpu/0': 2000.0, 'inputs': {'data': (10000, 100), 'axis': 0}}], 'broa
dcast_axes': [{'avg_time_forward_broadcast_axes': 0.0416, 'max_storage_mem_alloc_cpu/0': 4.096, 'inputs': {'data': (1, 1024), 'axis': 0, 'size': 2}}, {'avg_time_forward_broadcast_axes': 0.0341, 'max_storage_mem_alloc_cpu/0': 0.004, 'inputs': {'data': (1, 1), 'axis': 0, 'size': 2}}, {'avg_time_forward_broadcast_axes': 0.0354, 'max_storage_mem_alloc_cpu/0': 0.4, 'inputs': {'data': (1, 100), 'axis': 0, 'size': 2}}]}
run_rearrange_operators_benchmarks()
INFO:root:Begin Benchmark - SwapAxis
INFO:root:Complete Benchmark - SwapAxis
INFO:root:Begin Benchmark - depth_to_space
INFO:root:Complete Benchmark - depth_to_space
INFO:root:Begin Benchmark - flip
INFO:root:Complete Benchmark - flip
INFO:root:Begin Benchmark - reverse
INFO:root:Complete Benchmark - reverse
INFO:root:Begin Benchmark - space_to_depth
INFO:root:Complete Benchmark - space_to_depth
INFO:root:Begin Benchmark - swapaxes
INFO:root:Complete Benchmark - swapaxes
INFO:root:Begin Benchmark - transpose
INFO:root:Complete Benchmark - transpose
{'transpose': [{'max_storage_mem_alloc_cpu/0': 4194.3042, 'avg_time_forward_transpose': 0.2103, 'inputs': {'data': (1024, 1024)}}, {'max_storage_mem_alloc_cpu/0': 40.0, 'avg_time_forward_transpose': 0.0465, 'inputs': {'data': (10000, 1)}}, {'max_storage_mem_alloc_cpu/0': 4000.0, 'avg_time_forward_transpose': 0.266, 'inputs': {'data': (10000, 100)}}], 'depth_to_space': [{'max_storage_mem_alloc_cpu/0': 0.128, 'avg_time_forward_depth_to_space': 0.2052, 'inputs': {'data': (1, 4, 2, 4), 'block_size': 2}}, {'max_storage_mem_alloc_cpu/0': 1000.0, 'avg_time_forward_depth_to_space': 1.2413, 'inputs': {'data': (10, 25, 10, 100), 'block_size': 5}}], 'SwapAxis': [{'max_storage_mem_alloc_cpu/0': 4194.3042, 'avg_time_forward_SwapAxis': 3.3261, 'avg_time_backward_SwapAxis': 3.2804, 'inputs': {'data': (1024, 1024), 'dim1': 0, 'dim2': 1}}, {'max_storage_mem_alloc_cpu/0': 40.0, 'avg_time_forward_SwapAxis': 0.0658, 'avg_time_backward_SwapAxis': 0.0532, 'inputs': {'data': (10000, 1), 'dim1': 0, 'dim2': 1}}, {'max_storage_mem_alloc_cpu/0': 4000.0, 'avg_time_forward_SwapAxis': 2.7984, 'avg_time_backward_SwapAxis': 3.0327, 'inputs': {'data': (10000, 100), 'dim1': 0, 'dim2': 1}}], 'reverse': [{'max_storage_mem_alloc_cpu/0': 2097.1521, 'avg_time_forward_reverse': 0.8368, 'avg_time_backward_reverse': 0.774, 'inputs': {'data': (1024, 1024), 'axis': 0}}, {'max_storage_mem_alloc_cpu/0': 20.0, 'avg_time_forward_reverse': 0.0405, 'avg_time_backward_reverse': 0.0369, 'inputs': {'data': (10000, 1), 'axis': 0}}, {'max_storage_mem_alloc_cpu/0': 2000.0, 'avg_time_forward_reverse': 0.9559, 'avg_time_backward_reverse': 0.9159, 'inputs': {'data': (10000, 100), 'axis': 0}}], 'flip': [{'max_storage_mem_alloc_cpu/0': 2097.1521, 'avg_time_forward_flip': 0.7658, 'inputs': {'data': (1024, 1024), 'axis': 0}}, {'max_storage_mem_alloc_cpu/0': 20.0, 'avg_time_forward_flip': 0.0343, 'inputs': {'data': (10000, 1), 'axis': 0}}, {'max_storage_mem_alloc_cpu/0': 2000.0, 'avg_time_forward_flip': 0.7287, 'inputs': {'data': (10000, 100), 'axis': 0}}], 'space_to_depth': [{'max_storage_mem_alloc_cpu/0': 0.064, 'avg_time_forward_space_to_depth': 0.0444, 'inputs': {'data': (1, 4, 2, 4), 'block_size': 2}}, {'max_storage_mem_alloc_cpu/0': 500.0, 'avg_time_forward_space_to_depth': 1.11, 'inputs': {'data': (10, 25, 10, 100), 'block_size': 5}}], 'swapaxes': [{'max_storage_mem_alloc_cpu/0': 2097.1521, 'avg_time_forward_swapaxes': 2.4288, 'inputs': {'data': (1024, 1024), 'dim1': 0, 'dim2': 1}}, {'max_storage_mem_alloc_cpu/0': 20.0, 'avg_time_forward_swapaxes': 0.0526, 'inputs': {'data': (10000, 1), 'dim1': 0, 'dim2': 1}}, {'max_storage_mem_alloc_cpu/0': 2000.0, 'avg_time_forward_swapaxes': 2.5499, 'inputs': {'data': (10000, 100), 'dim1': 0, 'dim2': 1}}]}
>>>
>>> run_shape_operators_benchmarks()
INFO:root:Begin Benchmark - diag
INFO:root:Complete Benchmark - diag
INFO:root:Begin Benchmark - reshape
INFO:root:Complete Benchmark - reshape
INFO:root:Begin Benchmark - reshape_like
INFO:root:Complete Benchmark - reshape_like
INFO:root:Begin Benchmark - shape_array
INFO:root:Complete Benchmark - shape_array
INFO:root:Begin Benchmark - size_array
INFO:root:Complete Benchmark - size_array
INFO:root:Begin Benchmark - split
INFO:root:Complete Benchmark - split
{'reshape_like': [{'max_storage_mem_alloc_cpu/0': 2097.1521, 'avg_time_forward_reshape_like': 0.4931, 'inputs': {'lhs': (1024, 1024), 'rhs': (1024, 1024)}}, {'max_storage_mem_alloc_cpu/0': 200.0, 'avg_time_forward_reshape_like': 0.2905, 'inputs': {'lhs': (10000, 10), 'rhs': (10000, 10)}}, {'max_storage_mem_alloc_cpu/0': 40.0, 'avg_time_forward_reshape_like': 0.0685, 'inputs': {'lhs': (10000, 1), 'rhs': (10000, 1)}}], 'shape_array': [{'max_storage_mem_alloc_cpu/0': 0.016, 'avg_time_forw
ard_shape_array': 0.014, 'inputs': {'data': (1024, 1024)}}, {'max_storage_mem_alloc_cpu/0': 0.016, 'avg_time_forward_shape_array': 0.0138, 'inputs': {'data': (10000, 1)}}, {'max_storage_mem_alloc_cpu/0': 0.016, 'avg_time_forward_shape_array': 0.0133, 'inputs': {'data': (10000, 100)}}], 'size_array': [{'avg_time_forward_size_array': 0.0138, 'max_storage_mem_alloc_cpu/0': 0.008, 'inputs': {'data': (1024, 1024)}}, {'avg_time_forward_size_array': 0.014, 'max_storage_mem_alloc_cpu/0': 0.008
, 'inputs': {'data': (10000, 1)}}, {'avg_time_forward_size_array': 0.0138, 'max_storage_mem_alloc_cpu/0': 0.008, 'inputs': {'data': (10000, 100)}}], 'reshape': [{'max_storage_mem_alloc_cpu/0': 2097.1521, 'avg_time_forward_reshape': 0.1507, 'inputs': {'data': (1024, 1024), 'shape': (1024, 1024)}}, {'max_storage_mem_alloc_cpu/0': 20.0, 'avg_time_forward_reshape': 0.0371, 'inputs': {'data': (10000, 1), 'shape': (10000, 1)}}, {'max_storage_mem_alloc_cpu/0': 2000.0, 'avg_time_forward_reshap
e': 0.1779, 'inputs': {'data': (10000, 100), 'shape': (10000, 100)}}], 'split': [{'max_storage_mem_alloc_cpu/0': 4194.3042, 'inputs': {'data': (1024, 1024), 'num_outputs': 1, 'axis': 0}}, {'max_storage_mem_alloc_cpu/0': 40.0, 'inputs': {'data': (10000, 1), 'num_outputs': 1, 'axis': 0}}, {'max_storage_mem_alloc_cpu/0': 4000.0, 'inputs': {'data': (10000, 100), 'num_outputs': 1, 'axis': 0}}], 'diag': [{'avg_time_forward_diag': 0.0346, 'max_storage_mem_alloc_cpu/0': 2.046, 'avg_time_backwa
rd_diag': 0.4403, 'inputs': {'data': (1024, 1024), 'k': 1}}, {'avg_time_forward_diag': 0.0311, 'avg_time_backward_diag': 0.0445, 'inputs': {'data': (10000, 1), 'k': 1}}, {'avg_time_forward_diag': 0.0317, 'max_storage_mem_alloc_cpu/0': 0.198, 'avg_time_backward_diag': 0.4408, 'inputs': {'data': (10000, 100), 'k': 1}}]}
>>> run_rounding_operators_benchmarks()
INFO:root:Begin Benchmark - ceil
INFO:root:Complete Benchmark - ceil
INFO:root:Begin Benchmark - fix
INFO:root:Complete Benchmark - fix
INFO:root:Begin Benchmark - floor
INFO:root:Complete Benchmark - floor
INFO:root:Begin Benchmark - rint
INFO:root:Complete Benchmark - rint
INFO:root:Begin Benchmark - round
INFO:root:Complete Benchmark - round
INFO:root:Begin Benchmark - trunc
INFO:root:Complete Benchmark - trunc
{'floor': [{'max_storage_mem_alloc_cpu/0': 2097.1521, 'avg_time_forward_floor': 0.1889, 'inputs': {'data': (1024, 1024)}}, {'max_storage_mem_alloc_cpu/0': 20.0, 'avg_time_forward_floor': 0.0483, 'inputs': {'data': (10000, 1)}}, {'max_storage_mem_alloc_cpu/0': 2000.0, 'avg_time_forward_floor': 0.1466, 'inputs': {'data': (10000, 100)}}], 'round': [{'avg_time_forward_round': 0.2401, 'max_storage_mem_alloc_cpu/0': 2097.1521, 'inputs': {'data': (1024, 1024)}}, {'avg_time_forward_round': 0.0
343, 'max_storage_mem_alloc_cpu/0': 20.0, 'inputs': {'data': (10000, 1)}}, {'avg_time_forward_round': 0.2264, 'max_storage_mem_alloc_cpu/0': 2000.0, 'inputs': {'data': (10000, 100)}}], 'trunc': [{'avg_time_forward_trunc': 0.2686, 'max_storage_mem_alloc_cpu/0': 4194.3042, 'inputs': {'data': (1024, 1024)}}, {'avg_time_forward_trunc': 0.0877, 'max_storage_mem_alloc_cpu/0': 20.0, 'inputs': {'data': (10000, 1)}}, {'avg_time_forward_trunc': 0.2895, 'max_storage_mem_alloc_cpu/0': 2000.0, 'inp
uts': {'data': (10000, 100)}}], 'fix': [{'avg_time_forward_fix': 0.4471, 'max_storage_mem_alloc_cpu/0': 2097.1521, 'inputs': {'data': (1024, 1024)}}, {'avg_time_forward_fix': 0.0372, 'max_storage_mem_alloc_cpu/0': 20.0, 'inputs': {'data': (10000, 1)}}, {'avg_time_forward_fix': 0.3923, 'max_storage_mem_alloc_cpu/0': 2000.0, 'inputs': {'data': (10000, 100)}}], 'rint': [{'avg_time_forward_rint': 0.2299, 'max_storage_mem_alloc_cpu/0': 2097.1521, 'inputs': {'data': (1024, 1024)}}, {'avg_tim
e_forward_rint': 0.0354, 'max_storage_mem_alloc_cpu/0': 40.0, 'inputs': {'data': (10000, 1)}}, {'avg_time_forward_rint': 0.2015, 'max_storage_mem_alloc_cpu/0': 2000.0, 'inputs': {'data': (10000, 100)}}], 'ceil': [{'max_storage_mem_alloc_cpu/0': 4194.3042, 'avg_time_forward_ceil': 0.3486, 'inputs': {'data': (1024, 1024)}}, {'max_storage_mem_alloc_cpu/0': 20.0, 'avg_time_forward_ceil': 0.0395, 'inputs': {'data': (10000, 1)}}, {'max_storage_mem_alloc_cpu/0': 2000.0, 'avg_time_forward_ceil
': 0.4362, 'inputs': {'data': (10000, 100)}}]}
>>> run_join_split_operators_benchmarks()
INFO:root:Begin Benchmark - concat
INFO:root:Complete Benchmark - concat
INFO:root:Begin Benchmark - split
INFO:root:Complete Benchmark - split
INFO:root:Begin Benchmark - stack
INFO:root:Complete Benchmark - stack
{'concat': [{'inputs': {'args0': '<NDArray 100x100 @cpu(0)>', 'args1': '<NDArray 100x100 @cpu(0)>', 'args2': '<NDArray 100x100 @cpu(0)>'}, 'max_storage_mem_alloc_cpu/0': 120.0}], 'split': [{'inputs': {'data': (1024, 1024), 'num_outputs': 2}, 'max_storage_mem_alloc_cpu/0': 4194.3042}, {'inputs': {'data': (10000, 1), 'num_outputs': 1}, 'max_storage_mem_alloc_cpu/0': 20.0}, {'inputs': {'data': (10000, 100), 'num_outputs': 10}, 'max_storage_mem_alloc_cpu/0': 3800.0}], 'stack': [{'inputs': {'args0': '<NDArray 100x100 @cpu(0)>', 'args1': '<NDArray 100x100 @cpu(0)>', 'args2': '<NDArray 100x100 @cpu(0)>'}, 'max_storage_mem_alloc_cpu/0': 60.0, 'avg_time_forward_stack': 0.0653}]}

@ChaiBapchya
Copy link
Contributor Author

@mxnet-label-bot add [pr-awaiting-review]

@lanking520 lanking520 added the pr-awaiting-review PR is waiting for code review label Feb 4, 2020
@ChaiBapchya
Copy link
Contributor Author

@ChaiBapchya
Copy link
Contributor Author

@@ -72,6 +73,8 @@ python incubator-mxnet/benchmark/opperf/opperf.py --output-format json --output-

3. **dtype** : By default, `float32`. You can override and set the global dtype for all operator benchmarks. Example: --dtype float64.

4. **profiler** : By default, 'native'. You can override and set the global profiler for all operator benchmarks. Example: --profiler 'python'.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What does native mean? Could you be more specific

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Native profiler uses the MXNet's default profiler function
Python uses python's time-it function

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I know what it means. Could you provide more information to first time users?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added a line. @apeforest

@apeforest
Copy link
Contributor

A small comment. Otherwise LGTM. Please rebase as well.

Copy link
Contributor Author

@ChaiBapchya ChaiBapchya left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Few notes about changes I made.

benchmark/opperf/rules/default_params.py Show resolved Hide resolved
benchmark/opperf/utils/op_registry_utils.py Outdated Show resolved Hide resolved
benchmark/opperf/utils/op_registry_utils.py Outdated Show resolved Hide resolved
benchmark/opperf/utils/op_registry_utils.py Outdated Show resolved Hide resolved
Copy link
Contributor

@sandeep-krishnamurthy sandeep-krishnamurthy left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ChaiBapchya
Copy link
Contributor Author

Can you please this list - https://github.com/apache/incubator-mxnet/tree/master/benchmark/opperf/nd_operations

@sandeep-krishnamurthy updated
Thanks for pointing out.

@ChaiBapchya
Copy link
Contributor Author

@apeforest apeforest merged commit a5d55de into apache:master Mar 10, 2020
@ChaiBapchya ChaiBapchya deleted the rearrange_ops branch March 10, 2020 21:40
MoisesHer pushed a commit to MoisesHer/incubator-mxnet that referenced this pull request Apr 10, 2020
* add shape manipulation, array expanding ops

* split as alias of SliceChannel

* add rounding ops

* add profiler param to function description

* add params, improve readability of prepare op input logic, improve opperf readme

* fix index merge issue

* add join,split ops

* minor fixes in join,split

* fix if else logic issue, lint

* add comment on profiler, remove all completed ops, add res of 2 ops i missed in previous PR

* remove unreachable if statements
anirudh2290 pushed a commit to anirudh2290/mxnet that referenced this pull request May 29, 2020
* add shape manipulation, array expanding ops

* split as alias of SliceChannel

* add rounding ops

* add profiler param to function description

* add params, improve readability of prepare op input logic, improve opperf readme

* fix index merge issue

* add join,split ops

* minor fixes in join,split

* fix if else logic issue, lint

* add comment on profiler, remove all completed ops, add res of 2 ops i missed in previous PR

* remove unreachable if statements
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
pr-awaiting-review PR is waiting for code review
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

4 participants