Member
Статус: Не в сети Регистрация: 31.01.2004 Откуда: moskow
Цитата:
Классической задачей, которая решается методом перебора с отходом назад считается задача о восьми ферзях: требуется перечислить все способы расстановки 8-ми ферзей на шахматной доске 8 на 8, при которых они не бьют друг друга. Эту задачу решил больше 200 лет тому назад великий математик Леонард Эйлер. Заметьте, что у него не было компьютера, но тем не менее он абсолютно верно нашел все 92 таких расстановки!
...Так как современные процессоры очень быстры я изменил размерность доски (15х15) и количество ферзей (15) соответственно, ну получилось что то отдаленно напоминающее SuperPi...
Скачать можно сдесь: http://cp.people.overclockers.ru/cgi-bi ... Queens.rar Исходный КОД:
Код:
const N=15; type Index=1..N; Rasstanovka=array [Index] of 0..N; var Form1: TForm1; X:Rasstanovka; Count:word; time1,time2,time:integer; implementation
{$R *.dfm} function P(var X:Rasstanovka;k,y:Index):boolean; var i:Index; begin i:=1; while (i<k)and(y<>X[i])and(abs(k-i)<>abs(y-X[i])) do inc(i); P:=i=k end;
procedure Backtracking(k:Index); var i,y:Index; begin for y:=1 to N do if P(X,k,y) then begin X[k]:=y; if k=N then begin {for i:=1 to N do write(X[i]);writeln;} inc(Count); if (count mod 10000=0) then form1.label4.Caption:='Loop: '+inttostr(Count div 10000); application.ProcessMessages; end; Backtracking(k+1); end end;
Кто сможет оптимизировать программу по СКОРОСТИ, на любом языке, можно
добавив МНОГОПОТОЧНОСТЬ...Результаты будут проверяться на Двух процессорной м.б. на Xeon'ах 3,2Ghz которые очень похожи на П4...
Member
Статус: Не в сети Регистрация: 31.01.2004 Откуда: moskow
RootБилли Бонс это все конечно зашибись (убрать аутпут, Баг ... кстати и просто Integer - хватает), но нужно какую-нибудь реальную ОПТИМИЗАЦИЮ, "ускорение в разы".
Добавлено спустя 1 минуту, 33 секунды Аутпут
Код:
if (count mod 10000=0) then form1.label4.Caption:='Loop: '+inttostr(Count div 10000); application.ProcessMessages;
Для того, что бы никто не подумал, что все зависло... -)
Как думаете, "СИЕ" распараллелить можно? Или еще ЧЕ? Добавлено спустя 53 минуты, 3 секунды Кстати, если COUNT сделать extended и убить АУТПУТ, то вроде выигрывается АЖ 3 сек.
(наверное одновременно работает FPU и Основной код)
Advanced member
Статус: Не в сети Регистрация: 30.08.2003 Откуда: Санкт-Петербург
Locki скорее я поверю, что Сишный компилер генерирует просто ГРАМОТНО оптимизированный код на уровне асма, чем дельфовый, нежели эти алгоритмы кардинально различаются. Просили оптимизацию? Просили - вот, пожалуйста. Как минимум предлагаю перейти на Microsoft C++ compiler, а в идеале вообще на Intel C++ Compiler... Можно выиграть еще пару сек
Цитата:
Как думаете, "СИЕ" распараллелить можно?
распараллелить? Выглядеть это будет слишком искуственно, но попытаться можно (скажем, ПЕРВОГО ферзя ставить в первом потоке не в точку A, а во втором в B, а потом потихоньку двигаться дальше)
_________________ {:€ дед в законе :-) нородный окодемег почетный пользователь OpenSuSE 11.3 Ремонт и модернизация ноутбуков IBM (Lenovo) ThinkPad
Advanced member
Статус: Не в сети Регистрация: 09.03.2004 Откуда: Кишинёв
Locki Я тут поигрался малость. Получилось вот что твоя прога считает 158 сек на моей системе, а моя за 58 . Но это первая неоптимизированная версия. Щас проведу оптимизацию( ) и жду серьёзного(надеюсь) увеличения скорости. Минус моего подхода - неуниверсальность. Я без рекурсии делал - страшно, но быстро. Да и вроде распаралелить мой способ можно легко, но у меня нет двух ядер, поэтому не пытаюсь. Добавлено спустя 1 час, 11 минут, 26 секунд В общем вот: http://cp.people.overclockers.ru/cgi-bi ... queens.rar на моём конфиге(дурон2000) расчитывает в среднем за 28 секунд (15х15). Но видоизменить его до любого колличества можно не вдаваясь в суть. Основная идея: я сразу расставляю правильно ферзей - этим достигается существенная экономия, но ввиду слишком большого колличества действий часть преимущества теряется, но остаётся тоже не плохо . Основную часть времени забирают вызовы memcpy. По идее можно ещё чутарь оптимизировать, но мне уже влом . А распаралелить такой код очень легко: достаточно разделить первый цикл на две половинки и запустить каждую в своём потоке(камне). Единственное что массивы mas и tmas для каждого потока должны быть свои. Добавлено спустя 5 минут, 14 секунд да чють не забыл: Visual C 2003
Advanced member
Статус: Не в сети Регистрация: 09.03.2004 Откуда: Кишинёв
Вот новая версия: http://cp.people.overclockers.ru/cgi-bi ... ueens2.rar По совету Root заюзал макросы. Стало красивее на вид, но на код cи уже ничерта не похоже - прямо бэйсик какой-то получился . Так же заменил вызовы memcpy своими циклами, что дало нехилую прибавку в скорости. Теперь на моём конфиге для N=15 расчитывается за 20 секунд. Для N=16 за 120 секунд.
Root писал(а):
т.к. эти i будут локальны для каждого for. а там уже придумать способ упростить код сам найдется
долго всматривался, ничего не понял - они же будут мешать друг другу по идее? Но замакросить и так получилось .
зы: в процессе настройки был ещё один вариант на процентов 10 быстрее, но он был утерян - так и не смог востановить.
Advanced member
Статус: Не в сети Регистрация: 09.03.2004 Откуда: Кишинёв
Вот готов третий вариант: http://cp.people.overclockers.ru/cgi-bi ... ueens3.rar Теперь работаю в массиве с битами. Из-за использования unsigned short ограничиваемся только N=16(по ссылке скомпилено для N=15). Скорость увеличилась ещё в два раза. Заметил такую особенность домашний дюрон2000Мц(166х12+память синхронно) и на работе А643000+ на нф4ультра без разгона: результат одинаковый . А вот знакомый попробовал на целере3000 и результат получается такой: версия2 даёт 74 секунды, а новая(3) 64 сек. Т.е. прирост незначительный, а у меня чётко двукратный прирост. Вот такие вот пироги.
Member
Статус: Не в сети Регистрация: 31.01.2004 Откуда: moskow
Да, вот, что значит правильно подойти к вопросу,mein , поздравляю...
у меня на П3 866:
моя -324сек
твоя первая 79сек
твоя третья 27сек!
Я думаю вряд ли кто сделает быстрее...
Member
Статус: Не в сети Регистрация: 31.01.2004 Откуда: moskow
Тогда сделай еще интерфейс и ввод количества ферзей от 8 до ... (у меня 255) для красоты типа того http://cp.people.overclockers.ru/cgi-bi ... Queens.rar Добавлено спустя 2 минуты, 12 секунд кстати по мне на асме условия программировать -это жопа, легче застрелиться....
Advanced member
Статус: Не в сети Регистрация: 09.03.2004 Откуда: Кишинёв
Locki писал(а):
Тогда сделай еще интерфейс и ввод количества ферзей от 8 до ... (у меня 255)
Интерфейс прибабахать не проблема, а вот с изменением колличества сложнее. Я могу доработать макрос таким образом чтобы было просто менять N и получать результат, но скорость из-за этого падает раза в полтора(из-за лишних проверок). Иначе нужно делать свою функцию на каждый N(отличия будут минимальны). Щас у меня из-за того что использую 16-битную переменную для хранения одного ряда N ограничивается 16-ю. Можно конечно расширить до int'а (до 32 получится), но это повлечё незначительное падение скорости(может быть сделаю). А по сути так больше 20 не имеет смысла делать, т.к. даже оптимизированный алгоритм будет давать плачевные результаты.
Locki писал(а):
кстати по мне на асме условия программировать -это [censored], легче застрелиться...
Я имел ввиду только вставки, никогда этим не занимался, но ведь надо же когда-то начинать .
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения