· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.A&O —› Устранение зависимости по данным

<< . 1 . 2 . 3 . 4 .

Посл.отвђт Сообщенiе


Дата: Ноя 21, 2003 19:05:49

Исправляюсь :) У меня одна итерация (т.е. одно изменение per) занимает всего 21 такт, все данные выровнены на 4. ММХ привязать пока сложно, не зная характера и объема данных.
	lea esi, mas1
	lea edi, mas2
	xor eax, eax
	mov ecx, per
	lea esi, [esi+ecx*4]
@@next_line:
	push ecx
	mov edx, esi
	mov ecx, per2
	mov ebx, per3
@@:	add eax, dword ptr [esi]
	lea esi, [esi+ebx*4]
	dec ecx
	jnz @B
	lea esi, [edx+4]
	mov [edi], eax
	add edi, 4
	pop ecx
	dec ecx
	jnz @@next_line


Дата: Ноя 21, 2003 19:37:44

Black_mirror
УВЕЛИЧИТЬ В 100 раз? для чего?


Дата: Ноя 22, 2003 05:21:16 · Поправил: Black_mirror

emergenter
Время выполнения вашего алгоритма k0+per*(k1+per2*k2), где:
k0 - затраты на инициализацию счеткика внешнего цикла
k1 - затраты на выполнение итерации внешнего цикла( включая проверку и изменение счетчика внешнего цикла и инициализацию счетчика внутреннего цикла и не включая время выполнения внутреннего цикла)
k2 - время выполнения итерации внутреннего цикла
Затратами k0 при увеличении per или per2 можно пренебречь.
Также можно пренебреч затратами k1 при увеличении per2.
Таким образом время выполнения этого цикла: per*per2*k2.

А вот немного улучшенный мой алгоритм:
int n3=min(per3,per);
int sum[]=new int[n3];
for(i=0;i<n3;i++) //цикл 1
   sum[i]=0;
int n=per2*per3;
for(i=0;i<n;i+=per3)      //цикл 2
   for(j=0;j<n3;j++)
     sum[j]+=mas1[i+j];
int m=per/per3;
int r=per%per3;
for(int i=0;i<m;i+=per3)  //цикл 3
  for(j=0;j<per3;j++)
  {
    summa+=sum[j];
    sum[j]+=mas1[per+i+j+n]-mas1[per+i+j];
    mas2[i+j]=summa;
  }
for(j=0;j<r;j++)          //цикл 4
{
  summa+=sum[j];
  mas2[m+j]=summa;
}
delete[] sum;

Я не буду писать все слагаемые а выпишу только главные:
k0 - время на выделения памяти(сильно влияет при маленьких значениях per и per2)
per2*min(per3,per)*k2 - время выполнения второго цикла
per*max(k3,k4) - время выполнения 3 и 4 циклов.
При больших per и per2 можно исключить k0 и время выполнения будет порядка per2*per3*k2+per*max(k3,k4),
то есть оно пропорционально per и per2, а в вашем алгоритме оно пропорционатьно per*per2. Поэтому нельзя говорить что один алгоритм в 1.5 раза медленее другого.

Думаю что при per и per2 порядка 10000-100000 и при per3 раз в 10 меньше чем per, ваш алгоритм будет проигрывать.


Дата: Ноя 24, 2003 01:37:21

Black_mirror
Классный АЛГОРИТМ!!!!
щас быстренько разберусь и протестирую...


Дата: Ноя 24, 2003 03:25:57

emergenter
Кстати а что предлагал с этим алгоритмом сделать Крис? Или у него был другой пример?


Дата: Ноя 24, 2003 22:23:49

Black_mirror
не у Криса этот алгоритм не описан!! У него собраны примитивы. Как раз из них ты этот алгоритм и сделал!! Прямо по книге.

<< . 1 . 2 . 3 . 4 .


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.066