Определение максимального числа локальных переменных, которое может полностью проецироваться на регистры общего назначения, страница 3

#include <stdio.h>

#include <sys/timeb.h>

#include <stdlib.h>

const int SIZE=512;

unsigned char M1[SIZE][SIZE];

unsigned char M2[SIZE][SIZE];

unsigned char M3[SIZE][SIZE];

 

void randomize(int s) {

    timeb h;

    srand(s);

    for(int i=0;i<s;i++) {

        for(int j=0;j<s;j++) {

            M1[i][j]=rand()%128;

            M2[i][j]=M1[i][j]%127;

        }

    }

}

 

void transponeM1(int s) {

    for(int i=0;i<s;i++) {

        for(int j=0;j<s;j++) {

            int k = M1[i][j];

            M1[i][j]=M1[j][i];

            M1[j][i]=k;

        }

    }

}

 

void transponeM2(int s) {

    for(int i=0;i<s;i++) {

        for(int j=0;j<s;j++) {

            int k = M1[i][j];

            M1[i][j]=M1[j][i];

            M1[j][i]=k;

        }

    }

}

void main() {

    FILE * out = fopen("matrix.csv","wt");

    int s,i,j,r;

    long measured=0;

    timeb start, end;

    for(s=0;s<=SIZE;s+=4) {

        randomize(s);

        ftime(&start);

        for(i=0;i<s;i++) {

            for(j=0;j<s;j++) {

                M3[i][j]=0;

                for(r=0;r<s;r++) {

                    M3[i][j]+=M1[i][r]*M2[r][j];

                }

            }

        }

        ftime(&end);

        measured = (end.time*1000+end.millitm)-(start.time*1000+start.millitm);

        fprintf(out,"%i;%i;",s,measured);

        printf("%i - %i - ",s,measured);

        transponeM1(s);

        ftime(&start);

        for(i=0;i<s;i++) {

            for(j=0;j<s;j++) {

                M3[i][j]=0;

                for(r=0;r<s;r++) {

                    M3[i][j]+=M1[r][i]*M2[r][j];

                }

            }

        }

        ftime(&end);

        measured = (end.time*1000+end.millitm)-(start.time*1000+start.millitm);

        fprintf(out,"%i;",measured);

        printf("%i - ",measured);

        transponeM1(s);

        transponeM2(s);

        ftime(&start);

        for(i=0;i<s;i++) {

            for(j=0;j<s;j++) {

                M3[i][j]=0;

                for(r=0;r<s;r++) {

                    M3[i][j]+=M1[i][r]*M2[j][r];

                }

            }

        }

        ftime(&end);

        measured = (end.time*1000+end.millitm)-(start.time*1000+start.millitm);

        fprintf(out,"%i\n",measured);

        printf("%i\n",measured);

 

    }

    fclose(out);

}

                                                                                                                             Конец листинга 3


График 5. Время умножения матриц (0-80КВ)

График 6. Время умножения матриц(0-256КВ)