Friday, January 12, 2018

Lungime sau volum de prelucrări

Când se scrie un program se fac multe calcule pentru a vedea care este varianta de program cea mai convenabilă. Se fac alegeri justificate cu destul de multe argumente, unele fiind foarte convingătoare. De regulă se construiesc modele de eficiență în care apar inegalități din care să rezulte când este bună o variantă și când este bună o altă variantă de program. Voi da un exemplu de astfel de analiză. Există o problemă P în care trebuie evaluate expresiile:
C = A + B
P = R + S
X = Y + Z
W = U + V
unde A, B, C, P, R, S, X, Y, Z, W, U și V sunt matrice cu diferite dimensiuni care permit totuși efectuarea operațiilor specifice acelor expresii, adică matricele A, B, C au fiecare M1 linii și N1, coloane, matricele P, R, S au fiecare câte M2 linii și N2 coloane, matricele X, Y, Z au fiecare M3 linii și N3 coloane, iar matricele W, U și V au respectiv M4 linii  și N4 coloane. Ideia de bază care se desprinde este aceea de a scrie un subprogram de adunare a două matrice, subprogram care va fi apelat de 4 ori, ceea ce duce la textul sursă următor:

            SUBROUTINE ADMAT(A,B,C,M,N)
            DO 10 I=1,M
            DO 10 J=1,N
            C(I,J)=A(I,J)+B(I,J)
10        CONTINUE
            RETURN
            END
Programul principal va conține:

................. secvență inițializare variabile M1, N1, M2, N2, M3, N3, M4, N4 .............
................. secvență inițializare matrice A, B .............
................. secvență inițializare matrice R, S .............
................. secvență inițializare matrice Y, Z .............
................. secvență inițializare matrice U, V .............
            CALL ADMAT(A,B,C,M1,N1)
            CALL ADMAT(R,S,P,M2,N2)
            CALL ADMAT(Y,Z,X,M3,N3)
            CALL ADMAT(U,V,W,M4,N4)
................. secvență cu alte prelucrări ale matricelor C, P, X și W.
Pentru ceea ce ne interesează să se optimizeze, textul sursă se referă la o construcție de lungime
Lg = 6 + 4 = 10 instrucțiuni ( instrucțiuni pentru subprogram și 4 instrucțiuni pentru apelul subprogramului ADMAT(...).
Dacă se încorporează toate secvențele în programul principal, acesta va arăta astfel:

................. secvență inițializare variabile M1, N1, M2, N2, M3, N3, M4, N4 .............
................. secvență inițializare matrice A, B .............
................. secvență inițializare matrice R, S .............
................. secvență inițializare matrice Y, Z .............
................. secvență inițializare matrice U, V .............
            DO 10 I=1,M1
            DO 10 J=1,N1
            C(I,J)=A(I,J)+B(I,J)
10        CONTINUE
            DO 10 I=1,M2
            DO 10 J=1,N2
            P(I,J)=R(I,J)+S(I,J)
20        CONTINUE
            DO 10 I=1,M3
            DO 10 J=1,N3
            X(I,J)=Y(I,J)+Z(I,J)
30        CONTINUE
            DO 10 I=1,M4
            DO 10 J=1,N4
            W(I,J)=U(I,J)+V(I,J)
40        CONTINUE
................. secvență cu alte prelucrări ale matricelor C, P, X și W.
Această variantă are lungime Lg = 16 instrucțiuni. Programul în prima variantă are la execuție pentru cele patru apeluri de subprograme grupul de operații complexe:
- o instrucțiune de salt necondiționat spre subprogram;
- estragere de pe stivă a adreselor operanzilor;
- execuția adunării elementelor matricelor;
- revenirea în programul apelator.
La fiecare apel volumul de prelucrări este undeva la 7 instrucțiuni, deci ceea ce părea o economie se concretizează prin 28 de instrucțiuni, dintre care unele sunt costisitoare la ciclurile mașină dacă salturile necondiționate se fac intersegment când suprogramul se află în alt segment decât programul apelator. Este o întreagă filosofie a discuta despre echilibrul lungime program și volum de prelucrări și totul se rezolvă prin măsurători de ordin statistic, adevărul fiind undeva la jumătate.

(12 ianuarie 2017)


No comments:

Post a Comment