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

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

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

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


Дата: Дек 3, 2003 00:02:41

_G3
В таком случае этот цикл вообще не будет выполнятся так как m будет равно 0.


Дата: Дек 3, 2003 00:14:15

Black_mirror
Сорри ;)


Дата: Дек 3, 2003 21:53:18 · Поправил: Sm_Andrei

Black_mirror
Упс, я файнд еrrоr - забыл summa обнулить. Теперь все работает. При per=80;per2=40;per3=30 ваш алгоритм работает в 1.71 раза быстрее чем начальный. cicle2 сильно тормозит весь алгоритм(занимает 85% времени работы всего алгоритма). Я тут попробывал сникерснуть по-черному и вот какое извращение у меня получилось:
void function()
{
 int minper,kol,k,ind1,ind2,ind1_,ind2_;

 summa=0;
 minper=min(per,per3);

for(i=0;i<per;i++)mas2[i]=0;
 for(i=0;i<minper;i++)   //make begin-part
 {
  index=i+per;
  for(j=0;j<per2;j++)
  {
   summa+=mas1[index];
   index+=per3;
  }
  mas2[i]=summa;
 }
 if(per==minper) return;
 kol=per/per3;         //make middle-part
 index=per3;
 ind1=0;
 ind2=per+per3*per2;
 for(i=1;i<kol;i++)
 {
  for(;ind1<per3*(kol-1);ind1++,ind2++,index++)
  {
   if(ind1!=0)
    summa+=-mas1[ind1+per]+mas2[ind1]-mas2[ind1-1]+mas1[ind2];
   else
    summa+=-mas1[ind1+per]+mas2[ind1]+mas1[ind2];
   mas2[index]=summa;
  }
  ind1+=per3;
  ind2+=per3;
 }
 kol--;              //make end-part
 index=per3*i;
 i=per3*kol;
 ind2=per+per3*(per2+kol);
 kol=per%per3;
 for(ind1=i;ind1<i+kol;ind1++,ind2++,index++)
 {
  if(ind1!=0)
   summa+=-mas1[ind1+per]+mas2[ind1]-mas2[ind1-1]+mas1[ind2];
  else
   summa+=-mas1[ind1+per]+mas2[ind1]+mas1[ind2];
  mas2[index]=summa;
 }
} 


при тех же параметрах(80,40,30) работает в 2.35 раза быстрее от начального. Можно попробывать его еще оптимизировать.


Дата: Дек 5, 2003 01:01:16

Да прикольно... а был такой безобидный вопросик


Дата: Дек 5, 2003 10:19:48 · Поправил: Valery

Ребята, вот какое предложение.
Я щас пишу статьи про ia-64. Требуется такая помощь. Нужно несколько красивых алгоритмов с сильной зависимостью данных - требуется сравнить лучший результат на itanium и на x86.

Какие алгоритмы нужны.
На ia-64 это должен быть swp (софтовый конвейер)
Стало быть, подходят алгоритмы, обрабатываающие массив. While или for - все равно.
Важное условие: задача должна быть содержательной: будь то checksum, поиск, еще что-нибудь - метод должен быть известен заранее. Размер данных, которые может переварить мой симулятор - до 4 кило, но потом можно найти сим получше.
Со стороны x86 могут быть любые средства, даже заточенные под конкретные конвеер/кэш/даже память. Со сторонны itanium - абсолютный минимум средств. Только стандарт как он описан в мануалах. Прежде всего - устранение зависимости, swp, спекуляция - все реализовано аппаратно. Размер L3 можно принудительно уменьшить настройкой симулятора - чтоб не обидно было (хотя для 4 кило это несущественно). По той же причине размер данных может быть dword.

Ваш код может быть на C или асме - мне повторяю нужен только алгоритм для порта.

Результат эксперимента может быть непредсказуемым. Как сравнивать - особый вопрос, это отдельный разговор. Поначалу - число тактов и inst per cl.

Если кому интересно - жду предложений.


Дата: Дек 5, 2003 11:58:38 · Поправил: Black_mirror

