· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.A&O —› Устранение зависимости по данным

<< . 1 . 2 . 3 . 4 . 5 . >>

Посл.отвђт Сообщен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
не у Криса этот алгоритм не описан!! У него собраны примитивы. Как раз из них ты этот алгоритм и сделал!! Прямо по книге.


Дата: Ноя 25, 2003 08:41:07

emergenter
Я не понял какое отношение замена одного алгоритма на другой имеет к устранению зависимости по данным? Ясно что для устранения зависимости по данным нужно изменить алгоритм, но в данном алгоритме она также присутствует. Да и какой смысл устранять зависимость по данным в однопроцессорной системе?


Дата: Ноя 25, 2003 10:09:54

Black_mirror
Я так понимаю чем в алгоритме меньше зависимости по данным тем больше появляется возможности параллельной обработки данных. И надо стремиться чтобы вычисления и работа с памятью ЗАГРУЗКА / ЗАПИСЬ выполнялись параллельно. Из чего следует минимум времени выполнения..
Ведь так? Поправьте если не прав.


Дата: Ноя 25, 2003 11:54:35

Возможности процессора по параллельной обработке очень ограничены. А чтобы ими воспользоватся тебе придется почитать статьи по низкоуровневой оптимизации, которые находятся на данном сайте. Другое дело многопроцессорные системы. Там стремятся устранить зависимость по данным чтобы можно было выполнить разные итерации цикла одновременно на различных процессорах.
Зависимость по данным вытекает их структуры самого алгоритма. Но каждую задачу можно решить несколькими способами. И из них мы можем выбирать.


Дата: Ноя 25, 2003 12:20:10

если можно ссылочку на статьи...
Вроде только Агнер Фог есть...


Дата: Ноя 29, 2003 21:19:17

Уважаемый,Black_mirror
ваш алгоритм работает неправильно. Я мозги себе чуть не сломал пытаясь разобраться.


Дата: Ноя 29, 2003 22:14:13

Sm_Andrei
Спасибо!
Вот исправленный:
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[per+i+j];
int m=per/per3*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;


Дата: Дек 2, 2003 21:21:30

Black_mirror

Что-то у меня все равно не получается запустить ваш кусман проги - не того считает.


Дата: Дек 2, 2003 22:00:46

У меня выдает тоже самое что и алгоритм на первой странице. Может у вас обращение за пределы массива происходит? Число элементов в первом массиве должно быть не меньше чем min(per,per3)+per2*per3, а во втором не меньше чем per.


Дата: Дек 2, 2003 23:50:09 · Поправил: _G3

Black_mirror

Если per<per3 то в цикле 3 (j=0;j<per3;j++) sum[j] не выделено в памяти и неинициализировано.

<< . 1 . 2 . 3 . 4 . 5 . >>


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