8 namespace_header = f
"""namespace {"::".join(function_definition._namespaces)}::sycl {{"""
11 if function_definition._template
is not None:
12 template_strings = [argument.print(self)
for argument
in function_definition._template]
13 template_string =
"template <" +
",".join(template_strings) +
">\n"
15 current_indent = indent_level + 1
16 statement_prints = [statement.print(self, current_indent + 1)
for statement
in function_definition._body]
17 argument_prints = [argument.print(self)
for argument
in function_definition._arguments]
18 statement_prints.insert(0,
"::sycl::queue& queue = tarch::accelerator::getSYCLQueue(targetDevice);")
19 statement_prints.insert(1,
"size_t range0, range1, range2;")
22 for dataBlockCreation
in SyntaxTree.FunctionDefinition._syclDataToCopy:
23 if len(dataBlockCreation._dataBlock._iteration_range) > 1:
24 step_size = SyntaxTree.Integer(1)
25 for d
in dataBlockCreation._dataBlock._iteration_range[0:-1]:
26 step_size = step_size * (d[1] - d[0])
27 size = step_size * (dataBlockCreation._dataBlock._iteration_range[-1][1] - dataBlockCreation._dataBlock._iteration_range[-1][0])
29 return f
"""{namespace_header}
30{template_string}{self.get_indent(indent_level)}{function_definition._return_type.print(self)} {function_definition.id}({', '.join(argument_prints)}) {{
31{os.linesep.join(statement_prints)}
32{self.get_indent(indent_level)}}}
37 namespace_header = f
"""namespace {"::".join(function_definition._namespaces)}::sycl {{"""
38 namespace_footer =
"}"
40 if function_definition._template
is not None:
41 template_strings = [argument.print(self)
for argument
in function_definition._template]
42 template_string =
"template <" +
",".join(template_strings) +
">\n"
44 current_indent = indent_level + 1
45 argument_prints = [argument.print(self)
for argument
in function_definition._arguments]
47 return f
"""{namespace_header}
48{template_string}{self.get_indent(indent_level)}{function_definition._return_type.print(self)} {function_definition.id}({', '.join(argument_prints)});
53 namespace_header = f
"""namespace {"::".join(function_definition._namespaces)}::sycl {{"""
54 namespace_footer =
"}"
56 function_call_string = function_definition.id
57 if function_definition._template
is not None:
58 template_strings = [argument.print(self)
for argument
in function_definition._template]
59 template_string =
"template <" +
",".join(template_strings) +
">\n"
60 function_call_string +=
"<" +
",".join([template.split(
' ')[1]
for template
in template_strings]) +
">"
62 arguments = copy.deepcopy(function_definition._arguments)
63 arguments.append(SyntaxTree.Argument(
"measurement", SyntaxTree.TCustom(
"tarch::timing::Measurement&")))
65 current_indent = indent_level + 1
66 argument_prints = [argument.print(self)
for argument
in arguments]
68 return f
"""{namespace_header}
69{template_string}{self.get_indent(indent_level)}{function_definition._return_type.print(self)} {function_definition.id}({', '.join(argument_prints)}) {{
70tarch::timing::Watch watch("{"::".join(function_definition._namespaces)}", "{function_definition.id}", false, true);
71{function_call_string}({",".join([argument.print(self).split(' ')[-1] for argument in function_definition._arguments])});
73measurement.setValue(watch.getCalendarTime());
74{self.get_indent(indent_level)}}}
79 namespace_header = f
"""namespace {"::".join(function_definition._namespaces)}::sycl {{"""
80 namespace_footer =
"}"
82 if function_definition._template
is not None:
83 template_strings = [argument.print(self)
for argument
in function_definition._template]
84 template_string =
"template <" +
",".join(template_strings) +
">\n"
86 arguments = copy.deepcopy(function_definition._arguments)
87 arguments.append(SyntaxTree.Argument(
"measurement", SyntaxTree.TCustom(
"tarch::timing::Measurement&")))
89 current_indent = indent_level + 1
90 argument_prints = [argument.print(self)
for argument
in arguments]
92 return f
"""{namespace_header}
93{template_string}{self.get_indent(indent_level)}{function_definition._return_type.print(self)} {function_definition.id}({', '.join(argument_prints)});
108 ranges = [f
"range{i} = {loop.get_interval_size().print(self)};" for i, loop
in enumerate(unary_max._loops[0:3])]
109 indexing = [f
"int {loop.get_iteration_variable().print(self)} = index[{i}];" for i, loop
in enumerate(unary_max._loops[0:3])]
110 statement_prints = [statement.print(self, indent_level + 1)
for statement
in unary_max._loops[2]._statements]
111 return os.linesep.join(ranges) +
"\n" + self.get_indent(indent_level) + f
"""queue.submit([&](::sycl::handler& handler) {{handler.memset({unary_max._outputVariable.print(self)}, 0, sizeof(double) * {unary_max._loop.get_interval_size().print(self)}); }}).wait();
112{self.get_indent(indent_level)}queue.submit([&](::sycl::handler& handler) {{
113{self.get_indent(indent_level)}handler.parallel_for(::sycl::range<3>{{range0, range1, range2}}, [=](::sycl::item<3> index) {{
114{os.linesep.join(indexing)}
115{unary_max._loops[3].print(self, indent_level + 1)}
116{self.get_indent(indent_level + 1)}}});
117{self.get_indent(indent_level)}}}).wait();"""
123 ranges = [f
"range{i} = {loop.get_interval_size().print(self)};" for i, loop
in enumerate(construction._loops[0:3])]
124 indexing = [f
"int {loop.get_iteration_variable().print(self)} = index[{i}];" for i, loop
in enumerate(construction._loops[0:3])]
125 statement_prints = [statement.print(self, indent_level + 1)
for statement
in construction._loops[2]._statements]
126 return construction.memoryAllocation.print(self, indent_level) + os.linesep.join(ranges) +
"\n" + self.get_indent(indent_level) + f
"""queue.submit([&](::sycl::handler& handler) {{
127{self.get_indent(indent_level)}handler.parallel_for(::sycl::range<3>{{range0, range1, range2}}, [=](::sycl::item<3> index) {{
128{os.linesep.join(indexing)}
129{os.linesep.join(statement_prints)}
130{self.get_indent(indent_level + 1)}}});
131{self.get_indent(indent_level)}}}).wait();"""
134 ranges = [f
"range{i} = {loop.get_interval_size().print(self)};" for i, loop
in enumerate(assignment._loops[0:3])]
135 indexing = [f
"int {loop.get_iteration_variable().print(self)} = index[{i}];" for i, loop
in enumerate(assignment._loops[0:3])]
136 statement_prints = [statement.print(self, indent_level + 1)
for statement
in assignment._loops[2]._statements]
137 return os.linesep.join(ranges) +
"\n" + self.get_indent(indent_level) + f
"""queue.submit([&](::sycl::handler& handler) {{
138{self.get_indent(indent_level)}handler.parallel_for(::sycl::range<3>{{range0, range1, range2}}, [=](::sycl::item<3> index) {{
139{os.linesep.join(indexing)}
140{os.linesep.join(statement_prints)}
141{self.get_indent(indent_level + 1)}}});
142{self.get_indent(indent_level)}}}).wait();"""