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
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.