Valery
Как насчет алгоритма Флойда?
for(int k=0;k<N;k++)
  for(int i=0;i<N;i++)
    for(int j=0;j<N;j++)
      if(A[i][j]>A[i][k]+A[k][j])
        A[i][j]=A[i][k]+A[k][j];

Изначально A[i][j] - длина ребра между i и j вершинами.
A[i][j]<maxint/2/(N-1) если ребро существует и
A[i][j]=maxint/2 если ребра между вершинами не существует.
Такие ограничения можно принять чтобы не происходило переполнения. Или для обозначения того, что ребра между вершинами нет можно использовать 0. В таком случае придется еще проверять что A[i][k]!=0 && A[k][j]!=0. И длину ребер можно будет увеличить до maxint/(N-1).

Правда зависимость по данным во внутреннем цикле отсутствует. Все его итерации можно выполнить сразу.


Дата: Дек 5, 2003 12:27:18

Спасибо. Влючаю в список, дальше посмотрим


Дата: Дек 7, 2003 01:09:08

Valery
А вот два примера с зависимостью по данным:
- вычислить выходы нейронной сети, состоящей из M слоев по N нейронов в каждом, при подаче данных на множество входов или обучить сетку;
- в системе из N линейных уровнений найти N неизвестных.
Ну как, подойдёт?


Дата: Дек 7, 2003 13:42:11 · Поправил: Valery

Sm_Andrei

Спасибо. Пример из линейки я наверное выберу для fpu.

А вот с нейросетями дела никогда не имел. Изучать их даже поверхностно у меня нет времени. Так что целочисленный пример пока вакантен (будет 2 int 1 float).

Да, господа, неплохо бы подсказать, где я могу найти хорошие C исходники по вашим предложениям. Оба ассемблерных кода - код для ia-64 и для x86 должны быть списаны с одного сишного исходника, одного алгоритма. В принципе можно соревноваться и с cl.exe для x86.

Еще момент: Зависимости по даным могут быть не только между разными итерациями. Итаниум прекрасно устраняет и "мелкие" зависимости, например несколько последовательных вычислений в теле цикла. Более того - его преимущество именно здесь. А если например такого кода много, это уже серьезная задержка для обычного процессора - он может надеяться только на свой суперконвейер. На Итаниуме даже самое тупое вычисление типа ip checksum уже может быть сильно распараллелено. Но хочется конечно содержательные примеры которые что-то делают, потому я не полагаюсь на себя самого.

Очень прошу какие-нибудь ссылки на исходники. Заранее признателен.


Дата: Дек 8, 2003 22:55:05 · Поправил: Sm_Andrei

Valery
Я тут того зае-ил(сделал) две программульки:линейные
уравнения и нейросети. За быстродествие не ручаюсь.
Только я забацал 16 битные, а там можно в 32 и 64 бита
перекинуть. Кстати часто тестируют производительность
проца вот еще чем - нахождение простых чисел
методом "Решето Эратосфена". В Гугле я много ссылок
нашел по этому поводу, вот несколько(есть готовые проги):
ab-lib.narod.ru/butko/src001.htm
pascal.sources.ru/articles/gtriangt3.htm

1406030273__Sistema_Neiro.rar


Дата: Дек 8, 2003 23:15:29

Sm_Andrei


ОГРРРОМНЕЙШЕЕЕ СПАСИБО ТЕБЕ!

В ближайшее время портну ну и тут же объявлю что выходит.


Дата: Дек 9, 2003 08:28:29 · Поправил: Sm_Andrei

Извиняйте, это сообщение не получилось.


Дата: Дек 9, 2003 08:30:46

Valery
Совсем забыл, вот что еще есть:
- поиск пути
- построение лабиринта
- вычисление CRC
Это точно должно подойти. Откуда переписал исходники не
помню. Ну вроде все.


_1773843544__Algorithm.rar


Дата: Дек 9, 2003 09:58:05

Sm_Andrei


Кажется, я в сырцовом раю...

Спасибо!

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


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