Основные принципы генератора ходов (Bitboard и 0x88)

Тема в разделе "Машинное отделение", создана пользователем Chemer, 30 ноя 2006.

  1. ProstoTak Старожил

    • Ветеран
    • Старожил
    Рег.:
    12.02.2006
    Сообщения:
    5.479
    Симпатии:
    123
    Репутация:
    1
    Оффлайн
    Shark, у меня вопрос про SSE2. Каковы результаты тестов версии без SSE2 по сравнению с версией с SSE2 на твоём компе?
  2. Shark Учаcтник

    • Участник
    Рег.:
    30.06.2007
    Сообщения:
    124
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Барнаул
    Оффлайн
    Разницы - не заметил, все в пределах погрешности.
    Хотя в коде видел копирование порциями по 8байт [quad word] через mmx регистер.
  3. bankuss Александр

    • Заслуженный
    • Участник
    • Старожил
    Рег.:
    24.05.2006
    Сообщения:
    1.084
    Симпатии:
    38
    Репутация:
    6
    Оффлайн
    sse2 в принципе не должно влиять на скорость. это потоковые команды для мультимедиа.
  4. Shark Учаcтник

    • Участник
    Рег.:
    30.06.2007
    Сообщения:
    124
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Барнаул
    Оффлайн
    Возможной мой код не совсем разборчив, и неправильно понят, Моя идея заключается не в оптимизации функции IsUnderCheck() , а в том чтоб ее вообще практически не вызывать, только в самых подозрительных случаях :)
  5. ProstoTak Старожил

    • Ветеран
    • Старожил
    Рег.:
    12.02.2006
    Сообщения:
    5.479
    Симпатии:
    123
    Репутация:
    1
    Оффлайн
    Смысл моего IsRentgenWK тоже в этом. Если король не под рентгеном то ход любой фигуры кроме самого короля можно не проверять на шах от дальнобойных фигур.
  6. WinPooh В.М.

    • Команда форума
    Рег.:
    13.02.2006
    Сообщения:
    9.491
    Симпатии:
    3.118
    Репутация:
    95
    Адрес:
    Москва
    Оффлайн
    ...и хранить там соответствующую дельту, для пошагового перемещения от одного поля к другому
  7. Shark Учаcтник

    • Участник
    Рег.:
    30.06.2007
    Сообщения:
    124
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Барнаул
    Оффлайн
    Остается вам померить скорость без валидации у себя, и сравнить данные с моими.
    Тогда будет понятно насколько эффективная валидация получилась у Вас.
    Напомню у меня 11.19 и 14.48, и результат = 23% на валидацию.
    Все это имеет смысл, конечно для MailSlot движков.

    PS.
    И пусть рубит короля, и немного глючит с его ходами, для наших замеров это не принципиально.
  8. Shark Учаcтник

    • Участник
    Рег.:
    30.06.2007
    Сообщения:
    124
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Барнаул
    Оффлайн
    Уже похоже. :)
    У меня хранится и возможность убрать шах и возможность получить шах, отдельно, и собственно направление линии. А начинал тоже с boolean значения, но это дало только половину экономии.
  9. bankuss Александр

    • Заслуженный
    • Участник
    • Старожил
    Рег.:
    24.05.2006
    Сообщения:
    1.084
    Симпатии:
    38
    Репутация:
    6
    Оффлайн
    хм...интересно...если на рабочем П4-3000 тест performance_s.exe Shark`a был быстрей моего, то на домашнем коре2дуо - на равных. а всего лишь разные процы! т.е. мой алгоритм лучше живет на коротко-конвеертых процах.
    кстати результат - perft 6 = 9.6 сек. Shark`a, у моего 8,9 сек.
    забавно! :/
  10. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Ну и? Привел ход к вскрытому шаху, не проверили легальность, ответом соперник съел короля, поняли что ход нелегален. Не вижу никаких проблем.
  11. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Пусть
    время генерации ходов / Время проверки на легальность = K
    Тогда выгодно отказаться от проверки на легальность когда
    Общее число ходов / Число нелегальных ходов > K
    Это соотношение больше К, но в любом случае нам нужно делать проверку на шах (Для продления на шахах) И так как в позициях где король под шахом нелегальных ходов много, то в ответ на шах либо сразу генерируем только легальные ходы (генератор легальных ходов), либо делаем проверку на легальность после исполнения хода. (у меня в ответ на шах запускается генератор легальных ходов, так как есть продление на единственном ответе на шах)
    В быстродействии выигрываем в любом случае, правда выигрыш весьма мал. Ну и немного усложняется код.
  12. ProstoTak Старожил

    • Ветеран
    • Старожил
    Рег.:
    12.02.2006
    Сообщения:
    5.479
    Симпатии:
    123
    Репутация:
    1
    Оффлайн
    Тесты на домашнем компе (950 целерон) показали

    WildCat 32 секунды
    Shark 34 секунды
    Мой генератор 35 секунд

    НАРОД, ПОСОВЕТУЙТЕ КАК 4 СЕКУНДЫ СКОСТИТЬ ЧТОБЫ КОШАКА ОБОГНАТЬ :D
  13. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Обясни, зачем? У тебя и так уже скорость генератора на общей производительности практически не скажется.
  14. ProstoTak Старожил

    • Ветеран
    • Старожил
    Рег.:
    12.02.2006
    Сообщения:
    5.479
    Симпатии:
    123
    Репутация:
    1
    Оффлайн
    Как зачем??? Я обещал Кoшаку задницу надрать - значит надо надрать :lol:
  15. bankuss Александр

    • Заслуженный
    • Участник
    • Старожил
    Рег.:
    24.05.2006
    Сообщения:
    1.084
    Симпатии:
    38
    Репутация:
    6
    Оффлайн
    это в 0х88 используется? или и при других представлениях имеет смысл?
  16. Shark Учаcтник

    • Участник
    Рег.:
    30.06.2007
    Сообщения:
    124
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Барнаул
    Оффлайн
    Ну если вопрос в соревновании с WildCat, то я сбросил еще пару секунд.
    Теперь должно быть быстрее Кошки. :) [изменение 14.48 -> 12.41 ]
    http://dev.enterra-inc.com/perft/performance_new.exe
  17. Shark Учаcтник

    • Участник
    Рег.:
    30.06.2007
    Сообщения:
    124
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Барнаул
    Оффлайн
    По следам всех моих экспериментов могу сказать, что современные процессоры весьма нетривиально откликаются на все изменения. :)
    Например, убираешь 2ва присваивания, а время работы не уменьшается а возрастает!!
    Или вот еще, попробовал заменить используемый у меня 64битный счетчик - 32битным. Саму генерацию - не трогал. В результате время без валидации - уменьшилось, а время с валидацией - возросло. [Это точно не погрешность измерения, разница весьма существенна и постоянна на всех запусках]
    Где логика? спрашивается :)
  18. ProstoTak Старожил

    • Ветеран
    • Старожил
    Рег.:
    12.02.2006
    Сообщения:
    5.479
    Симпатии:
    123
    Репутация:
    1
    Оффлайн
    Задачу минимум (надрать Кошаку задницу) я тоже выполнил. А вот насчёт Акулы не уверен. Вечером протестирую последнюю свою версию и выложу результаты.
  19. Shark Учаcтник

    • Участник
    Рег.:
    30.06.2007
    Сообщения:
    124
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Барнаул
    Оффлайн
    Интересно, какой perft(6) у Стрелки?
    Можно было бы добавить такую команду в новую версию движка (если Юрий Осипов читает эту ветку.)
  20. ProstoTak Старожил

    • Ветеран
    • Старожил
    Рег.:
    12.02.2006
    Сообщения:
    5.479
    Симпатии:
    123
    Репутация:
    1
    Оффлайн
  21. WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    У меня генератор присваивает оценки всем ходам, а функции выполнения обновляют много чего не относящегося к perft. Так что глупо пока со мной соревноваться. Вы сначала движок сделайте, а потом уже соревнуйтесь.
    А так у меня тоже есть версия perft процентов на 25 быстрее.
  22. Shark Учаcтник

    • Участник
    Рег.:
    30.06.2007
    Сообщения:
    124
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Барнаул
    Оффлайн
    Да, следует признать, что в реальных программах, do/undo move срастаются с инкрементальной оценкой позиции.
    Единственное что остается это сделать perft(6), но с оценкой каждой позиции (не только конечных).
    Ну и назовем его скажем perfv(6). Эта скорость уже будет близка к скорости перебора узлов.

    По себе могу сказать что моя оценочная функция пока в зародыше. (Материл, Положение фигур, пешки) нет мобильности и king safe пока. Вычисление хеша для позиции в do/undo move проводятся.

    при perft(6) = 12.4, perfv(6)=19.2
    что-то около 6млн узлов в сек.

    Дальше будет медленнее :)

    А соревноваться считаю, нужно. Это неплохо стимуллирует фантазию. Я вот генератор в 4 раза ускорил, а ведь даже не собирался :). Может кого еще вдохновит.
  23. Shark Учаcтник

    • Участник
    Рег.:
    30.06.2007
    Сообщения:
    124
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Барнаул
    Оффлайн
    Видимо твой генератор тоже лучше работает на процессорах с коротким конвеером.
    На моем рабочем компе Pentium 4-3Gz:
    Shark: 12.20
    ProstoTak: 14.53
    WildCat: 13.7

    Получается соревновательный движок, надо оптимизировать под тот процессор, на котором он будет играть.
  24. ProstoTak Старожил

    • Ветеран
    • Старожил
    Рег.:
    12.02.2006
    Сообщения:
    5.479
    Симпатии:
    123
    Репутация:
    1
    Оффлайн
    Так давай сюда его. У меня будет стимул надрать и ему задницу. :D
  25. ProstoTak Старожил

    • Ветеран
    • Старожил
    Рег.:
    12.02.2006
    Сообщения:
    5.479
    Симпатии:
    123
    Репутация:
    1
    Оффлайн
    Shark, по поводу оценочных функций. Я считаю что это отдельный этап. И ускорение генератора ходов, как такового, полезно само по себе и у меня есть ещё пара идей по ускорению именно генератора. А оценочную функцию можно наворотить такую что одна позиция будет 1 секунду оцениваться. :)
  26. WinPooh В.М.

    • Команда форума
    Рег.:
    13.02.2006
    Сообщения:
    9.491
    Симпатии:
    3.118
    Репутация:
    95
    Адрес:
    Москва
    Оффлайн
    А что такого можно в инкрементальную функцию оценки запихать, кроме материала? Даже оценка по psq-таблицам, и та - от стадии партии может зависеть, её обновлять при каждом ходе не очень эффективно будет.
  27. Shark Учаcтник

    • Участник
    Рег.:
    30.06.2007
    Сообщения:
    124
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Барнаул
    Оффлайн
    Ну добавь стадию партии как размерность в psq-таблице, а стадию - храни в Undo информации для хода.
    У меня так же есть идея как инкрементально считать мобильность фигур, А это у меня самая трудоемкая операция в оценке получается.

    PS. Может новую тему про инкрементальную оценку заведем?
  28. ChessTerminator75 Андрей

    • Участник
    Рег.:
    22.05.2007
    Сообщения:
    121
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Челябинск
    Оффлайн
    Интересно услышать мнение специалистов.

    В во всех современных программах генерятся списки ходов или есть реализации без списков?
    Например может можно в битбоард генераторах генерировать сразу позиции?
    Другими словами строить дерево перебора посредством позиций а не списков.
    Кстати а может дерево перебора можно строить еще как нибудь?
  29. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    В хороших программах используются Эвристики для сортировки ходов, которым необходимо знать сам ход а не получившуюся позицию. Это киллеры, сортировка по истории. Так же при записи в хеш достаточно накладно писать получившуюся позицию вместо лучшего хода.
  30. ChessTerminator75 Андрей

    • Участник
    Рег.:
    22.05.2007
    Сообщения:
    121
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Челябинск
    Оффлайн
    Звучит очень разумно.

    Получается что все известные программы используют списки?
    Даже те у которых битбоард генератор?
  31. дуп Учаcтник

    • Участник
    Рег.:
    11.09.2007
    Сообщения:
    113
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Великий Новгород
    Оффлайн
    Многие спецы, в т. ч. и Вы сами рекомендуют хранить ход в виде номера после вызова генератора, т.е. этот аргумент при такой схеме - несеръезный. Киллеров вот точно без отдельных ходов не сделаешь. Но я лично не думаю, что они при хорошей хеш-таблице имеют большое значение. Прибавку может быть и дают, но не принципиальную. А насчет списков при битбордах- генераторах, по -моему это тоже лишнее, ведь битборды - они сами по себе такие своеобразные списки.
    Я не спец, но вставить имею право.
  32. bankuss Александр

    • Заслуженный
    • Участник
    • Старожил
    Рег.:
    24.05.2006
    Сообщения:
    1.084
    Симпатии:
    38
    Репутация:
    6
    Оффлайн
    ChessTerminator75 в битборд генераторе реализовать саму генерацию ходов\взятий проще. ну и конечно детектор атак и шахов проще получается. к спискам ходов генератор имеет слабое отношение -т.е. генератор просто этот список заполняет и все (как и все другие генераторы). а без списков невозможно сделать сортировку и прочие полезности (продления\отсечения).
    какой же это список? :)
    u64 whitepawn =
    00000000
    00000000
    00000000
    00000000
    00001000
    00010000
    11100111
    00000000

    это просто 64 разрядное число с битами, обозначающими фигуры на доске (в данном примере-пешки)
  33. дуп Учаcтник

    • Участник
    Рег.:
    11.09.2007
    Сообщения:
    113
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Великий Новгород
    Оффлайн
    Ну и чего? Нормальный список белых пешек.
  34. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Собери статистику - на какой глубине, и в каких количествах в переборе встречаются позиции о которых в хеше нет никакой информации.
  35. bankuss Александр

    • Заслуженный
    • Участник
    • Старожил
    Рег.:
    24.05.2006
    Сообщения:
    1.084
    Симпатии:
    38
    Репутация:
    6
    Оффлайн
    дуп и чего здесь нормального? какую информацию кроме наличия\отсутствия этих самих пешек тут можно почерпнуть? :) списки куда более интересно устроены

Поделиться этой страницей