Jak @ 28.04.23читай выше я там добавил, перегрузи страницу
Я читал это ещё до написания... Все кто с cuda встречаются первые разы одно и то же пишут, про лопату и рабочих которые таскают пустые мешки
К сожалению все так и есть, микрокод один и если у нас есть условный оператор if else
То потоки которые условие не выполняют будут ждать пока выполнятся потоки у которых условие выполняется на их данных , потом потоки выполнят условие else а те которые выполнили будут простаивать .... Такова плата за тысячи потоков
В остальном же рекурсивные алгоритмы идеально ложатся под вычисления cuda...
Выпрямлять алгоритм надо, избегать ветвлений if else
Рекурсия запрещена
на CUDA писать не могу, карта AMD, потому пишу на OPENCL
я щас примерно посчитал, у меня впустую работают примерно 60-70% ядер, надо их просто не запускать с пустыми данными.
Jak @ 28.04.23Рекурсия запрещена
Ну поэтому и выпрямлять надо алгоритм
Грубо говоря в пять форов:
For step1
For step2
For step 3
For step4
bingo check royalty
Calc ev
Calc ev
......
Jak @ 28.04.23OPENCL
Да та же рожа, вид сбоку
Пс ну вы ваще если честно, занялись gpu и тут не отписались, я бы подготовился получше... Эх , этот вот советско-российский менталитет , сидеть в каморке , кодить... В одиночку...
Так и делаю. Но частота каждого ядра меньше и многие работают впустую.
Эти все циклы каждое ядро будет считать кучу времени. Надо разбить на миллионы маленьких. Тогда будет быстро.
Jak @ 28.04.23частота каждого ядра меньше и многие работают впустую.
Чиво?
Ну все же не так работает как вы думаете, там гпу и дубляторы
Ну типо ячейки вычислительные одинаковые но со своими регистрами
Этакие fpu модельки для вычислений... Код крутиться один и каждый модуль может пользоваться своими регистрами , обращаясь к своей памяти там в массиве
Тормозит скорее всего из-за обращений к памяти, которая устроена у вас плохо , там кеш быстрый а сама vram ddr5-6 тормозная
Запустите профилер какой нибудь, скорее всего я имхо прав
Профилер покажет большие траты на обращение к памяти vram
Вам надо все элементы массивов поместить в private memory , все что влезет
Все что попадает в приватную либо кешится либо в регистры пихуется... А это сверх быстро, если влезет HR5 то будет бинго х1000, если HR5 не влезет то придется смириться с x50-100
А эти миллионы маленьких циклов будут запускаться не синхронно, а как кому удобно, значит их еще надо синхронизировать в нужном порядке, что-то раньше, что-то потом после подсчета. Чтобы посчитанные данные не пропали.
Jak, ой не не не не это утопия, у нас есть иерархия в алгоритме, что когда посчитать надо и куда сохранить , какие миллионы параллельных потоков дядь ...
Пока еще не научился запускать другие kernel из основного kernel. Ругается постоянно.
Ты прям руководитель проекта.
Из-за слабости мощностей и несовершенства алгоритма, мы считаем ЕВ таким образом:
Кладем две карты, считаем роялти этого момента для всех пар карт спускаясь вниз по дереву, потом возвращаемся, перебираем все тройки и выбираем для каждой из трех пар лучшую.
НО!
Когда мы считаем роялти для 2 карт, мы не берем в расчет, что третья карта у нас будет в сносе и не должна участвовать в дальнейших расчетах. Она у нас как бы в колоде. Ведь по правилам ананаса, нам дают три карты.
Вопрос: на сколько влияет эта третья карта на дальнейшие расчеты? Ладно если она пустышка, а если она тоже нам нужна? Она наш нужный аут. Мы должны ее выкинуть, а мы ее опять в колоду замешали. И она опять может нам прийти.
При последнем подъеме, когда имеем 11 карт. Тут все легко, перебираем все пары и наш метод верный. Можем все перебрать. И все совпадает.
Когда имеем 9 карт. Вот тут уже есть расхождения. В разных вариантах, в зависимости от наличия флешей и аутов, ошибка в роялти 0,1-0,3 куша.
Когда имеем 7 карт, будет 2 уровня с приблизительными расчетами. Вот тут ошибка уже может достигать 10%. При роялти 5 ошибка 0,3-0,4 куша. Меньше 0,2 куша не бывает.
Для 7 карт считает от 20 до 300 сек в разных вариантах линий.
Не говорю уже про стартер в 5 карт. Можно посчитать точно для 5 карт, но время уже измеряется часами. Даже без флешей.
Причем роялти всегда растет при точном расчете по правилам игры.
Jak, не актуально для меня уже... Сорямба
Jak @ 09.05.23В разных вариантах, в зависимости от наличия флешей и аутов, ошибка в роялти 0,1-0,3 куша.
Когда имеем 7 карт, будет 2 уровня с приблизительными расчетами. Вот тут ошибка уже может достигать 10%. При роялти 5 ошибка 0,3-0,4 куша
Карт меньше в колоде, вот и растет евшка, насчет точности ... Ну ход то меняется ? Надо это смотреть и ошибки искать в этом направлении...
Не в ту сторону копаете имхо...
То что вы называете ошибкой, называется словом "расхождение" , оно логично потому что зафиксировав сброс вы играете уже в другую игру... С другими вероятностями прихода карт, с другим деревом у которого больше деталей... Такие вещи не сравниваются между собой...
Jak @ 09.05.23Можно посчитать точно для 5 карт, но время уже измеряется часами
Это вы ещё не считали "неточно" с учётом оппонента ) 1 стартер = 1 неделя кекв
пс на правах рекламы :
если кому-то нужно посчитать последнюю и предпоследнюю сдачу с учетом оппонента абсолютная точность, без всяких приближений то ... пишите в лс , ориентируйтесь на 300-500-800$ за солвер... такое решение покроет 90-95 % ваших вопросов по игре...
останутся стартера ... могу и по ним подсказать ...
если наберется 5+ заявок ... то возможно продакшн замучу ...
Jak, сорямба, вчера засыпал уже, может вы меня не поняли
Jak @ 09.05.23ошибка в роялти 0,1-0,3 куша.
Jak @ 09.05.23При роялти 5 ошибка 0,3-0,4 куша. Меньше 0,2 куша не бывает.
Я считаю что вы напрямую цифорки сравниваете алгоритмов, что в теории БОЛЬшая ошибка
Вы должны сравнивать таким образом:
1. Создаёте датасет тыч 100 раздач
2. Запускаете симуляцию игры двух этих алгоритмов на общем датасете:
А) решаете спот двумя алгоритмами
Б) играете его получая реальную разницу ев
Вот эти цифры вы вправе сравнивать...
Алгоритма1 vs алгоритма2 на общем датасете через симуляцию раздач
А другие цифры сравнивать нельзя, мат часть просто не позволяет этого делать
пс вообще вы смотрю из зоны комфортного программирования не любите выходить )))
по мне так лучше большими шагами ступать как можно дальше и глубже в болоте ...
чем маленькими шажками топтаться на асфальтной дорожке в парке...
Всего возможных датасетов для 1 игрока = С(52,17)= 21 945 588 357 420. Для троих игроков цифра вообще сумасшедшая.
Что такое 100к игр? 4,55*10^-7 % = 0,000000455% Это тупиковый путь. Что 100к игр, что 10к игр - это капля в море. Как можно на основе этой капли говорить обо всем океане?
Ну, запущу я на счет 2 разных алгоритма. Даже три - еще алгоритм, буду случайно класть и выкидывать карты.
Вдруг! А это может быть. Третий, случайный алгоритм соберет лучшее ЕВ, значит он наиболее правильный!
И вообще, что такое алгоритм игры? Просто класть карты - это легко. Надо оценить ЕВ каждого хода. А как это сделать без оценки позы? Разложить до конца и посмотреть ЕВ? У кого ЕВ больше, тот и молодец? Я думаю на большой дистанции ГСЧ тут победит. Пусть не каждый раз, но когда-то такое будет. Попадется такой датасет, где ГСЧ победит. Мы же берем всего миллионные доли процента из всех игр. Когда-то будет такой сет, что ГСЧ победит 100%.
В любой игре (шашки, шахматы, нарды, покер и тд) нужна функция, которая оценивает текущую позицию. Это основа любой игры.
На основании этой функции можно сделать вывод, вот этот ход лучший, он ведет к повышению ЕВ. Конечно желательно в оценочной функции принимать во внимание не только свои карты, но и карты всех игроков. И их расположение на линиях, тк они тоже влияют на общую оценку позы.
Ведь и человек так же играет, считает свои ауты, оценивает свои шансы на сбор лучших линий, оценивает шансы оппов на сбор линий, примерно считает ЕВ каждого хода. Но чел не может посчитать все вероятности точно, калькулятор слабоват. У компа тут сил побольше.
Но даже с мозгами компа китай сложно посчитать точно, вот мы и ищем упрощения для того, чтобы хоть как-то оценить позу.
Если бы игра была крестики-нолики 3х3, тогда можно ее легко посчитать. Там вариантов мало, можно все перебрать.
Остальные игры посчитать посложней.
Я и пишу такую оценочную функцию. И уже дальше, на основании этой функции можно придумывать алгоритм игры, сделать ход, оценить новую позу и сравнить оценку с другими ходами.
Текущая оценка с 2-мя картами была достаточно точной для оценки позиции. Пусть и упрощенной. До этого были варианты когда просто пытались как-то класть карты и смотреть, что будет в конце.
Оценка с 2мя картами вообще-то играет в другую игру. Не в ананас с тремя картами, а в китайский покер, когда приходят 2 карты и мы их раскладываем по линиям. Но даже эта погрешность нас удовлетворяла, тк была самая прогрессивная.
Т.к. эта оценка приблизительная, даже с полным перебором, я задал себе вопрос,
А если попробовать посчитать именно по три карты и как в реале из колоды выбрасывать снос? Сильно ли ошибочна наша оценка с двумя картами?
Учитывая все наработки появилась возможность посчитать по-точнее оценку в достаточно короткое время.
Когда-то был китай с одной картой. Его было легко посчитать. Я этим тоже занимался, но игры была медленной и скучной. Потом появился турбо-китай, по 4 карты давали и их нужно было класть все сразу. Игра ускорилась. Но тоже можно посчитать, тк инфа есть вся. А вот в ананасе появилась неопределенность, не понятно, что они выкинули, это дало интерес к игре.
Jak, вычитайте сообщение с помощью gpt 4 , много воды ...
Из вашего сообщения я понимаю, что вы обсуждаете использование алгоритмов для оценки позиции и принятия решений в играх, в том числе и в покере. Оценочная функция, которая учитывает текущую позицию, может помочь определить лучший ход, который повышает ожидаемую стоимость (EV) игры. В играх с небольшим числом возможных позиций, таких как крестики-нолики, можно перебрать все возможные варианты, чтобы определить лучший ход. Однако в более сложных играх, таких как покер, это уже невозможно, поэтому используются алгоритмы и эвристики для оценки позиции. Вы также упоминаете использование ГСЧ (генератора случайных чисел) в алгоритмах для игр, который может давать случайные результаты, но в целом на большой дистанции может выдать приемлемый результат. Однако, использование ГСЧ не всегда дает точный результат и не является единственным методом для принятия решений в играх.
дата сет это собранные раздачи или там, сгенерированные каким либо путем :
Вам же надо понять насколько алгоритм А лучше или хуже алгоритма Б ,
Если вы возьмете одну раздачу - это не показательная выборка ....
100к достаточно будет, ну проведите миллион ... это же все масштабируется изменением одной цифры :
for n = 1 to 100k -> 1kk
лучше задумайтесь как датасет сделать ... вообще в теории ?
вот это задача достойная ...
насчет шашек шахмат нардов это игры с полной информацией ...
покер игра с не полной информацией , не корректно сравнивать ...
Jak @ 10.05.23А если попробовать посчитать именно по три карты и как в реале из колоды выбрасывать снос? Сильно ли ошибочна наша оценка с двумя картами?
это не корректный вопрос , вопрос должен звучать так : "Измениться ли наша стратегия? И на сколько EV? "
Jak @ 10.05.23Учитывая все наработки появилась возможность посчитать по-точнее оценку в достаточно короткое время.
к сожалению наработки эти только ваши )
Jak @ 10.05.23Когда-то был китай с одной картой. Его было легко посчитать. Я этим тоже занимался, но игры была медленной и скучной. Потом появился турбо-китай, по 4 карты давали и их нужно было класть все сразу. Игра ускорилась. Но тоже можно посчитать, тк инфа есть вся. А вот в ананасе появилась неопределенность, не понятно, что они выкинули, это дало интерес к игре.
это вода хз че ответить , покер сложная игра , а академическое решение пока что достигли только в холдеме и то там тоже приближение, букетами группы рук схожих связывают и считают против них евшку , а потом правят стратегию чтобы в итоге сошлось к равновесию неша ...
Jak @ 10.05.23Я думаю на большой дистанции ГСЧ тут победит.
ой, тервер вам в руки , ну можно же сгенерировать полное дерево и пробежаться тем же алгоритмом 1 и алгоритмом 2 для сравнения по нему, не нужен тут никакой гсч
Я так понимаю алгоритм 2 это и есть полный пробег по дереву ...
так еще проще , берете и когда бежите по полному дереву параллельно пробегайте по дереву алгоритма 1 и смотрите где различия у вас ...
ну и сохраняете евшку ... EValg1 EValg2
PS что там с CUDA, получилось выжать ТераФлопсы из видюхи ?
Ты вроде вообще меня не слышишь.
У меня нет алгоритма. Ни 1, ни 2.
c00l0ne @ 10.05.23Вам же надо понять насколько алгоритм А лучше или хуже алгоритма Б ,
Если вы возьмете одну раздачу - это не показательная выборка ....
Я беру не одну, не 100к раздач, а ВСЕ! Все 100500 раздач.
Еще раз напишу - у меня нет алгоритма! Оценочная функция - это не алгоритм! Она не говорит куда надо положить какую карту. Она просто любой позиции, каждому набору карт на линиях дает какую-то циферку.
Jak @ 10.05.23Ты вроде вообще меня не слышишь.
У меня нет алгоритма. Ни 1, ни 2.
Я беру не одну, не 100к раздач, а ВСЕ! Все 100500 раздач.
Еще раз напишу - у меня нет алгоритма! Оценочная функция - это не алгоритм! Она не говорит куда надо положить какую карту. Она просто любой позиции, каждому набору карт на линиях дает какую-то циферку.
я уже кринжовать начинаю , дорогой товарищ
я Вас слышу , я Вам информацию говорю в конце тунеля ...
прислушайтесь йо:
Jak @ 10.05.23У меня нет алгоритма. Ни 1, ни 2.
они Есть у Вас :
1. двухкарточный
2. трехкарточный
Jak @ 10.05.23Я беру не одну, не 100к раздач, а ВСЕ! Все 100500 раздач.
об этом поподробней, что значит вы берете все раздачи ?
Все стартера , все их расклады , все первые ходы, все вторые ходы ?
Что это значит ? Все стартера нереально взять , сами понимаете займет годы ... при текущем уровне вычислений...
Первые ходы тоже , вторые третьи вы можете да посчитать своими алгоритмами ... но в конкретной раздаче, а ВСЕ ходы вторые третьи ?
Их очень много чтобы заявлять об этом ...
Jak @ 10.05.23Оценочная функция - это не алгоритм
это функция по которой алгоритм максимумов выберет вам ходы ...
разные функции = разные алгоритмы будут
приходим к тому что нам надо понять diffEV(Alg1, Alg2) =
берем какую нибудь выборку достаточно большую(датасет) и прогоняем на этих алгоритмах ... считаем EV ...
смотрим среднее на раздачу отклонение одного алгоритма от другого
получаем diffEV ну я думаю где то 0.1 куш будет на раздачу для последних сдач ...
Jak, пс если остались вопросы спрашивайте...
c00l0ne @ 10.05.23об этом поподробней, что значит вы берете все раздачи ?
Конечно не 100500 со стартера, а с текущего положения. Имеем 7-9 карт на линиях у нас + наш снос и 7-9 карт у оппов. С этого момента вглубь я перебираю ВСЕ варианты. Было, что брал по 2 карты на подъем (это в выложенной проге), а теперь попробовал брать по 3 карты.
c00l0ne @ 10.05.23это функция по которой алгоритм максимумов выберет вам ходы ...
разные функции = разные алгоритмы будут
а почему ты решил, что надо брать максимум? может надо брать 2-е или 3-е решение? Или их смесь в %%?
c00l0ne @ 10.05.23берем какую нибудь выборку достаточно большую(датасет) и прогоняем на этих алгоритмах ... считаем EV ...
смотрим среднее на раздачу отклонение одного алгоритма от другого
делал такое. брал набор колод и играл за всех игроков. Все по честному. Каждый знает только свои карты, снос других он не видит. Ну получил какое-то ЕВ и что? Есть эталон? Или брать 17 карт, раскладывать из них фанту и стремиться к ней? Во-1х это будет угадайка, а во-2х это будет резалториентед игра. Подгон под ответ.
Ведь вполне возможно, что глупый набор ходов приведет к макс результату.
ПС.
c00l0ne @ 10.05.23если остались вопросы спрашивайте...
вопросов нет. их и не было никогда.
читай выше я там добавил, перегрузи страницу