Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 53 • Страница 1 из 31  2  3  >
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

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;

procedure TForm1.Button1Click(Sender: TObject);
begin
   Count:=0;
   label2.Caption:='Total: 0 variants';
   label1.Caption:='Replacing '+inttostr(N)+' Queens'
   +'     Table '+inttostr(n)+'x'+inttostr(n);
   time1:=gettickcount;
   Backtracking(1);
   time2:=gettickcount;
   time:=time2-time1;
   label2.Caption:='Total: '+inttostr(Count)+' variants';
   form1.Panel1.Caption:='Elapsed time: '+floattostr(time /1000)+' sec';
end;


Кто сможет оптимизировать программу по СКОРОСТИ, на любом языке, можно
добавив МНОГОПОТОЧНОСТЬ...Результаты будут проверяться на Двух процессорной м.б. на Xeon'ах 3,2Ghz которые очень похожи на П4...



Партнер
 

Advanced member
Статус: Не в сети
Регистрация: 30.08.2003
Откуда: Санкт-Петербург
Locki
вариант с http://forums.realcoding.net/lofiversio ... 10632.html (в первом посте) работает при переделке на 15 ферзей на полминуты быстрее твоего дельфого варианта...
но я еще и output прибил :haha:

_________________
{:€ дед в законе :-) нородный окодемег
почетный пользователь OpenSuSE 11.3
Ремонт и модернизация ноутбуков IBM (Lenovo) ThinkPad


 

Member
Статус: Не в сети
Регистрация: 24.12.2005
Кстати, для 15 ферзей количество вариантов 2279184, а не 50960. Count : longint, а не word, однако. :)


 

Advanced member
Статус: Не в сети
Регистрация: 30.08.2003
Откуда: Санкт-Петербург
Билли Бонс
ага! :beer: А я и просмотрел багу.
по моей ссылке, кстати, пишет правильно - 2279184

_________________
{:€ дед в законе :-) нородный окодемег
почетный пользователь OpenSuSE 11.3
Ремонт и модернизация ноутбуков IBM (Lenovo) ThinkPad


 

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... Можно выиграть еще пару сек :D
Цитата:
Как думаете, "СИЕ" распараллелить можно?

распараллелить? Выглядеть это будет слишком искуственно, но попытаться можно (скажем, ПЕРВОГО ферзя ставить в первом потоке не в точку A, а во втором в B, а потом потихоньку двигаться дальше)

_________________
{:€ дед в законе :-) нородный окодемег
почетный пользователь OpenSuSE 11.3
Ремонт и модернизация ноутбуков IBM (Lenovo) ThinkPad


 

Member
Статус: Не в сети
Регистрация: 31.01.2004
Откуда: moskow
Root выложи ссылку на скомпилированный на С++ ехе"шник , погонять, и если можно две ОБЫЧНЫЙ и Интеловский компилятор...


 

Advanced member
Статус: Не в сети
Регистрация: 09.03.2004
Откуда: Кишинёв
Locki
Я тут поигрался малость. Получилось вот что твоя прога считает 158 сек на моей системе, а моя за 58 :) . Но это первая неоптимизированная версия. Щас проведу оптимизацию( :hitrost: ) и жду серьёзного(надеюсь) увеличения скорости. Минус моего подхода - неуниверсальность. Я без рекурсии делал - страшно, но быстро. Да и вроде распаралелить мой способ можно легко, но у меня нет двух ядер, поэтому не пытаюсь.
Добавлено спустя 1 час, 11 минут, 26 секунд
В общем вот: http://cp.people.overclockers.ru/cgi-bi ... queens.rar
на моём конфиге(дурон2000) расчитывает в среднем за 28 секунд (15х15). Но видоизменить его до любого колличества можно не вдаваясь в суть. Основная идея: я сразу расставляю правильно ферзей - этим достигается существенная экономия, но ввиду слишком большого колличества действий часть преимущества теряется, но остаётся тоже не плохо :D . Основную часть времени забирают вызовы memcpy. По идее можно ещё чутарь оптимизировать, но мне уже влом :) . А распаралелить такой код очень легко: достаточно разделить первый цикл на две половинки и запустить каждую в своём потоке(камне). Единственное что массивы mas и tmas для каждого потока должны быть свои.
Добавлено спустя 5 минут, 14 секунд
да чють не забыл: Visual C 2003


 

Advanced member
Статус: Не в сети
Регистрация: 30.08.2003
Откуда: Санкт-Петербург
mein
ну, хотя бы макрос заюзали бы для уменьшения размера исходника... или рекурсию. а то код выглядит моСЧно! :D Восемь раз почти одно и тоже :D

и еще хинт:
Код:
for(int i0=0;i0<N;i0++){ // &#8801; &#931; 1
.....
for(int i1=0;i1<N;i1++) if(mas[1][i1]==0){ // &#8801; &#931; 2
....

можно написать проще
Код:
for(int i=0;i<N;i++){ // &#8801; &#931; 1
.....
for(int i=0;i<N;i++) if(mas[1][i]==0){ // &#8801; &#931; 2
....

т.к. эти i будут локальны для каждого for. а там уже придумать способ упростить код сам найдется ;)

гы. у меня скорость навскидку:
вариант Locki и мой - 4минуты!
вариант mein -
Цитата:
count=2279184 , time = 54.95 sec


Еще хинт: можно оптимизировать функцию memcpy, написав свой вариант....

_________________
{:€ дед в законе :-) нородный окодемег
почетный пользователь OpenSuSE 11.3
Ремонт и модернизация ноутбуков IBM (Lenovo) ThinkPad


 

Member
Статус: Не в сети
Регистрация: 14.10.2005
Откуда: РОССИЯ
X2@2702MHz
вариант Locki:94.579sec
вариант mein:15.30sec


 

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
Статус: Не в сети
Регистрация: 30.08.2003
Откуда: Санкт-Петербург
mein
Цитата:
долго всматривался, ничего не понял - они же будут мешать друг другу по идее? Но замакросить и так получилось .

в коде
Код:
какая_то_функция.
{
  int i=0;
  {
     int i=1;
     printf("%i", i); //здесь напечатается 1
  }
  printf("%i", i); //а здесь напечатается 0
}

void x(int y)
{
  y=0;
}

void z(void)
{
  int f=1;
  x(f); // изменится ли f? а вот фиг - т.к. y локален для функции x.
}

в общем, тут надо делать RTFM учебнику по сям (в разделе названном "область определения" или вроде того)..
Цитата:
count=2279184 , time = 29.03 sec

гы. 2-кратный прирост скорости :D

_________________
{:€ дед в законе :-) нородный окодемег
почетный пользователь OpenSuSE 11.3
Ремонт и модернизация ноутбуков IBM (Lenovo) ThinkPad


 

Member
Статус: Не в сети
Регистрация: 14.10.2005
Откуда: РОССИЯ
X2@2702MHz
вариант2 Locki: 94.579sec
вариант1 mein: 15.30sec
вариант2 mein: 13.05sec


 

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 сек. Т.е. прирост незначительный, а у меня чётко двукратный прирост. Вот такие вот пироги.


 

Advanced member
Статус: Не в сети
Регистрация: 30.08.2003
Откуда: Санкт-Петербург
Цитата:
count=2279184 , time = 18.38 sec

еще десяток секунды выжали :)))

_________________
{:€ дед в законе :-) нородный окодемег
почетный пользователь OpenSuSE 11.3
Ремонт и модернизация ноутбуков IBM (Lenovo) ThinkPad


 

Member
Статус: Не в сети
Регистрация: 31.01.2004
Откуда: moskow
Да, вот, что значит правильно подойти к вопросу,mein , поздравляю...
у меня на П3 866:
моя -324сек
твоя первая 79сек
твоя третья 27сек!
Я думаю вряд ли кто сделает быстрее...


 

Advanced member
Статус: Не в сети
Регистрация: 09.03.2004
Откуда: Кишинёв
Locki писал(а):
Я думаю вряд ли кто сделает быстрее...

Я сделаю :wink: . Есть идеи, нужно немного времени, а ведь ещё до ассемблера не дотянулись ... Постараюсь завтра ускорить.


 

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], легче застрелиться...

Я имел ввиду только вставки, никогда этим не занимался, но ведь надо же когда-то начинать :hitrost: .


 

Advanced member
Статус: Не в сети
Регистрация: 30.08.2003
Откуда: Санкт-Петербург
mein
да рекурсию надо юзать ))))

_________________
{:€ дед в законе :-) нородный окодемег
почетный пользователь OpenSuSE 11.3
Ремонт и модернизация ноутбуков IBM (Lenovo) ThinkPad


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 53 • Страница 1 из 31  2  3  >
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan