|
|
| Посл.отвђт | Сообщен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 Кажется, я в сырцовом раю... Спасибо! |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.073 |