Обращение матрицы A размером N*N с помощью разложения в ряд при ОП компьютера: 3072 Mb (Лабораторная работа № 1), страница 2

              BB[i*N+j] = C[i*N+j];

            return (double)start1/(CLK_TCK*iter); // время после выполнения программы

}

// программа без использования SSE

void umnogenie(float A[],float B[],float C[])

{

            int i,j,k;

            for(i = 0;i<N;i++)

                        for(j=0;j<N;j++)

        {

                                    C[i*N+j]= 0;

                                    for(k = 0;k<N;k++)

                                               C[i*N+j]+=A[i*N+k]*B[k*N+j];

        }

}

void suma(float A[],float B[],float C[])

{

            int i,j;

            for(i = 0;i<N;i++)

                        for(j = 0;j<N;j++)

                                    C[i*N+j]=A[i*N+j]+B[i*N+j];

 }

void raznost(float A[],float B[],float C[])

{

            int i,j;

            for(i = 0;i<N;i++)

                        for(j = 0;j<N;j++)

                                    C[i*N+j]=A[i*N+j]-B[i*N+j];

}

double flip(float mas[],float BB[])

{

   float *I,*B,*R,*C,*sib, max, maxst, summa;

   int i,j,s;

   clock_t start;

   I = new float[N*N];

   B = new float[N*N];

   R = new float[N*N];

   C = new float[N*N];

   sib = new float[N*N];

   max = 0;

   summa = 0;

   for(i = 0;i<N;i++)

   {

               for(j = 0;j<N;j++)

           summa = summa + fabs(mas[i*N+j]);

               if(summa>max)

                           max = summa;

   }

   maxst = 0;

   summa = 0;

   for(j = 0;j<N;j++)

   {

               for(i = 0;i<N;i++)

                           summa = summa + fabs(mas[i*N+j]);

               if(summa>maxst)

                           maxst = summa;

   }

   for(i = 0;i<N;i++)

               for(j = i;j<N;j++)

               {

                           B[i*N+j] = mas[j*N+i]/(max*maxst);

                           B[i*N+j] = mas[j*N+i]/(max*maxst);

               }

               for(i = 0;i<N;i++)

                        for(j=0;j<N;j++)

                                    if(i==j)

                                               I[i*N+j] = 1;

                                    else

                                               I[i*N+j] = 0;

    umnogenie(mas,B,C);

    raznost(I,C,R);

            for(i = 0;i<N;i++)

           for(j = 0;j<N;j++)

           {

              BB[i*N+j] = I[i*N+j];

              sib[i*N+j] = I[i*N+j];

           }

            start = clock(); // замеряем время

            for(s = 1;s<=iter;s++)

                        {           umnogenie(sib,R,C);

                        for(i = 0;i<N;i++)

                           for(j = 0;j<N;j++)

                              sib[i*N+j] = C[i*N+j];

                        suma(BB,sib,BB);

            }

            umnogenie(BB,B,C);

            start = clock() - start; // закончили замерять время.

        for(i = 0;i<N;i++)

           for(j = 0;j<N;j++)

              BB[i*N+j] = C[i*N+j];

            return (double)start/(CLK_TCK*iter); // возвращаем время потраченное на //выполнение программы

}

void main()

{

   int i,j;

   double t,t1,t2;

   clock_t start;

   float *m1,*tech;

   m1 =  new float[N*N];

   tech = new float[N*N];

   for(i=0;i<N;i++)

               for(j=0;j<N;j++)

                            {

                              If (i==j)

                  m1[i*N+j]=512;

        else

                 m1[i*N+j]=1;

}

   start = clock(); // начало замеры времени

   t = flip(m1,tech);

   start = clock() - start; // конец замера

   t1 =(double) start/CLK_TCK;

   printf("Vremya Iteracii %f, t\n)

   printf (“Vremya cikla” %f", t1);

   start = clock(); // начало замеры времени

   t = S_SSE(m1,tech);

   start = clock() - start; // конец замера

   t2 = start/CLK_TCK;

   printf("\nvremya 1 iter cicla %lf, t\n);

   printf (“koli4estvo vremeni vne cicla %lf",t2);

   printf (“\n”);

   system ("pause");

}

Результаты выполнения программы

Для фиксированного N = 512 и число итераций Iter = 10 имеем следующее:

Время одной итерации (с)

Время вне цикла (с)

Без применения SSE

                  1.99

21.187

          C SSE

                  0.3422

3.00

Министерство образования РФ

Новосибирский государственный технический университет

Лабораторная работа №1

по предмету: “Архитектура ЭВМ и вычислительных систем”

Факультет: ПМИ

Группа: ПМи-81

Студент: Дубина Н.Г.

Преподаватель: Куликов И.М.

Новосибирск

2009