Skip to content

Commit 0b8afb8

Browse files
committed
[microNPU] Adding a option to enable striping
This commit adds a cascader option to enable striping explicitly. When doing so fixed a bug that is associated with block config selection, that will be triggered when striping is disabled. Co-authored-by: Elen Kalda <[email protected]> Change-Id: Ie32cef85814ce380a77daa4f8cf1f607891c9c69
1 parent 8d4f4dd commit 0b8afb8

File tree

13 files changed

+121
-33
lines changed

13 files changed

+121
-33
lines changed

python/tvm/contrib/ethosu/cascader/cascader_options.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ class CascaderOptions(Object):
4040
The maximum number of Parts in a Plan.
4141
always_copy_size : int
4242
The maximum size of a Tensor that will always be copied into the cascade region.
43+
enable_striping : bool
44+
A boolean option to enable striping
4345
4446
"""
4547

@@ -50,6 +52,7 @@ def __init__(
5052
stripe_factors: int,
5153
max_plan_size: int,
5254
always_copy_size: int,
55+
enable_striping: bool = False,
5356
):
5457
self.__init_handle_by_constructor__(
5558
_ffi_api.CascaderOptions,
@@ -58,4 +61,5 @@ def __init__(
5861
stripe_factors,
5962
max_plan_size,
6063
always_copy_size,
64+
enable_striping,
6165
)

python/tvm/contrib/ethosu/cascader/device_config.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -594,7 +594,7 @@ def _get_subkernel_propagator(
594594
if output_layout == "NHCWB16" and input_layout == "NHWC":
595595
transform[3][-1] = depth
596596
elif output_layout == "NHCWB16" and input_layout == "NHCWB16":
597-
transform[2][-1] = depth // 16
597+
transform[2][-1] = 1 + ((depth - 1) // 16)
598598

599599
return Propagator(transform, ifm_propagator.offset)
600600

python/tvm/contrib/ethosu/cascader/plan_generator.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,10 @@
2626
from .graph import CascaderGraph, Part, Tensor
2727

2828

29-
def _generate_output_stripe_configs(part: Part, stripe_factors: int) -> List[StripeConfig]:
30-
return list(_ffi_api.GenerateOutputStripeConfigs(part, stripe_factors))
29+
def _generate_output_stripe_configs(
30+
part: Part, stripe_factors: int, enable_striping: bool
31+
) -> List[StripeConfig]:
32+
return list(_ffi_api.GenerateOutputStripeConfigs(part, stripe_factors, enable_striping))
3133

3234

3335
def _generate_single_plans(

python/tvm/relay/backend/contrib/ethosu/codegen.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -357,7 +357,7 @@ def _cascader(te_graph, const_dict, sch):
357357
return _cascader
358358

359359

360-
def _ethos_u55_cascader(sram) -> Callable:
360+
def _ethos_u55_cascader(sram, enable_striping) -> Callable:
361361
# TODO(ekalda): Extract the flash info from ConstantPools once it is implemented
362362
flash = MemoryRegion(name="FLASH", size=10**7, read_bandwidth=4, write_bandwidth=4)
363363

@@ -368,6 +368,7 @@ def _ethos_u55_cascader(sram) -> Callable:
368368
stripe_factors=5,
369369
max_plan_size=10,
370370
always_copy_size=1024,
371+
enable_striping=enable_striping,
371372
)
372373
return _create_cascader(
373374
options=cascader_options,
@@ -425,7 +426,7 @@ def relay_to_tir(mod: tvm.ir.IRModule) -> tvm.ir.IRModule:
425426
), "Exactly one workspace pool needs to be provided for the U55 cascader"
426427

427428
sram = extract_memory_info(workspace_memory_pools.pools[0])
428-
tir_mod = LowerToTIR(_ethos_u55_cascader(sram))(mod)
429+
tir_mod = LowerToTIR(_ethos_u55_cascader(sram, util.is_striping_enabled()))(mod)
429430
else:
430431
tir_mod = LowerToTIR(copy_constants())(mod)
431432

python/tvm/relay/backend/contrib/ethosu/util.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,12 @@ def is_cascader_enabled():
247247
return compiler_attrs.enable_cascader
248248

249249

250+
def is_striping_enabled():
251+
"""Determine whether the cascader is enabled"""
252+
compiler_attrs = tvm.get_global_func("relay.ext.ethos-u.get_compiler_attrs")()
253+
return compiler_attrs.enable_striping
254+
255+
250256
def get_arg_count(func):
251257
"""Helper function to get the number of
252258
arguments in a python function"""

src/contrib/ethosu/cascader/cascader_options.cc

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,24 +31,27 @@ void CascaderOptionsNode::VisitAttrs(AttrVisitor* v) {
3131
v->Visit("stripe_factors", &stripe_factors);
3232
v->Visit("max_plan_size", &max_plan_size);
3333
v->Visit("always_copy_size", &always_copy_size);
34+
v->Visit("enable_striping", &enable_striping);
3435
}
3536

3637
CascaderOptions::CascaderOptions(const MemoryRegion& cascade_region, int max_proposals,
37-
int stripe_factors, int max_plan_size, int always_copy_size) {
38+
int stripe_factors, int max_plan_size, int always_copy_size,
39+
bool enable_striping) {
3840
auto n = make_object<CascaderOptionsNode>();
3941
n->cascade_region = std::move(cascade_region);
4042
n->max_proposals = max_proposals;
4143
n->stripe_factors = stripe_factors;
4244
n->max_plan_size = max_plan_size;
4345
n->always_copy_size = always_copy_size;
46+
n->enable_striping = enable_striping;
4447
data_ = std::move(n);
4548
}
4649

4750
TVM_REGISTER_GLOBAL("contrib.ethosu.cascader.CascaderOptions")
4851
.set_body_typed([](MemoryRegion cascade_region, int max_proposals, int stripe_factors,
49-
int max_plan_size, int always_copy_size) {
52+
int max_plan_size, int always_copy_size, bool enable_striping) {
5053
return CascaderOptions(cascade_region, max_proposals, stripe_factors, max_plan_size,
51-
always_copy_size);
54+
always_copy_size, enable_striping);
5255
});
5356

5457
TVM_REGISTER_NODE_TYPE(CascaderOptionsNode);

src/contrib/ethosu/cascader/cascader_options.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ class CascaderOptionsNode : public Object {
4949
int max_plan_size;
5050
/*! \brief The maximum size of Tensor that will always be copied into the cascade region. */
5151
int always_copy_size;
52+
/*! \brief A boolean option to enable striping. */
53+
bool enable_striping;
5254

5355
static constexpr const char* _type_key = "contrib.ethosu.cascader.CascaderOptions";
5456
TVM_DECLARE_FINAL_OBJECT_INFO(CascaderOptionsNode, Object)
@@ -58,7 +60,7 @@ class CascaderOptionsNode : public Object {
5860
class CascaderOptions : public ObjectRef {
5961
public:
6062
CascaderOptions(const MemoryRegion& cascade_region, int max_proposals, int stripe_factors,
61-
int max_plan_size, int always_copy_size);
63+
int max_plan_size, int always_copy_size, bool enable_striping = true);
6264

6365
TVM_DEFINE_OBJECT_REF_METHODS(CascaderOptions, ObjectRef, CascaderOptionsNode);
6466
};

src/contrib/ethosu/cascader/plan_generator.cc

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,8 @@ std::vector<bool> GetCascadableAxes(const Part& part) {
105105
return cascadable_axes;
106106
}
107107

108-
std::vector<StripeConfig> GenerateOutputStripeConfigs(const Part& part, int stripe_factors) {
108+
std::vector<StripeConfig> GenerateOutputStripeConfigs(const Part& part, int stripe_factors,
109+
bool enable_striping) {
109110
// If stripe_factors is <= 0, then we won't produce any StripeConfigs
110111
if (stripe_factors <= 0) {
111112
return std::vector<StripeConfig>();
@@ -134,7 +135,7 @@ std::vector<StripeConfig> GenerateOutputStripeConfigs(const Part& part, int stri
134135
auto axis = output_shape[i];
135136
auto axis_align = part->GetStripeAlignHint()[i];
136137
std::set<int> axis_splits; // Note this is a set to remove duplicate splits
137-
if (!cascadable_axes[i]) {
138+
if (!cascadable_axes[i] || (!enable_striping)) {
138139
axis_splits.insert(axis);
139140
} else {
140141
for (float factor : factors) {
@@ -436,7 +437,7 @@ std::unordered_map<std::vector<Part>, std::vector<Plan>> GenerateGraphPlans(
436437
// output of a Plan. The number generated is a function of stripe_factors and the number of
437438
// cascadable dimensions in the Part.
438439
std::vector<StripeConfig> stripe_configs =
439-
GenerateOutputStripeConfigs(part, options->stripe_factors);
440+
GenerateOutputStripeConfigs(part, options->stripe_factors, options->enable_striping);
440441
// Check to see if the output Tensor is part of any existing open Plans
441442
if (stripe_configs_by_tensor.find(part->GetOutputTensor()) != stripe_configs_by_tensor.end()) {
442443
// If there are other open Plans which have this Part's output Tensor as an input, then
@@ -514,11 +515,12 @@ std::unordered_map<std::vector<Part>, std::vector<Plan>> GenerateGraphPlans(
514515
}
515516

516517
TVM_REGISTER_GLOBAL("contrib.ethosu.cascader.GenerateOutputStripeConfigs")
517-
.set_body_typed([](Part part, int stripe_factors) {
518+
.set_body_typed([](Part part, int stripe_factors, bool enable_striping) {
518519
if (stripe_factors < 0) {
519520
return Array<StripeConfig>();
520521
}
521-
return Array<StripeConfig>(GenerateOutputStripeConfigs(part, stripe_factors));
522+
return Array<StripeConfig>(
523+
GenerateOutputStripeConfigs(part, stripe_factors, enable_striping));
522524
});
523525

524526
TVM_REGISTER_GLOBAL("contrib.ethosu.cascader.GenerateSinglePlans")

src/relay/backend/contrib/ethosu/compiler_attrs.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ namespace ethosu {
4040
struct EthosUCompilerConfigNode : public tvm::AttrsNode<EthosUCompilerConfigNode> {
4141
String accelerator_config;
4242
bool enable_cascader;
43+
bool enable_striping;
4344

4445
TVM_DECLARE_ATTRS(EthosUCompilerConfigNode, "ext.attrs.EthosUCompilerConfigNode") {
4546
TVM_ATTR_FIELD(accelerator_config)
@@ -50,6 +51,9 @@ struct EthosUCompilerConfigNode : public tvm::AttrsNode<EthosUCompilerConfigNode
5051
TVM_ATTR_FIELD(enable_cascader)
5152
.describe("Whether the cascader should be enabled")
5253
.set_default(false);
54+
TVM_ATTR_FIELD(enable_striping)
55+
.describe("Whether the cascader should be striping")
56+
.set_default(false);
5357
}
5458
};
5559

tests/python/contrib/test_ethosu/cascader/infra.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,15 @@ def make_options(
3232
stripe_factors: int = 1,
3333
max_plan_size: int = 1,
3434
always_copy_size: int = 1024,
35+
enable_striping: bool = True,
3536
):
3637
return cs.CascaderOptions(
3738
cascade_region=cascade_region,
3839
max_proposals=max_proposals,
3940
stripe_factors=stripe_factors,
4041
max_plan_size=max_plan_size,
4142
always_copy_size=always_copy_size,
43+
enable_striping=enable_striping,
4244
)
4345

4446

0 commit comments

Comments
 (0)