60 builder.add_container(
"M", desc_symbols,
true);
61 builder.add_container(
"N", desc_symbols,
true);
62 builder.add_container(
"i", desc_symbols);
63 builder.add_container(
"j", desc_symbols);
64 builder.add_container(
"k", desc_symbols);
67 builder.add_container(
"tmp", desc_element);
71 builder.add_container(
"C", desc_2d,
true);
72 builder.add_container(
"D", desc_2d,
true);
74 auto& root =
builder.subject().root();
83 auto& body_i = loop_i.root();
85 auto& block =
builder.add_block(body_i);
86 auto& output_node =
builder.add_access(block,
"C");
87 auto& one_node =
builder.add_constant(block,
"1.0", desc_element);
89 builder.add_computational_memlet(block, one_node, tasklet,
"_in", {});
101 auto& body_j = loop_j.root();
103 auto& block =
builder.add_block(body_j);
104 auto& output_node =
builder.add_access(block,
"C");
105 auto& one_node =
builder.add_constant(block,
"1.0", desc_element);
107 builder.add_computational_memlet(block, one_node, tasklet,
"_in", {});
112 auto& loop_k =
builder.add_for(
119 auto& body_k = loop_k.root();
121 auto& block =
builder.add_block(body_k);
122 auto& tmp_node =
builder.add_access(block,
"tmp");
123 auto& D_node =
builder.add_access(block,
"D");
127 builder.add_computational_memlet(block, tasklet,
"_out", tmp_node, {});
129 auto& C_in_node =
builder.add_access(block,
"C");
130 auto& C_out_node =
builder.add_access(block,
"C");
134 builder.add_computational_memlet(block, tmp_node, tasklet_2,
"_in2", {});
135 builder.add_computational_memlet(
140 auto& block =
builder.add_block(body_j);
141 auto& C_in_node =
builder.add_access(block,
"C");
142 auto& C_out_node =
builder.add_access(block,
"C");
170 builder.add_container(
"M", desc_symbols,
true);
171 builder.add_container(
"N", desc_symbols,
true);
172 builder.add_container(
"i", desc_symbols);
173 builder.add_container(
"j", desc_symbols);
174 builder.add_container(
"k", desc_symbols);
177 builder.add_container(
"tmp", desc_element);
181 builder.add_container(
"C", desc_2d,
true);
182 builder.add_container(
"D", desc_2d,
true);
184 auto& root =
builder.subject().root();
186 auto& loop_i =
builder.add_for(
193 auto& body_i = loop_i.root();
195 auto& loop_j =
builder.add_for(
202 auto& body_j = loop_j.root();
204 auto& block =
builder.add_block(body_j);
205 auto& output_node =
builder.add_access(block,
"C");
206 auto& one_node =
builder.add_constant(block,
"1.0", desc_element);
208 builder.add_computational_memlet(block, one_node, tasklet,
"_in", {});
213 auto& loop_k =
builder.add_for(
220 auto& body_k = loop_k.root();
222 auto& block =
builder.add_block(body_k);
223 auto& tmp_node =
builder.add_access(block,
"tmp");
224 auto& D_node =
builder.add_access(block,
"D");
228 builder.add_computational_memlet(block, tasklet,
"_out", tmp_node, {});
230 auto& C_in_node =
builder.add_access(block,
"C");
231 auto& C_out_node =
builder.add_access(block,
"C");
235 builder.add_computational_memlet(block, tmp_node, tasklet_2,
"_in2", {});
236 builder.add_computational_memlet(
242 auto& block =
builder.add_block(body_j);
243 auto& C_in_node =
builder.add_access(block,
"C");
244 auto& C_out_node =
builder.add_access(block,
"C");
255inline std::unique_ptr<StructuredSDFG>
gemm() {
269 builder.add_container(
"alpha", desc_element,
true);
270 builder.add_container(
"beta", desc_element,
true);
271 builder.add_container(
"tmp", desc_element);
275 builder.add_container(
"A", desc_2d,
true);
276 builder.add_container(
"B", desc_2d,
true);
277 builder.add_container(
"C", desc_2d,
true);
280 builder.add_container(
"N", desc_symbols,
true);
281 builder.add_container(
"M", desc_symbols,
true);
282 builder.add_container(
"K", desc_symbols,
true);
283 builder.add_container(
"i", desc_symbols);
284 builder.add_container(
"j_1", desc_symbols);
285 builder.add_container(
"j_2", desc_symbols);
286 builder.add_container(
"k", desc_symbols);
288 auto& root =
builder.subject().root();
290 auto& loop_i =
builder.add_for(
297 auto& body_i = loop_i.root();
298 auto& loop_j_1 =
builder.add_for(
305 auto& body_j = loop_j_1.root();
307 auto& block =
builder.add_block(body_j);
308 auto& C_in_node =
builder.add_access(block,
"C");
309 auto& C_out_node =
builder.add_access(block,
"C");
310 auto& beta_node =
builder.add_access(block,
"beta");
314 builder.add_computational_memlet(block, beta_node, tasklet,
"_in2", {});
315 builder.add_computational_memlet(
320 auto& loop_k =
builder.add_for(
327 auto& body_k = loop_k.root();
328 auto& loop_j_2 =
builder.add_for(
335 auto& body_j_2 = loop_j_2.root();
337 auto& block =
builder.add_block(body_j_2);
338 auto& A_node =
builder.add_access(block,
"A");
339 auto& B_node =
builder.add_access(block,
"B");
340 auto& tmp_node =
builder.add_access(block,
"tmp");
345 builder.add_computational_memlet(block, tasklet,
"_out", tmp_node, {});
347 auto& tmp_node_2 =
builder.add_access(block,
"tmp");
348 auto& alpha_node =
builder.add_access(block,
"alpha");
350 builder.add_computational_memlet(block, tmp_node, tasklet_2,
"_in1", {});
351 builder.add_computational_memlet(block, alpha_node, tasklet_2,
"_in2", {});
352 builder.add_computational_memlet(block, tasklet_2,
"_out", tmp_node_2, {});
354 auto& C_in_node =
builder.add_access(block,
"C");
355 auto& C_out_node =
builder.add_access(block,
"C");
357 builder.add_computational_memlet(
360 builder.add_computational_memlet(block, tmp_node_2, tasklet_3,
"_in2", {});
361 builder.add_computational_memlet(
369inline std::unique_ptr<StructuredSDFG>
symm() {
385 builder.add_container(
"i", desc_symbols);
386 builder.add_container(
"j", desc_symbols);
387 builder.add_container(
"k", desc_symbols);
390 builder.add_container(
"tmp", desc_element);
391 builder.add_container(
"tmp2", desc_element);
392 builder.add_container(
"tmp3", desc_element);
396 builder.add_container(
"A", desc_2d,
true);
397 builder.add_container(
"B", desc_2d,
true);
398 builder.add_container(
"C", desc_2d,
true);
400 auto& root =
builder.subject().root();
402 auto& loop_i =
builder.add_for(
409 auto& body_i = loop_i.root();
410 auto& loop_j =
builder.add_for(
417 auto& body_j = loop_j.root();
419 auto& block =
builder.add_block(body_j);
420 auto& temp2_node =
builder.add_access(block,
"tmp");
421 auto& const_node =
builder.add_constant(block,
"0.0", desc_element);
423 builder.add_computational_memlet(block, const_node, tasklet,
"_in", {});
424 builder.add_computational_memlet(block, tasklet,
"_out", temp2_node, {});
426 auto& loop_k =
builder.add_for(
434 auto& block =
builder.add_block(loop_k.root());
435 auto& a_node =
builder.add_access(block,
"A");
436 auto& b_node =
builder.add_access(block,
"B");
437 auto& tmp_node =
builder.add_access(block,
"tmp2");
441 builder.add_computational_memlet(block, tasklet,
"_out", tmp_node, {});
443 auto& c_in_node =
builder.add_access(block,
"C");
444 auto& c_node =
builder.add_access(block,
"C");
446 builder.add_computational_memlet(block, tmp_node, tasklet_2,
"_in1", {});
452 auto& block2 =
builder.add_block(loop_k.root());
453 auto& a2_node =
builder.add_access(block2,
"A");
454 auto& b2_node =
builder.add_access(block2,
"B");
455 auto& tmp3_node =
builder.add_access(block2,
"tmp3");
461 builder.add_computational_memlet(block2, tasklet_3,
"_out", tmp3_node, {});
463 auto& temp2_node =
builder.add_access(block2,
"tmp");
464 auto& temp2_node_2 =
builder.add_access(block2,
"tmp");
466 builder.add_computational_memlet(block2, temp2_node, tasklet_4,
"_in1", {});
467 builder.add_computational_memlet(block2, tmp3_node, tasklet_4,
"_in2", {});
468 builder.add_computational_memlet(block2, tasklet_4,
"_out", temp2_node_2, {});
471 auto& block =
builder.add_block(body_j);
472 auto& c_in_node =
builder.add_access(block,
"C");
473 auto& c_out_node =
builder.add_access(block,
"C");
474 auto& tmp_node =
builder.add_access(block,
"tmp");
478 builder.add_computational_memlet(block, tmp_node, tasklet,
"_in2", {});
486inline std::unique_ptr<StructuredSDFG>
gemver() {
507 builder.add_container(
"i_1", desc_symbols);
508 builder.add_container(
"i_2", desc_symbols);
509 builder.add_container(
"i_3", desc_symbols);
510 builder.add_container(
"i_4", desc_symbols);
511 builder.add_container(
"j_1", desc_symbols);
512 builder.add_container(
"j_2", desc_symbols);
513 builder.add_container(
"j_3", desc_symbols);
514 builder.add_container(
"j_4", desc_symbols);
515 builder.add_container(
"N", desc_symbols,
true);
520 builder.add_container(
"A", desc_2d,
true);
521 builder.add_container(
"u1", desc_1d,
true);
522 builder.add_container(
"u2", desc_1d,
true);
523 builder.add_container(
"v1", desc_1d,
true);
524 builder.add_container(
"v2", desc_1d,
true);
525 builder.add_container(
"x", desc_1d,
true);
526 builder.add_container(
"y", desc_1d,
true);
527 builder.add_container(
"z", desc_1d,
true);
528 builder.add_container(
"w", desc_1d,
true);
530 auto& root =
builder.subject().root();
533 auto& loop_i_1 =
builder.add_for(
540 auto& body_i_1 = loop_i_1.root();
541 auto& loop_j_1 =
builder.add_for(
548 auto& body_j_1 = loop_j_1.root();
550 builder.add_container(
"tmp_1", desc_element);
552 auto& block =
builder.add_block(body_j_1);
553 auto& u1_node =
builder.add_access(block,
"u1");
554 auto& v1_node =
builder.add_access(block,
"v1");
555 auto& tmp_node =
builder.add_access(block,
"tmp_1");
559 builder.add_computational_memlet(block, tasklet,
"_out", tmp_node, {});
561 builder.add_container(
"tmp_2", desc_element);
563 auto& block2 =
builder.add_block(body_j_1);
564 auto& u2_node =
builder.add_access(block2,
"u2");
565 auto& v2_node =
builder.add_access(block2,
"v2");
566 auto& tmp2_node =
builder.add_access(block2,
"tmp_2");
570 builder.add_computational_memlet(block2, tasklet2,
"_out", tmp2_node, {});
572 builder.add_container(
"tmp_3", desc_element);
574 auto& block3 =
builder.add_block(body_j_1);
575 auto& tmp_node_1 =
builder.add_access(block3,
"tmp_1");
576 auto& tmp2_node_1 =
builder.add_access(block3,
"tmp_2");
577 auto& tmp3_node =
builder.add_access(block3,
"tmp_3");
579 builder.add_computational_memlet(block3, tmp_node_1, tasklet3,
"_in1", {});
580 builder.add_computational_memlet(block3, tmp2_node_1, tasklet3,
"_in2", {});
581 builder.add_computational_memlet(block3, tasklet3,
"_out", tmp3_node, {});
583 auto& A_node =
builder.add_access(block3,
"A");
584 auto& A_node_out =
builder.add_access(block3,
"A");
586 builder.add_computational_memlet(
589 builder.add_computational_memlet(block3, tmp3_node, tasklet4,
"_in2", {});
590 builder.add_computational_memlet(
596 auto& loop_i_2 =
builder.add_for(
603 auto& body_i_2 = loop_i_2.root();
604 auto& loop_j_2 =
builder.add_for(
611 auto& body_j_2 = loop_j_2.root();
613 auto& block =
builder.add_block(body_j_2);
614 auto& x_node_in =
builder.add_access(block,
"x");
615 auto& x_node_out =
builder.add_access(block,
"x");
616 auto& y_node =
builder.add_access(block,
"y");
617 auto& A_node =
builder.add_access(block,
"A");
627 auto& loop_i_3 =
builder.add_for(
634 auto& body_i_3 = loop_i_3.root();
636 auto& block =
builder.add_block(body_i_3);
637 auto& x_node_in =
builder.add_access(block,
"x");
638 auto& x_node_out =
builder.add_access(block,
"x");
639 auto& z_node =
builder.add_access(block,
"z");
647 auto& loop_i_4 =
builder.add_for(
654 auto& body_i_4 = loop_i_4.root();
655 auto& loop_j_4 =
builder.add_for(
662 auto& body_j_4 = loop_j_4.root();
664 auto& block =
builder.add_block(body_j_4);
666 auto& w_node_in =
builder.add_access(block,
"w");
667 auto& w_node_out =
builder.add_access(block,
"w");
668 auto& A_node =
builder.add_access(block,
"A");
669 auto& x_node =
builder.add_access(block,
"x");
681inline std::unique_ptr<StructuredSDFG>
gesummv() {
697 builder.add_container(
"i", desc_symbols);
698 builder.add_container(
"j", desc_symbols);
699 builder.add_container(
"N", desc_symbols,
true);
704 builder.add_container(
"tmp", desc_1d,
true);
705 builder.add_container(
"x", desc_1d,
true);
706 builder.add_container(
"y", desc_1d,
true);
707 builder.add_container(
"A", desc_2d,
true);
708 builder.add_container(
"B", desc_2d,
true);
710 auto& root =
builder.subject().root();
712 auto& loop_i =
builder.add_for(
719 auto& body_i = loop_i.root();
722 auto& block =
builder.add_block(body_i);
723 auto& tmp_node =
builder.add_access(block,
"tmp");
724 auto& const_node =
builder.add_constant(block,
"0.0", desc_element);
726 builder.add_computational_memlet(block, const_node, tasklet,
"_in", {});
731 auto& block =
builder.add_block(body_i);
732 auto& y_node =
builder.add_access(block,
"y");
733 auto& const_node =
builder.add_constant(block,
"0.0", desc_element);
735 builder.add_computational_memlet(block, const_node, tasklet,
"_in", {});
740 auto& loop_j =
builder.add_for(
747 auto& body_j = loop_j.root();
750 auto& block =
builder.add_block(body_j);
751 auto& A_node =
builder.add_access(block,
"A");
752 auto& x_node =
builder.add_access(block,
"x");
753 auto& tmp_node =
builder.add_access(block,
"tmp");
754 auto& tmp_node_out =
builder.add_access(block,
"tmp");
765 auto& block =
builder.add_block(body_j);
766 auto& B_node =
builder.add_access(block,
"B");
767 auto& x_node =
builder.add_access(block,
"x");
768 auto& y_node =
builder.add_access(block,
"y");
769 auto& y_node_out =
builder.add_access(block,
"y");
781 auto& block =
builder.add_block(body_i);
782 auto& tmp_node =
builder.add_access(block,
"tmp");
783 auto& y_node =
builder.add_access(block,
"y");
784 auto& y_node_out =
builder.add_access(block,
"y");
794inline std::unique_ptr<StructuredSDFG>
syr2k() {
812 builder.add_container(
"M", desc_symbols,
true);
813 builder.add_container(
"N", desc_symbols,
true);
814 builder.add_container(
"i", desc_symbols);
815 builder.add_container(
"j_1", desc_symbols);
816 builder.add_container(
"j_2", desc_symbols);
817 builder.add_container(
"k", desc_symbols);
820 builder.add_container(
"tmp", desc_element);
821 builder.add_container(
"tmp2", desc_element);
822 builder.add_container(
"tmp3", desc_element);
823 builder.add_container(
"beta", desc_element,
true);
827 builder.add_container(
"A", desc_2d,
true);
828 builder.add_container(
"B", desc_2d,
true);
829 builder.add_container(
"C", desc_2d,
true);
831 auto& root =
builder.subject().root();
833 auto& loop_i =
builder.add_for(
840 auto& body_i = loop_i.root();
842 auto& loop_j_1 =
builder.add_for(
850 auto& block =
builder.add_block(loop_j_1.root());
851 auto& C_in_node =
builder.add_access(block,
"C");
852 auto& C_out_node =
builder.add_access(block,
"C");
853 auto& beta_node =
builder.add_access(block,
"beta");
857 builder.add_computational_memlet(block, beta_node, tasklet,
"_in2", {});
858 builder.add_computational_memlet(
863 auto& loop_k =
builder.add_for(
871 auto& loop_j_2 =
builder.add_for(
879 auto& block =
builder.add_block(loop_j_2.root());
880 auto& A_node =
builder.add_access(block,
"A");
881 auto& B_node =
builder.add_access(block,
"B");
882 auto& tmp_node =
builder.add_access(block,
"tmp");
887 builder.add_computational_memlet(block, tasklet,
"_out", tmp_node, {});
889 auto& block2 =
builder.add_block(loop_j_2.root());
890 auto& tmp_node_2 =
builder.add_access(block2,
"tmp");
891 auto& B_node_2 =
builder.add_access(block2,
"B");
892 auto& A_node_2 =
builder.add_access(block2,
"A");
893 auto& tmp2_node =
builder.add_access(block2,
"tmp2");
895 builder.add_computational_memlet(
900 builder.add_computational_memlet(block2, tmp_node_2, tasklet_2,
"_in3", {});
901 builder.add_computational_memlet(block2, tasklet_2,
"_out", tmp2_node, {});
903 auto& block3 =
builder.add_block(loop_j_2.root());
904 auto& C_in_node =
builder.add_access(block3,
"C");
905 auto& C_out_node =
builder.add_access(block3,
"C");
906 auto& tmp2_node_2 =
builder.add_access(block3,
"tmp2");
908 builder.add_computational_memlet(
911 builder.add_computational_memlet(block3, tmp2_node_2, tasklet_3,
"_in2", {});
912 builder.add_computational_memlet(
920inline std::unique_ptr<StructuredSDFG>
syrk() {
936 sdfg.add_container(
"M", desc_symbols,
true);
937 sdfg.add_container(
"N", desc_symbols,
true);
938 sdfg.add_container(
"i", desc_symbols);
939 sdfg.add_container(
"j_1", desc_symbols);
940 sdfg.add_container(
"j_2", desc_symbols);
941 sdfg.add_container(
"k", desc_symbols);
944 sdfg.add_container(
"beta", desc_element,
true);
945 sdfg.add_container(
"tmp", desc_element);
949 sdfg.add_container(
"A", desc_2d,
true);
950 sdfg.add_container(
"C", desc_2d,
true);
952 auto& root =
sdfg.subject().root();
954 auto& loop_i =
sdfg.add_for(
961 auto& body_i = loop_i.root();
963 auto& loop_j_1 =
sdfg.add_for(
971 auto& block =
sdfg.add_block(loop_j_1.root());
972 auto& C_in_node =
sdfg.add_access(block,
"C");
973 auto& C_out_node =
sdfg.add_access(block,
"C");
974 auto& beta_node =
sdfg.add_access(block,
"beta");
977 sdfg.add_computational_memlet(block, beta_node, tasklet,
"_in2", {});
981 auto& loop_k =
sdfg.add_for(
989 auto& loop_j_2 =
sdfg.add_for(
997 auto& block =
sdfg.add_block(loop_j_2.root());
998 auto& A_node =
sdfg.add_access(block,
"A");
999 auto& tmp_node =
sdfg.add_access(block,
"tmp");
1003 sdfg.add_computational_memlet(block, tasklet,
"_out", tmp_node, {});
1005 auto& block2 =
sdfg.add_block(loop_j_2.root());
1006 auto& C_in_node =
sdfg.add_access(block2,
"C");
1007 auto& C_out_node =
sdfg.add_access(block2,
"C");
1008 auto& tmp_node_2 =
sdfg.add_access(block2,
"tmp");
1010 sdfg.add_computational_memlet(
1013 sdfg.add_computational_memlet(block2, tmp_node_2, tasklet_2,
"_in2", {});
1014 sdfg.add_computational_memlet(
1022inline std::unique_ptr<StructuredSDFG>
trmm() {
1038 sdfg.add_container(
"M", desc_symbols,
true);
1039 sdfg.add_container(
"N", desc_symbols,
true);
1040 sdfg.add_container(
"i", desc_symbols);
1041 sdfg.add_container(
"j", desc_symbols);
1042 sdfg.add_container(
"k", desc_symbols);
1045 sdfg.add_container(
"alpha", desc_element,
true);
1046 sdfg.add_container(
"tmp", desc_element);
1050 sdfg.add_container(
"A", desc_2d,
true);
1051 sdfg.add_container(
"B", desc_2d,
true);
1053 auto& root =
sdfg.subject().root();
1055 auto& loop_i =
sdfg.add_for(
1062 auto& body_i = loop_i.root();
1064 auto& loop_j =
sdfg.add_for(
1071 auto& body_j = loop_j.root();
1073 auto& loop_k =
sdfg.add_for(
1081 auto& block =
sdfg.add_block(loop_k.root());
1082 auto& A_node =
sdfg.add_access(block,
"A");
1083 auto& B_node =
sdfg.add_access(block,
"B");
1084 auto& tmp_node =
sdfg.add_access(block,
"tmp");
1088 sdfg.add_computational_memlet(block, tasklet,
"_out", tmp_node, {});
1090 auto& block2 =
sdfg.add_block(loop_k.root());
1091 auto& B_in_node =
sdfg.add_access(block2,
"B");
1092 auto& B_out_node =
sdfg.add_access(block2,
"B");
1093 auto& tmp_node_2 =
sdfg.add_access(block2,
"tmp");
1096 sdfg.add_computational_memlet(block2, tmp_node_2, tasklet_2,
"_in2", {});
1097 sdfg.add_computational_memlet(
1102 auto& block3 =
sdfg.add_block(body_j);
1103 auto& B_in_node =
sdfg.add_access(block3,
"B");
1104 auto& B_out_node =
sdfg.add_access(block3,
"B");
1105 auto& alpha_node =
sdfg.add_access(block3,
"alpha");
1108 sdfg.add_computational_memlet(block3, alpha_node, tasklet_3,
"_in2", {});
1114inline std::unique_ptr<StructuredSDFG>
atax() {
1133 sdfg.add_container(
"M", desc_symbols,
true);
1134 sdfg.add_container(
"N", desc_symbols,
true);
1135 sdfg.add_container(
"i_1", desc_symbols);
1136 sdfg.add_container(
"i_2", desc_symbols);
1137 sdfg.add_container(
"j_1", desc_symbols);
1138 sdfg.add_container(
"j_2", desc_symbols);
1143 sdfg.add_container(
"tmp", desc_1d,
true);
1144 sdfg.add_container(
"x", desc_1d,
true);
1145 sdfg.add_container(
"y", desc_1d,
true);
1146 sdfg.add_container(
"A", desc_2d,
true);
1148 auto& root =
sdfg.subject().root();
1151 auto& loop_i_1 =
sdfg.add_for(
1158 auto& body_i_1 = loop_i_1.root();
1160 auto& block =
sdfg.add_block(body_i_1);
1161 auto& y_node =
sdfg.add_access(block,
"y");
1162 auto& const_node =
sdfg.add_constant(block,
"0.0", desc_element);
1164 sdfg.add_computational_memlet(block, const_node, tasklet,
"_in", {});
1169 auto& loop_i_2 =
sdfg.add_for(
1176 auto& body_i_2 = loop_i_2.root();
1178 auto& block =
sdfg.add_block(body_i_2);
1179 auto& tmp_node =
sdfg.add_access(block,
"tmp");
1180 auto& const_node =
sdfg.add_constant(block,
"0.0", desc_element);
1182 sdfg.add_computational_memlet(block, const_node, tasklet,
"_in", {});
1185 auto& loop_j_1 =
sdfg.add_for(
1192 auto& body_j_1 = loop_j_1.root();
1195 auto& block =
sdfg.add_block(body_j_1);
1196 auto& A_node =
sdfg.add_access(block,
"A");
1197 auto& x_node =
sdfg.add_access(block,
"x");
1198 auto& tmp_node =
sdfg.add_access(block,
"tmp");
1199 auto& tmp_node_out =
sdfg.add_access(block,
"tmp");
1201 sdfg.add_computational_memlet(
1206 sdfg.add_computational_memlet(block, tasklet,
"_out", tmp_node_out, {
symbolic::symbol(
"i_2")});
1210 auto& loop_j_2 =
sdfg.add_for(
1217 auto& body_j_2 = loop_j_2.root();
1219 auto& block =
sdfg.add_block(body_j_2);
1220 auto& A_node =
sdfg.add_access(block,
"A");
1221 auto& y_node =
sdfg.add_access(block,
"y");
1222 auto& y_node_out =
sdfg.add_access(block,
"y");
1223 auto& tmp_node =
sdfg.add_access(block,
"tmp");
1225 sdfg.add_computational_memlet(
1237inline std::unique_ptr<StructuredSDFG>
bicg() {
1253 sdfg.add_container(
"M", desc_symbols,
true);
1254 sdfg.add_container(
"N", desc_symbols,
true);
1255 sdfg.add_container(
"i_1", desc_symbols);
1256 sdfg.add_container(
"i_2", desc_symbols);
1257 sdfg.add_container(
"j", desc_symbols);
1262 sdfg.add_container(
"s", desc_1d,
true);
1263 sdfg.add_container(
"q", desc_1d,
true);
1264 sdfg.add_container(
"r", desc_1d,
true);
1265 sdfg.add_container(
"p", desc_1d,
true);
1266 sdfg.add_container(
"A", desc_2d,
true);
1268 auto& root =
sdfg.subject().root();
1271 auto& loop_i_1 =
sdfg.add_for(
1278 auto& body_i_1 = loop_i_1.root();
1280 auto& block =
sdfg.add_block(body_i_1);
1282 auto& s_node =
sdfg.add_access(block,
"s");
1283 auto& const_node =
sdfg.add_constant(block,
"0.0", desc_element);
1285 sdfg.add_computational_memlet(block, const_node, tasklet,
"_in", {});
1290 auto& loop_i_2 =
sdfg.add_for(
1297 auto& body_i_2 = loop_i_2.root();
1299 auto& block =
sdfg.add_block(body_i_2);
1301 auto& q_node =
sdfg.add_access(block,
"q");
1302 auto& zero_node =
sdfg.add_constant(block,
"0.0", desc_element);
1304 sdfg.add_computational_memlet(block, zero_node, tasklet,
"_in", {});
1307 auto& loop_j =
sdfg.add_for(
1314 auto& body_j = loop_j.root();
1317 auto& block =
sdfg.add_block(body_j);
1319 auto& s_node =
sdfg.add_access(block,
"s");
1320 auto& r_node =
sdfg.add_access(block,
"r");
1321 auto& A_node =
sdfg.add_access(block,
"A");
1322 auto& s_node_out =
sdfg.add_access(block,
"s");
1331 auto& block =
sdfg.add_block(body_j);
1333 auto& q_node =
sdfg.add_access(block,
"q");
1334 auto& A_node =
sdfg.add_access(block,
"A");
1335 auto& p_node =
sdfg.add_access(block,
"p");
1336 auto& q_node_out =
sdfg.add_access(block,
"q");
1366 sdfg.add_container(
"NP", desc_symbols,
true);
1367 sdfg.add_container(
"NQ", desc_symbols,
true);
1368 sdfg.add_container(
"NR", desc_symbols,
true);
1369 sdfg.add_container(
"p_1", desc_symbols);
1370 sdfg.add_container(
"p_2", desc_symbols);
1371 sdfg.add_container(
"q", desc_symbols);
1372 sdfg.add_container(
"r", desc_symbols);
1373 sdfg.add_container(
"s", desc_symbols);
1379 sdfg.add_container(
"sum", desc_1d,
true);
1380 sdfg.add_container(
"A", desc_3d,
true);
1381 sdfg.add_container(
"C4", desc_2d,
true);
1383 auto& root =
sdfg.subject().root();
1385 auto& loop_r =
sdfg.add_for(
1392 auto& body_r = loop_r.root();
1394 auto& loop_q =
sdfg.add_for(
1403 auto& loop_p_1 =
sdfg.add_for(
1410 auto& body_p_1 = loop_p_1.root();
1412 auto& block =
sdfg.add_block(body_p_1);
1413 auto& sum_node =
sdfg.add_access(block,
"sum");
1414 auto& const_node =
sdfg.add_constant(block,
"0.0", desc_element);
1416 sdfg.add_computational_memlet(block, const_node, tasklet,
"_in", {});
1420 auto& loop_s =
sdfg.add_for(
1427 auto& body_s = loop_s.root();
1429 auto& block =
sdfg.add_block(body_s);
1430 auto& A_node =
sdfg.add_access(block,
"A");
1431 auto& C4_node =
sdfg.add_access(block,
"C4");
1432 auto& sum_node =
sdfg.add_access(block,
"sum");
1433 auto& sum_node_out =
sdfg.add_access(block,
"sum");
1435 sdfg.add_computational_memlet(
1438 sdfg.add_computational_memlet(
1442 sdfg.add_computational_memlet(block, tasklet,
"_out", sum_node_out, {
symbolic::symbol(
"p_1")});
1447 auto& loop_p_2 =
sdfg.add_for(
1454 auto& body_p_2 = loop_p_2.root();
1456 auto& block =
sdfg.add_block(body_p_2);
1457 auto& A_node =
sdfg.add_access(block,
"A");
1458 auto& sum_node =
sdfg.add_access(block,
"sum");
1459 auto& A_node_out =
sdfg.add_access(block,
"A");
1462 sdfg.add_computational_memlet(
1475inline std::unique_ptr<StructuredSDFG>
mvt() {
1488 sdfg.add_container(
"N", desc_symbols,
true);
1489 sdfg.add_container(
"i_1", desc_symbols);
1490 sdfg.add_container(
"i_2", desc_symbols);
1491 sdfg.add_container(
"j_1", desc_symbols);
1492 sdfg.add_container(
"j_2", desc_symbols);
1497 sdfg.add_container(
"x1", desc_1d,
true);
1498 sdfg.add_container(
"x2", desc_1d,
true);
1499 sdfg.add_container(
"y_1", desc_1d,
true);
1500 sdfg.add_container(
"y_2", desc_1d,
true);
1501 sdfg.add_container(
"A", desc_2d,
true);
1503 auto& root =
sdfg.subject().root();
1506 auto& loop_i_1 =
sdfg.add_for(
1513 auto& body_i_1 = loop_i_1.root();
1515 auto& loop_j_1 =
sdfg.add_for(
1522 auto& body_j_1 = loop_j_1.root();
1524 auto& block =
sdfg.add_block(body_j_1);
1525 auto& x1_node =
sdfg.add_access(block,
"x1");
1526 auto& A_node =
sdfg.add_access(block,
"A");
1527 auto& y_1_node =
sdfg.add_access(block,
"y_1");
1528 auto& x1_node_out =
sdfg.add_access(block,
"x1");
1537 auto& loop_i_2 =
sdfg.add_for(
1544 auto& body_i_2 = loop_i_2.root();
1546 auto& loop_j_2 =
sdfg.add_for(
1553 auto& body_j_2 = loop_j_2.root();
1555 auto& block =
sdfg.add_block(body_j_2);
1556 auto& x2_node =
sdfg.add_access(block,
"x2");
1557 auto& A_node =
sdfg.add_access(block,
"A");
1558 auto& y_2_node =
sdfg.add_access(block,
"y_2");
1559 auto& x2_node_out =
sdfg.add_access(block,
"x2");
1592 builder.add_container(
"N", desc_symbols,
true);
1593 builder.add_container(
"i", desc_symbols);
1594 builder.add_container(
"j", desc_symbols);
1595 builder.add_container(
"k_1", desc_symbols);
1596 builder.add_container(
"k_2", desc_symbols);
1599 builder.add_container(
"tmp", desc_element);
1603 builder.add_container(
"A", desc_2d,
true);
1605 auto& root =
builder.subject().root();
1607 auto& loop_i =
builder.add_for(
1614 auto& body_i = loop_i.root();
1616 auto& loop_j =
builder.add_for(
1623 auto& body_j = loop_j.root();
1625 auto& loop_k_1 =
builder.add_for(
1632 auto& body_k_1 = loop_k_1.root();
1634 auto& block =
builder.add_block(body_k_1);
1635 auto& A_node =
builder.add_access(block,
"A");
1636 auto& tmp_node =
builder.add_access(block,
"tmp");
1638 builder.add_computational_memlet(
1641 builder.add_computational_memlet(
1644 builder.add_computational_memlet(block, tasklet,
"_out", tmp_node, {});
1646 auto& block2 =
builder.add_block(body_k_1);
1647 auto& A_in_node =
builder.add_access(block2,
"A");
1648 auto& A_out_node =
builder.add_access(block2,
"A");
1649 auto& tmp_node_2 =
builder.add_access(block2,
"tmp");
1651 builder.add_computational_memlet(
1654 builder.add_computational_memlet(block2, tmp_node_2, tasklet_2,
"_in2", {});
1655 builder.add_computational_memlet(
1660 auto& block3 =
builder.add_block(body_j);
1661 auto& A_in_node =
builder.add_access(block3,
"A");
1662 auto& A_out_node =
builder.add_access(block3,
"A");
1664 builder.add_computational_memlet(
1667 builder.add_computational_memlet(
1670 builder.add_computational_memlet(
1675 auto& loop_k_2 =
builder.add_for(
1682 auto& body_k_2 = loop_k_2.root();
1684 auto& block =
builder.add_block(body_k_2);
1685 auto& A_node =
builder.add_access(block,
"A");
1686 auto& tmp_node =
builder.add_access(block,
"tmp");
1688 builder.add_computational_memlet(
1691 builder.add_computational_memlet(
1694 builder.add_computational_memlet(block, tasklet,
"_out", tmp_node, {});
1696 auto& block2 =
builder.add_block(body_k_2);
1697 auto& A_in_node =
builder.add_access(block2,
"A");
1698 auto& A_out_node =
builder.add_access(block2,
"A");
1699 auto& tmp_node_2 =
builder.add_access(block2,
"tmp");
1701 builder.add_computational_memlet(
1704 builder.add_computational_memlet(block2, tmp_node_2, tasklet_2,
"_in2", {});
1705 builder.add_computational_memlet(
1710 auto& block3 =
builder.add_block(body_i);
1711 auto& A_in_node =
builder.add_access(block3,
"A");
1712 auto& A_out_node =
builder.add_access(block3,
"A");
1716 builder.add_computational_memlet(
1719 builder.add_computational_memlet(
1751 builder.add_container(
"TMAX", desc_symbols,
true);
1752 builder.add_container(
"NX", desc_symbols,
true);
1753 builder.add_container(
"NY", desc_symbols,
true);
1754 builder.add_container(
"t", desc_symbols);
1755 builder.add_container(
"i_1", desc_symbols);
1756 builder.add_container(
"i_2", desc_symbols);
1757 builder.add_container(
"i_3", desc_symbols);
1758 builder.add_container(
"j_1", desc_symbols);
1759 builder.add_container(
"j_2", desc_symbols);
1760 builder.add_container(
"j_3", desc_symbols);
1761 builder.add_container(
"j_4", desc_symbols);
1764 builder.add_container(
"tmp", desc_element);
1765 builder.add_container(
"tmp2", desc_element);
1766 builder.add_container(
"tmp3", desc_element);
1767 builder.add_container(
"tmp4", desc_element);
1771 builder.add_container(
"_fict_", desc_1d,
true);
1772 builder.add_container(
"ey", desc_2d,
true);
1773 builder.add_container(
"hz", desc_2d,
true);
1774 builder.add_container(
"ex", desc_2d,
true);
1776 auto& root =
builder.subject().root();
1778 auto& loop_t =
builder.add_for(
1785 auto& body_t = loop_t.root();
1787 auto& loop_j_1 =
builder.add_for(
1795 auto& block =
builder.add_block(loop_j_1.root());
1796 auto& ey_node =
builder.add_access(block,
"ey");
1797 auto& fict_node =
builder.add_access(block,
"_fict_");
1809 auto& loop_i_1 =
builder.add_for(
1817 auto& loop_j_2 =
builder.add_for(
1825 auto& block =
builder.add_block(loop_j_2.root());
1826 auto& hz_node =
builder.add_access(block,
"hz");
1827 auto& tmp_node =
builder.add_access(block,
"tmp");
1829 builder.add_computational_memlet(
1832 builder.add_computational_memlet(
1840 builder.add_computational_memlet(block, tasklet,
"_out", tmp_node, {});
1842 auto& block2 =
builder.add_block(loop_j_2.root());
1843 auto& ey_node =
builder.add_access(block2,
"ey");
1844 auto& ey_node_2 =
builder.add_access(block2,
"ey");
1845 auto& tmp_node_2 =
builder.add_access(block2,
"tmp");
1847 builder.add_computational_memlet(
1850 builder.add_computational_memlet(block2, tmp_node_2, tasklet_2,
"_in2", {});
1851 builder.add_computational_memlet(
1862 auto& loop_i_2 =
builder.add_for(
1870 auto& loop_j_3 =
builder.add_for(
1878 auto& block =
builder.add_block(loop_j_3.root());
1879 auto& hz_node =
builder.add_access(block,
"hz");
1880 auto& tmp_node =
builder.add_access(block,
"tmp2");
1882 builder.add_computational_memlet(
1885 builder.add_computational_memlet(
1893 builder.add_computational_memlet(block, tasklet,
"_out", tmp_node, {});
1895 auto& block2 =
builder.add_block(loop_j_3.root());
1896 auto& ex_node =
builder.add_access(block2,
"ex");
1897 auto& ex_node_2 =
builder.add_access(block2,
"ex");
1898 auto& tmp_node_2 =
builder.add_access(block2,
"tmp2");
1900 builder.add_computational_memlet(
1903 builder.add_computational_memlet(block2, tmp_node_2, tasklet_2,
"_in2", {});
1904 builder.add_computational_memlet(
1915 auto& loop_i_3 =
builder.add_for(
1923 auto& loop_j_4 =
builder.add_for(
1931 auto& block =
builder.add_block(loop_j_4.root());
1932 auto& ex_node =
builder.add_access(block,
"ex");
1933 auto& tmp_node =
builder.add_access(block,
"tmp3");
1935 builder.add_computational_memlet(
1943 builder.add_computational_memlet(
1946 builder.add_computational_memlet(block, tasklet,
"_out", tmp_node, {});
1948 auto& block2 =
builder.add_block(loop_j_4.root());
1949 auto& ey_node =
builder.add_access(block2,
"ey");
1950 auto& tmp_node_2 =
builder.add_access(block2,
"tmp4");
1952 builder.add_computational_memlet(
1960 builder.add_computational_memlet(
1963 builder.add_computational_memlet(block2, tasklet_2,
"_out", tmp_node_2, {});
1965 auto& block3 =
builder.add_block(loop_j_4.root());
1966 auto& hz_node =
builder.add_access(block3,
"hz");
1967 auto& hz_node_2 =
builder.add_access(block3,
"hz");
1968 auto& tmp_node_3 =
builder.add_access(block3,
"tmp3");
1969 auto& tmp_node_4 =
builder.add_access(block3,
"tmp4");
1972 builder.add_computational_memlet(block3, tmp_node_3, tasklet_3,
"_in1", {});
1973 builder.add_computational_memlet(block3, tmp_node_4, tasklet_3,
"_in2", {});
1974 builder.add_computational_memlet(
1977 builder.add_computational_memlet(