Algorithmique Numérique Distribuée Public GIT Repository
ec59f83884f26e7c98e43c0953b395a943819c0f
1 #! /usr/bin/perl
3 # Copyright (c) 2009, 2014. The SimGrid Team.
4 # All rights reserved.
6 # This program is free software; you can redistribute it and/or modify it
7 # under the terms of the license (GNU LGPL) which comes with this package.
9 use strict;
11 sub job {
12     print "<job id=\"\$_[0]\" namespace=\"\$_[1]\" name=\"\$_[2]\" version=\"1.0\" runtime=\"\$_[3]\">\n";
13 }
14 sub file {
15     print "  <uses file=\"\$_[0]\" link=\"\$_[1]\" register=\"true\" transfer=\"true\" optional=\"false\" type=\"data\" size=\"\$_[2]\"/>\n";
16 }
17 sub strassen {
18     my \$matSize=shift;
19     my \$max_level=shift||1;
20     my \$level=shift||1;
21     my \$A = shift||"A";
22     my \$B = shift||"B";
24     if (\$level<\$max_level) {
25       die "Recursive Strassen don't work yet\n";
26     }
29     my \$sizeMult=\$matSize*\$matSize*\$matSize/8;
32     # T1 = A11 + A22
34     file("\${A}11l\$level","input",\$sizeBlock);
35     file("\${A}22l\$level","input",\$sizeBlock);
36     file("T1l\$level","output",\$sizeBlock);
37     print("</job>\n");
39     # T2 = A21 + A22
41     file("\${A}21l\$level","input",\$sizeBlock);
42     file("\${A}22l\$level","input",\$sizeBlock);
43     file("T2l\$level","output",\$sizeBlock);
44     print("</job>\n");
46     # T3 = A11 + A12
48     file("\${A}11l\$level","input",\$sizeBlock);
49     file("\${A}12l\$level","input",\$sizeBlock);
50     file("T3l\$level","output",\$sizeBlock);
51     print("</job>\n");
53     # T4 = A21 − A11
55     file("\${A}21l\$level","input",\$sizeBlock);
56     file("\${A}11l\$level","input",\$sizeBlock);
57     file("T4l\$level","output",\$sizeBlock);
58     print("</job>\n");
60     # T5 = A12 − A22
62     file("\${A}12l\$level","input",\$sizeBlock);
63     file("\${A}22l\$level","input",\$sizeBlock);
64     file("T5l\$level","output",\$sizeBlock);
65     print("</job>\n");
67     # T6 = B11 + B22
69     file("\${B}11l\$level","input",\$sizeBlock);
70     file("\${B}22l\$level","input",\$sizeBlock);
71     file("T6l\$level","output",\$sizeBlock);
72     print("</job>\n");
74     # T7 = B12 − B22
76     file("\${B}12l\$level","input",\$sizeBlock);
77     file("\${B}22l\$level","input",\$sizeBlock);
78     file("T7l\$level","output",\$sizeBlock);
79     print("</job>\n");
81     # T8 = B21 − B11
83     file("\${B}21l\$level","input",\$sizeBlock);
84     file("\${B}11l\$level","input",\$sizeBlock);
85     file("T8l\$level","output",\$sizeBlock);
86     print("</job>\n");
88     # T9 = B11 + B12
90     file("\${B}11l\$level","input",\$sizeBlock);
91     file("\${B}12l\$level","input",\$sizeBlock);
92     file("T9l\$level","output",\$sizeBlock);
93     print("</job>\n");
95     # T10 = B21 + B22
97     file("\${B}21l\$level","input",\$sizeBlock);
98     file("\${B}22l\$level","input",\$sizeBlock);
99     file("T10l\$level","output",\$sizeBlock);
100     print("</job>\n");
102     # Q1 = T1 × T6
103     if (\$level<\$max_level) {
104         strassen(\$sizeBlock,\$max_level,\$level+1,"T1_","T6_");
105     } else {
106         job("Q1","Strassen","l\$level",\$sizeMult);
107         file("T1l\$level","input",\$sizeBlock);
108         file("T6l\$level","input",\$sizeBlock);
109         file("Q1l\$level","output",\$sizeBlock);
110         print("</job>\n");
111     }
113     # Q2 = T2 × B11
114     if (\$level<\$max_level) {
115         strassen(\$sizeBlock,\$max_level,\$level+1,"T2_","B11_");
116     } else {
117         job("Q2","Strassen","l\$level",\$sizeMult);
118         file("T2l\$level","input",\$sizeBlock);
119         file("\${B}11l\$level","input",\$sizeBlock);
120         file("Q2l\$level","output",\$sizeBlock);
121         print("</job>\n");
122     }
124     # Q3 = A11 × T7
125     if (\$level<\$max_level) {
126         strassen(\$sizeBlock,\$max_level,\$level+1,"A11_","T7_");
127     } else {
128         job("Q3","Strassen","l\$level",\$sizeMult);
129         file("\${A}11l\$level","input",\$sizeBlock);
130         file("T7l\$level","input",\$sizeBlock);
131         file("Q3l\$level","output",\$sizeBlock);
132         print("</job>\n");
133     }
135     # Q4 = A22 × T8
136     if (\$level<\$max_level) {
137         strassen(\$sizeBlock,\$max_level,\$level+1,"A22_","T8_");
138     } else {
139         job("Q4","Strassen","l\$level",\$sizeMult);
140         file("\${A}22l\$level","input",\$sizeBlock);
141         file("T8l\$level","input",\$sizeBlock);
142         file("Q4l\$level","output",\$sizeBlock);
143         print("</job>\n");
144     }
146     # Q5 = T3 × B22
147     if (\$level<\$max_level) {
148         strassen(\$sizeBlock,\$max_level,\$level+1,"T3_","B22_");
149     } else {
150         job("Q5","Strassen","l\$level",\$sizeMult);
151         file("T3l\$level","input",\$sizeBlock);
152         file("\${B}22l\$level","input",\$sizeBlock);
153         file("Q5l\$level","output",\$sizeBlock);
154         print("</job>\n");
155     }
157     # Q6 = T4 × T9
158     if (\$level<\$max_level) {
159         strassen(\$sizeBlock,\$max_level,\$level+1,"T4_","T9_");
160     } else {
161         job("Q6","Strassen","l\$level",\$sizeMult);
162         file("T4l\$level","input",\$sizeBlock);
163         file("T9l\$level","input",\$sizeBlock);
164         file("Q6l\$level","output",\$sizeBlock);
165         print("</job>\n");
166     }
168     # Q7 = T5 × T10
169     if (\$level<\$max_level) {
170         strassen(\$sizeBlock,\$max_level,\$level+1,"T5_","T10_");
171     } else {
172         job("Q7","Strassen","l\$level",\$sizeMult);
173         file("T5l\$level","input",\$sizeBlock);
174         file("T10l\$level","input",\$sizeBlock);
175         file("Q7l\$level","output",\$sizeBlock);
176         print("</job>\n");
177     }
179     # C11 = Q1 + Q4 − Q5 + Q7
181     file("Q1l\$level","input",\$sizeBlock);
182     file("Q4l\$level","input",\$sizeBlock);
183     file("Q5l\$level","input",\$sizeBlock);
184     file("Q7l\$level","input",\$sizeBlock);
185     file("C11l\$level","output",\$sizeBlock);
186     print("</job>\n");
188     # C12 = Q3 + Q5
190     file("Q3l\$level","input",\$sizeBlock);
191     file("Q5l\$level","input",\$sizeBlock);
192     file("C12l\$level","output",\$sizeBlock);
193     print("</job>\n");
195     # C21 = Q2 + Q4
197     file("Q2l\$level","input",\$sizeBlock);
198     file("Q4l\$level","input",\$sizeBlock);
199     file("C21l\$level","output",\$sizeBlock);
200     print("</job>\n");
202     # C22 = Q1 − Q2 + Q3 + Q6
203     job("C22","Strassen","l\$level",\$sizeMult);
204     file("Q1l\$level","input",\$sizeBlock);
205     file("Q2l\$level","input",\$sizeBlock);
206     file("Q3l\$level","input",\$sizeBlock);
207     file("Q6l\$level","input",\$sizeBlock);
208     file("C22l\$level","output",\$sizeBlock);
209     print("</job>\n");
210 }
212 print "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
213 print "<!-- generated: ".(localtime())." -->\n";
214 print "<adag xmlns=\"http://pegasus.isi.edu/schema/DAX\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://pegasus.isi.edu/schema/DAX http://pegasus.isi.edu/schema/dax-2.1.xsd\" version=\"2.1\" count=\"1\" index=\"0\" name=\"test\" jobCount=\"25\" fileCount=\"0\" childCount=\"20\">\n";
216 strassen(2000);