magistraleinformaticanetworking:spd:assistexamples
Differenze
Queste sono le differenze tra la revisione selezionata e la versione attuale della pagina.
Entrambe le parti precedenti la revisioneRevisione precedenteProssima revisione | Revisione precedente | ||
magistraleinformaticanetworking:spd:assistexamples [19/05/2010 alle 12:41 (15 anni fa)] – Massimo Coppola | magistraleinformaticanetworking:spd:assistexamples [19/05/2010 alle 12:52 (15 anni fa)] (versione attuale) – Massimo Coppola | ||
---|---|---|---|
Linea 525: | Linea 525: | ||
}c$ | }c$ | ||
</ | </ | ||
- | |||
====More complex examples of parmod usage==== | ====More complex examples of parmod usage==== | ||
+ | ===parmod.ast=== | ||
+ | <file - parmod.ast> | ||
+ | // -*- C++ -*- | ||
+ | #define N 10 | ||
+ | #define M 5 | ||
+ | |||
+ | generic main() | ||
+ | { | ||
+ | stream long A1; | ||
+ | stream long B1; | ||
+ | |||
+ | genera(output_stream A1); | ||
+ | p_array(input_stream A1 output_stream B1); | ||
+ | fine1(input_stream B1); | ||
+ | } | ||
+ | |||
+ | |||
+ | genera(output_stream long A1) { | ||
+ | fgen(output_stream A1); | ||
+ | } | ||
+ | |||
+ | |||
+ | proc fgen(output_stream long A1) | ||
+ | inc<" | ||
+ | $c++{ | ||
+ | long a; | ||
+ | | ||
+ | // start regression test | ||
+ | std::cerr << " | ||
+ | |||
+ | for (int i=0; | ||
+ | a = i; | ||
+ | assist_out(A1, | ||
+ | }; | ||
+ | }c++$ | ||
+ | |||
+ | |||
+ | parmod p_array (input_stream long A1 output_stream long B1) { | ||
+ | topology array[i:M] Pv; | ||
+ | attribute long z; | ||
+ | |||
+ | do input_section { | ||
+ | guard1: on , , A1 { | ||
+ | distribution A1 broadcast to Pv; | ||
+ | operation { | ||
+ | z = z + 1; | ||
+ | }<use {z}> | ||
+ | } | ||
+ | } while (true) | ||
+ | | ||
+ | virtual_processors { | ||
+ | elab1 (in guard1 out B1) { | ||
+ | VP i { | ||
+ | f_p1 (in A1 output_stream B1); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | output_section { | ||
+ | collects B1 from ANY Pv; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | |||
+ | fine1(input_stream long B1) | ||
+ | |||
+ | inc<" | ||
+ | $c++{ | ||
+ | static int count = 0; | ||
+ | static int ok = 0; | ||
+ | |||
+ | //std::cerr << "Fine -> ricevuto B1 = " << B1 << | ||
+ | | ||
+ | // verify result | ||
+ | long b; | ||
+ | |||
+ | if (B1 != ((int)(count/ | ||
+ | count++; | ||
+ | |||
+ | // end of regression test | ||
+ | if (count >= N*M) { | ||
+ | if (ok==0) | ||
+ | std::cerr << " | ||
+ | else std::cerr << " | ||
+ | } | ||
+ | }c++$ | ||
+ | |||
+ | |||
+ | proc f_p1(in long A1 output_stream long B1) | ||
+ | |||
+ | inc<" | ||
+ | $c++{ | ||
+ | long b = A1; | ||
+ | assist_out(B1, | ||
+ | }c++$ | ||
+ | </ | ||
+ | ===parmod_due_proc.ast=== | ||
+ | <file - parmod_due_proc.ast> | ||
+ | // -*- C++ -*- | ||
+ | |||
+ | # | ||
+ | |||
+ | # | ||
+ | # | ||
+ | #define NUM1 0 | ||
+ | #define NUM2 1 | ||
+ | |||
+ | generic main() | ||
+ | { | ||
+ | stream long A; | ||
+ | stream long[2] B; | ||
+ | |||
+ | genera | ||
+ | p_array | ||
+ | fine1 (input_stream B); | ||
+ | } | ||
+ | |||
+ | |||
+ | genera(output_stream long A) { | ||
+ | fgen(output_stream A); | ||
+ | } | ||
+ | |||
+ | |||
+ | proc fgen(output_stream long A) | ||
+ | |||
+ | inc<" | ||
+ | $c++{ | ||
+ | long a; | ||
+ | | ||
+ | // start of regression test | ||
+ | std::cerr << " | ||
+ | |||
+ | for (int i=0; | ||
+ | a = i; | ||
+ | assist_out(A, | ||
+ | }; | ||
+ | }c++$ | ||
+ | |||
+ | |||
+ | parmod p_array (input_stream long A output_stream long B[2]) { | ||
+ | | ||
+ | topology array[i:M] Pv; | ||
+ | attribute long b[2] replicated; | ||
+ | |||
+ | do input_section { | ||
+ | guard1: on , , A { | ||
+ | distribution A broadcast to Pv; | ||
+ | } | ||
+ | } while (true) | ||
+ | | ||
+ | virtual_processors { | ||
+ | elab1 (in guard1) { | ||
+ | VP i { | ||
+ | f_p1 (in A, i out b); | ||
+ | f_p2 (in b out b); | ||
+ | assist_out (B, b); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | output_section { | ||
+ | collects B from ANY Pv; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | |||
+ | fine1(input_stream long B[2]) | ||
+ | |||
+ | inc<" | ||
+ | $c++{ | ||
+ | static int count = 0; | ||
+ | static int ok = 0; | ||
+ | |||
+ | long b; | ||
+ | | ||
+ | if (B[1] != NUM2) ok = -1; | ||
+ | count++; | ||
+ | | ||
+ | // end of regression test | ||
+ | if (count >= N*M) { | ||
+ | if (ok==0) | ||
+ | std::cerr << " | ||
+ | else std::cerr << " | ||
+ | } | ||
+ | }c++$ | ||
+ | |||
+ | |||
+ | proc f_p1(in long A, long i out long B[2]) | ||
+ | |||
+ | inc<" | ||
+ | $c++{ | ||
+ | B[0] = i; | ||
+ | B[1] = NUM1; | ||
+ | }c++$ | ||
+ | |||
+ | |||
+ | proc f_p2(in long B1[2] out long B2[2]) | ||
+ | |||
+ | inc<" | ||
+ | $c++{ | ||
+ | B2[0] = B1[0]; | ||
+ | B2[1] = NUM2; | ||
+ | }c++$ | ||
+ | </ | ||
+ | ===nondeterminismo.ast=== | ||
+ | <file - nondeterminismo.ast> | ||
+ | // -*- C++ -*- | ||
+ | |||
+ | /* ------------------------------------------------------------ */ | ||
+ | /* This example test nondeterministic receive over two streams | ||
+ | /* in a parmod with none topology | ||
+ | /* Program graph contains 2 sequential modules, a parmod and */ | ||
+ | /* a further sequential. | ||
+ | /* ------------------------------------------------------------ */ | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | #define N 10 | ||
+ | #define MAX_ITER1 10 | ||
+ | #define MAX_ITER2 10 | ||
+ | #define FILE_OUT "/ | ||
+ | |||
+ | |||
+ | typedef struct | ||
+ | { | ||
+ | long x; | ||
+ | long y; | ||
+ | } T_cart; | ||
+ | |||
+ | |||
+ | generic main() | ||
+ | { | ||
+ | stream T_cart[N] A; | ||
+ | stream long A1; | ||
+ | stream T_cart[N] B; | ||
+ | |||
+ | genera1 | ||
+ | genera2 | ||
+ | elabora | ||
+ | stampa | ||
+ | } | ||
+ | |||
+ | |||
+ | genera1(output_stream T_cart A[N]) { | ||
+ | Fgenera1(output_stream A); | ||
+ | } | ||
+ | |||
+ | |||
+ | proc Fgenera1(output_stream T_cart A[N]) | ||
+ | |||
+ | inc<" | ||
+ | $c++{ | ||
+ | T_cart tmp_A[N]; | ||
+ | | ||
+ | // start regression test | ||
+ | std::cerr << " | ||
+ | |||
+ | for (int k=0; k< | ||
+ | for (int i=0; i<N; i++) { | ||
+ | tmp_A[i].x = i+(k/ | ||
+ | tmp_A[i].y = (i+(k/ | ||
+ | } | ||
+ | assist_out (A, tmp_A); | ||
+ | } | ||
+ | }c++$ | ||
+ | |||
+ | |||
+ | genera2(output_stream long A1) { | ||
+ | Fgenera2(output_stream A1); | ||
+ | } | ||
+ | |||
+ | |||
+ | proc Fgenera2(output_stream long A1) | ||
+ | |||
+ | inc<" | ||
+ | $c++{ | ||
+ | static long c = 0; | ||
+ | | ||
+ | // start regression test | ||
+ | std::cerr << " | ||
+ | |||
+ | for(int k=0; k< | ||
+ | assist_out(A1, | ||
+ | c++; | ||
+ | } | ||
+ | }c++$ | ||
+ | |||
+ | |||
+ | parmod elabora(input_stream T_cart A[N], long A1 output_stream T_cart B[N]) { | ||
+ | topology none Pv; | ||
+ | | ||
+ | do input_section { | ||
+ | guard1: on , , A { | ||
+ | distribution A on_demand to Pv; | ||
+ | } | ||
+ | guard2: on , , A1 { | ||
+ | distribution A1 on_demand to Pv; | ||
+ | } | ||
+ | } while(true) | ||
+ | | ||
+ | virtual_processors { | ||
+ | elab(in guard1 out B) { | ||
+ | VP { | ||
+ | Felab1(in A output_stream B); | ||
+ | } | ||
+ | } | ||
+ | elab1(in guard2) { | ||
+ | VP { | ||
+ | Felab2(in A1); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | output_section { | ||
+ | collects B from ANY Pv; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | |||
+ | stampa(input_stream T_cart B[N]) | ||
+ | |||
+ | inc<" | ||
+ | $c++{ | ||
+ | std:: | ||
+ | static int file_aperto = -1; | ||
+ | static int count = 0; | ||
+ | static int ok = 0; | ||
+ | |||
+ | |||
+ | if (file_aperto == -1) { | ||
+ | f.open (FILE_OUT); | ||
+ | file_aperto = 0; | ||
+ | } | ||
+ | | ||
+ | for(int i=0; i<N; i++) | ||
+ | f << B[i].x << " " << B[i].y << std::endl; | ||
+ | f << std::endl << std::endl; | ||
+ | |||
+ | // verift result | ||
+ | for (int i=0; i<N; i++) { | ||
+ | if (B[i].y != -((int)(i+(count/ | ||
+ | if (B[i].x != ((int)((i+(count/ | ||
+ | } | ||
+ | | ||
+ | count++; | ||
+ | | ||
+ | if (count >= MAX_ITER1) { | ||
+ | f.close(); | ||
+ | | ||
+ | // end of regression test | ||
+ | if (ok==0) | ||
+ | std::cerr << " | ||
+ | else | ||
+ | std::cerr << " | ||
+ | } | ||
+ | }c++$ | ||
+ | |||
+ | |||
+ | proc Felab1(in T_cart A[N] output_stream T_cart S[N]) | ||
+ | |||
+ | inc<" | ||
+ | $c++{ | ||
+ | int i; | ||
+ | T_cart B[N]; | ||
+ | |||
+ | for(i=0; i<N; i++) { | ||
+ | B[i].x = A[i].y; | ||
+ | B[i].y = -A[i].x; | ||
+ | } | ||
+ | assist_out(S, | ||
+ | }c++$ | ||
+ | |||
+ | |||
+ | proc Felab2(in long A1) | ||
+ | |||
+ | inc<" | ||
+ | $c++{ | ||
+ | }c++$ | ||
+ | </ | ||
+ | ===array_scatter.ast=== | ||
+ | <file - array_scatter.ast> | ||
+ | // -*- C++ -*- | ||
+ | #define N 10 | ||
+ | |||
+ | generic main() | ||
+ | { | ||
+ | stream long[N] A1; | ||
+ | stream long[N] A2; | ||
+ | stream long[N] B1; | ||
+ | stream long[N] B2; | ||
+ | | ||
+ | genera1 | ||
+ | genera2 | ||
+ | cross (input_stream A1, A2 output_stream B1, B2); | ||
+ | fine1 (input_stream B1); | ||
+ | fine2 (input_stream B2); | ||
+ | } | ||
+ | |||
+ | |||
+ | genera1(output_stream long A1[N]) { | ||
+ | fgen1(output_stream A1); | ||
+ | } | ||
+ | |||
+ | |||
+ | proc fgen1(output_stream long A1[N]) | ||
+ | inc<" | ||
+ | $c++{ | ||
+ | long a[N]; | ||
+ | | ||
+ | // start regression test | ||
+ | std::cerr << " | ||
+ | |||
+ | for (int i=0; | ||
+ | a[i] = i; | ||
+ | | ||
+ | assist_out(A1, | ||
+ | }c++$ | ||
+ | |||
+ | |||
+ | genera2(output_stream long A2[N]) { | ||
+ | fgen2(output_stream A2); | ||
+ | } | ||
+ | |||
+ | |||
+ | proc fgen2(output_stream long A2[N]) | ||
+ | inc<" | ||
+ | $c++{ | ||
+ | long a[N]; | ||
+ | |||
+ | // start regression test | ||
+ | std::cerr << " | ||
+ | |||
+ | for (int i=0; | ||
+ | a[i] = 10 + i; | ||
+ | | ||
+ | assist_out(A2, | ||
+ | }c++$ | ||
+ | |||
+ | |||
+ | parmod cross(input_stream long A1[N], long A2[N] output_stream long B1[N], long B2[N]) { | ||
+ | |||
+ | topology array [i:N] Pv; | ||
+ | |||
+ | attribute long S[N] scatter S[*i0] onto Pv[i0]; | ||
+ | |||
+ | stream long s1; | ||
+ | stream long s2; | ||
+ | |||
+ | do input_section { | ||
+ | guard1: on , , A1 { | ||
+ | distribution A1[*j] scatter to S[j]; | ||
+ | } | ||
+ | guard2: on , , A2 { | ||
+ | distribution A2[*k] scatter to S[k]; | ||
+ | } | ||
+ | } while (true) | ||
+ | | ||
+ | virtual_processors { | ||
+ | elab1(in guard1 out s1) { | ||
+ | VP i { | ||
+ | f_p1(in S[i] out s1); | ||
+ | } | ||
+ | } | ||
+ | elab2(in guard2 out s2) { | ||
+ | VP i { | ||
+ | f_p2(in S[i] out s2); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | | ||
+ | output_section { | ||
+ | collects s1 from ALL Pv[i] { | ||
+ | int el1; | ||
+ | int B1_[N]; | ||
+ | AST_FOR_EACH(el1) { | ||
+ | B1_[i]=el1; | ||
+ | } | ||
+ | assist_out (B1, B1_); | ||
+ | }<>; | ||
+ | |||
+ | collects s2 from ALL Pv[i] { | ||
+ | int el2; | ||
+ | int B2_[N]; | ||
+ | AST_FOR_EACH(el2) { | ||
+ | B2_[i]=el2; | ||
+ | } | ||
+ | assist_out (B2, B2_); | ||
+ | }<>; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | |||
+ | fine1(input_stream long B1[N]) | ||
+ | |||
+ | inc<" | ||
+ | $c++{ | ||
+ | int ok = 0; | ||
+ | | ||
+ | /* | ||
+ | std::cerr << " | ||
+ | for (int i=0; i<N; i++) | ||
+ | std::cerr << B1[i] << " "; | ||
+ | std::cerr << std::endl; | ||
+ | */ | ||
+ | | ||
+ | for (int i=0; | ||
+ | if (ok==0) | ||
+ | std::cerr << " | ||
+ | else | ||
+ | std::cerr << " | ||
+ | }c++$ | ||
+ | |||
+ | |||
+ | fine2(input_stream long B2[N]) | ||
+ | |||
+ | inc<" | ||
+ | $c++{ | ||
+ | int ok = 0; | ||
+ | |||
+ | /* | ||
+ | std::cerr << " | ||
+ | for (int i=0; i<N; i++) | ||
+ | std::cerr << B2[i] << " "; | ||
+ | std::cerr << std::endl; | ||
+ | */ | ||
+ | |||
+ | for (int i=0; | ||
+ | if (ok==0) | ||
+ | std::cerr << " | ||
+ | else | ||
+ | std::cerr << " | ||
+ | }c++$ | ||
+ | |||
+ | |||
+ | proc f_p1(in long A1 out long B1) | ||
+ | |||
+ | inc<" | ||
+ | $c++{ | ||
+ | long b; | ||
+ | b = A1; | ||
+ | B1 = b; | ||
+ | }c++$ | ||
+ | |||
+ | |||
+ | proc f_p2(in long A2 out long B2) | ||
+ | |||
+ | inc<" | ||
+ | $c++{ | ||
+ | B2 = A2; | ||
+ | }c++$ | ||
+ | </ | ||
+ | ===array_on_demand_attrib_array_replic.ast=== | ||
+ | <file - array_on_demand_attrib_array_replic.ast> | ||
+ | // -*- C++ -*- | ||
+ | #define N 5 | ||
+ | #define M 10 | ||
+ | #define MAX_ITER 20 | ||
+ | #define RIS "/ | ||
+ | |||
+ | / | ||
+ | /* */ | ||
+ | /* Test of the on_demand distribution over the array topology | ||
+ | /* */ | ||
+ | /* The parmod " | ||
+ | /* */ | ||
+ | /* The replicated attribute is a one-dimension array */ | ||
+ | /* */ | ||
+ | / | ||
+ | |||
+ | generic main() { | ||
+ | stream long[M] A; | ||
+ | stream long[M] B; | ||
+ | |||
+ | genera | ||
+ | elabora | ||
+ | stampa | ||
+ | } | ||
+ | |||
+ | |||
+ | genera (output_stream long A[M]) { | ||
+ | Fgenera (output_stream A); | ||
+ | } | ||
+ | |||
+ | |||
+ | proc Fgenera (output_stream long A[M]) | ||
+ | inc<" | ||
+ | $c++{ | ||
+ | long tmp_A[M]; | ||
+ | |||
+ | // start regression test | ||
+ | std::cerr << " | ||
+ | | ||
+ | for (int k=0; k< | ||
+ | for (int i=0; i<M; i++) | ||
+ | tmp_A[i] = i; | ||
+ | assist_out (A, tmp_A); | ||
+ | } | ||
+ | }c++$ | ||
+ | |||
+ | |||
+ | parmod elabora (input_stream long A[M] output_stream long B[M]) { | ||
+ | |||
+ | topology array [i:N] Pv; | ||
+ | |||
+ | /* bug in module builder solved: | ||
+ | it was taking B_ as an integer, while it is an array */ | ||
+ | |||
+ | attribute long B_[M] replicated; | ||
+ | stream long ris[M]; | ||
+ | | ||
+ | do input_section { | ||
+ | guard1: on , , A { | ||
+ | distribution A on_demand to Pv; | ||
+ | } | ||
+ | } while (true) | ||
+ | |||
+ | virtual_processors { | ||
+ | elab (in guard1 out ris) { | ||
+ | VP i { | ||
+ | Felab (in A out B_); | ||
+ | assist_out (ris, B_); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | output_section { | ||
+ | collects ris from ANY Pv { | ||
+ | assist_out(B, | ||
+ | }<>; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | |||
+ | stampa (input_stream long B[M]) | ||
+ | |||
+ | inc<" | ||
+ | $c++{ | ||
+ | static std:: | ||
+ | static int count = 0; | ||
+ | static int ok = 0; | ||
+ | |||
+ | if (count == 0) { | ||
+ | f.open (RIS); | ||
+ | } | ||
+ | |||
+ | /* print and verify results */ | ||
+ | for (int i=0; i<M; i++) { | ||
+ | f << B[i] << std::endl; | ||
+ | if (B[i] != i) ok = -1; | ||
+ | } | ||
+ | count++; | ||
+ | | ||
+ | // end of regression test | ||
+ | if (count >= MAX_ITER) { | ||
+ | if (ok==0) | ||
+ | std::cerr << " | ||
+ | else std::cerr << " | ||
+ | f.close(); | ||
+ | } | ||
+ | }c++$ | ||
+ | |||
+ | |||
+ | proc Felab (in long A[M] out long B_[M]) | ||
+ | |||
+ | inc<" | ||
+ | $c++{ | ||
+ | for (int i=0; i<M; i++) | ||
+ | B_[i] = A[i]; | ||
+ | }c++$ | ||
+ | </ | ||
+ |
magistraleinformaticanetworking/spd/assistexamples.1274272872.txt.gz · Ultima modifica: 19/05/2010 alle 12:41 (15 anni fa) da Massimo Coppola