diff --git a/aidge_export_cpp/export.py b/aidge_export_cpp/export.py index adeab0d5c12e8802f97eb6cb4f8446c819f1544e..7effde97a608c5630cf94870f301e3a56fb0a1a2 100644 --- a/aidge_export_cpp/export.py +++ b/aidge_export_cpp/export.py @@ -19,7 +19,9 @@ def export(export_folder_name: str, inputs_tensor: aidge_core.Tensor = None, labels: aidge_core.Tensor = None, dev_mode: bool = False, - aidge_cmp: bool = False): + aidge_cmp: bool = False, + memory_manager = generate_optimized_memory_info, + memory_manager_args = {}): """ Export an aidge_core.Scheduler to C++ code @@ -68,13 +70,16 @@ def export(export_folder_name: str, - Copy all needed kernels """ + if "stats_folder" not in memory_manager_args: + memory_manager_args["stats_folder"] = f"{export_folder_name}/stats" + scheduler_export(scheduler, export_folder_name, ExportLibCpp, - memory_manager=generate_optimized_memory_info, - memory_manager_args={ - "stats_folder": f"{export_folder_name}/stats"}, + memory_manager=memory_manager, + memory_manager_args=memory_manager_args, dev_mode=dev_mode) + graphview.save(f"{export_folder_name}/graph") # Generate main file generate_main_cpp(export_folder_name, graphview, labels=labels, inputs_tensor=inputs_tensor) diff --git a/aidge_export_cpp/operators/Producer.py b/aidge_export_cpp/operators/Producer.py index 59979fe42921f2c79ff3ad2f03c059d866b36643..bfae74fe490bdb24e99b8ecb00f6df8d7c42a6a7 100644 --- a/aidge_export_cpp/operators/Producer.py +++ b/aidge_export_cpp/operators/Producer.py @@ -2,7 +2,7 @@ import os from pathlib import Path import numpy as np import aidge_core -from aidge_core.export_utils import ExportNode, generate_file +from aidge_core.export_utils import ExportNodeCpp, generate_file from aidge_export_cpp import ROOT from aidge_export_cpp import ExportLibCpp @@ -43,22 +43,34 @@ def export_params(name: str, ) @ExportLibCpp.register("Producer", aidge_core.ImplSpec(aidge_core.IOSpec(aidge_core.dtype.any))) -class ProducerCPP(ExportNode): +class ProducerCPP(ExportNodeCpp): def __init__(self, node, mem_info): super().__init__(node, mem_info) self.values = np.array(self.operator.get_output(0)) self.ignore = node.attributes().has_attr("ignore") def export(self, export_folder: Path): - if not self.ignore : - header_path = f"include/parameters/{self.attributes['name']}.h" - export_params( - self.attributes['out_name'][0], - self.values.reshape(-1), - str(export_folder / header_path)) - return [header_path] - return [] + if self.ignore: + return [] + + path_to_definition = f"{self.config_path}/{self.attributes['name']}.{self.config_extension}" + + try: + aidge_core.export_utils.code_generation.generate_file( + str(export_folder / path_to_definition), + str(ROOT / "templates" / "configuration" / "producer_config.jinja"), + **self.attributes + ) + except Exception as e: + raise RuntimeError(f"Error when creating config file for {self.node.name()}[{self.node.type()}].") from e + + header_path = f"include/parameters/{self.attributes['name']}.h" + export_params( + self.attributes['out_name'][0], + self.values.reshape(-1), + str(export_folder / header_path)) + return [path_to_definition, header_path] def forward(self): # A Producer does nothing during forward - return [] \ No newline at end of file + return [] diff --git a/aidge_export_cpp/templates/configuration/_meminfo.jinja b/aidge_export_cpp/templates/configuration/_meminfo.jinja index 15d15425b4330f68b4a97c31e9cf7a1076cc93e8..ad6e76f3803661a8859f75289d29ee29ff0945fe 100644 --- a/aidge_export_cpp/templates/configuration/_meminfo.jinja +++ b/aidge_export_cpp/templates/configuration/_meminfo.jinja @@ -1,11 +1,25 @@ // MEMINFO CONF +{% for inidx in range(nb_in) -%} +{# Specify a default memory layout for standalone input tensors -#} +{% if not in_node[inidx] %} +#define {{ in_name[inidx]|upper }}_MEM_SIZE {{ in_size[inidx] }} +#define {{ in_name[inidx]|upper }}_MEM_OFFSET 0 +#define {{ in_name[inidx]|upper }}_MEM_STRIDE {{ in_size[inidx] }} +#define {{ in_name[inidx]|upper }}_MEM_LENGTH 1 +#define {{ in_name[inidx]|upper }}_MEM_CONT_SIZE {{ in_size[inidx] }} +#define {{ in_name[inidx]|upper }}_MEM_CONT_OFFSET 0 +#define {{ in_name[inidx]|upper }}_MEM_WRAP_OFFSET 0 +#define {{ in_name[inidx]|upper }}_MEM_WRAP_SIZE 0 +{% endif %} +{% endfor %} + {% for outidx in range(nb_out) -%} -#define {{ out_name[outidx]|upper }}_SIZE {{ mem_info_size[outidx]}} -#define {{ out_name[outidx]|upper }}_OFFSET {{ mem_info_offset[outidx]}} -#define {{ out_name[outidx]|upper }}_STRIDE {{ mem_info_stride[outidx]}} -#define {{ out_name[outidx]|upper }}_LENGTH {{ mem_info_length[outidx]}} -#define {{ out_name[outidx]|upper }}_CONT_SIZE {{ mem_info_cont_size[outidx]}} -#define {{ out_name[outidx]|upper }}_CONT_OFFSET {{ mem_info_cont_offset[outidx]}} -#define {{ out_name[outidx]|upper }}_WRAP_OFFSET {{ mem_info_wrap_offset[outidx]}} -#define {{ out_name[outidx]|upper }}_WRAP_SIZE {{ mem_info_wrap_size[outidx]}} +#define {{ out_name[outidx]|upper }}_MEM_SIZE {{ mem_info_size[outidx]}} +#define {{ out_name[outidx]|upper }}_MEM_OFFSET {{ mem_info_offset[outidx]}} +#define {{ out_name[outidx]|upper }}_MEM_STRIDE {{ mem_info_stride[outidx]}} +#define {{ out_name[outidx]|upper }}_MEM_LENGTH {{ mem_info_length[outidx]}} +#define {{ out_name[outidx]|upper }}_MEM_CONT_SIZE {{ mem_info_cont_size[outidx]}} +#define {{ out_name[outidx]|upper }}_MEM_CONT_OFFSET {{ mem_info_cont_offset[outidx]}} +#define {{ out_name[outidx]|upper }}_MEM_WRAP_OFFSET {{ mem_info_wrap_offset[outidx]}} +#define {{ out_name[outidx]|upper }}_MEM_WRAP_SIZE {{ mem_info_wrap_size[outidx]}} {% endfor %} diff --git a/aidge_export_cpp/templates/configuration/producer_config.jinja b/aidge_export_cpp/templates/configuration/producer_config.jinja new file mode 100644 index 0000000000000000000000000000000000000000..ad0660f50d94984b1113af2cc4fae4cca5ac00c5 --- /dev/null +++ b/aidge_export_cpp/templates/configuration/producer_config.jinja @@ -0,0 +1,8 @@ +{#- For name header -#} +#ifndef {{ name|upper }}_LAYER_H +#define {{ name|upper }}_LAYER_H + +{# For layer configuration -#} +{% include "./_meminfo.jinja" %} + +#endif /* {{ name|upper }}_LAYER_H */ \ No newline at end of file diff --git a/aidge_export_cpp/templates/kernel_forward/_mem_offset.jinja b/aidge_export_cpp/templates/kernel_forward/_mem_offset.jinja index a32b16bce8c0327ce21c886c7f0be996d0e335b8..e3853184e7bedf0195abe6867eb12439590001d5 100644 --- a/aidge_export_cpp/templates/kernel_forward/_mem_offset.jinja +++ b/aidge_export_cpp/templates/kernel_forward/_mem_offset.jinja @@ -1,3 +1,3 @@ {%- for outidx in range(nb_out) %} -{{out_cdtype[outidx]}}* {{out_name[outidx]}} = ({{out_cdtype[outidx]}}*) (mem + {{out_name[outidx]|upper}}_OFFSET); +{{out_cdtype[outidx]}}* {{out_name[outidx]}} = ({{out_cdtype[outidx]}}*) (mem + {{out_name[outidx]|upper}}_MEM_OFFSET); {%- endfor %} diff --git a/aidge_export_cpp/unit_tests/test_export.py b/aidge_export_cpp/unit_tests/test_export.py index f0fe59a1078bd9a644517c8eaee30de6e0aec97d..871e7013336b120f175b08b44dd1fb4ff33510ef 100644 --- a/aidge_export_cpp/unit_tests/test_export.py +++ b/aidge_export_cpp/unit_tests/test_export.py @@ -154,6 +154,7 @@ class test_operator_export(unittest.TestCase): aidge_core.adapt_to_backend(graph_view) graph_view.forward_dims(dims=in_dims) graph_view.save(export_folder + "/graph") + scheduler = aidge_core.SequentialScheduler(graph_view) scheduler.generate_scheduling()