Честное время
От: Эйнсток Файр Мухосранск Странный реагент
Дата: 18.07.21 22:56
Оценка:
Как в дотнете организовать многопоточное приложение таким образом, чтобы нити, выполняющие расчёты за разных AI-игроков, получали одинаковое количество процессорных ресурсов в час (или в другой промежуток времени)?
Отредактировано 18.07.2021 22:56 Эйнсток Файр . Предыдущая версия .
Re: Честное время
От: VladCore  
Дата: 18.07.21 23:52
Оценка:
Здравствуйте, Эйнсток Файр, Вы писали:

ЭФ>Как в дотнете организовать многопоточное приложение таким образом, чтобы нити, выполняющие расчёты за разных AI-игроков, получали одинаковое количество процессорных ресурсов в час (или в другой промежуток времени)?


а точнее? ты можеш гарантировать что все нити стартанут одновременно, но если ты код потоков не контролируеш и код чужой то ты им время раз ве как то ограничиш? в линуксе есть cgroups и dotnet core умеет корректно их учитывать для системных метрик, но напрямую из managed кода ими управлять нельзя. и cgroups для процессов а не потоков.
Re[2]: Честное время
От: Эйнсток Файр Мухосранск Странный реагент
Дата: 19.07.21 00:02
Оценка:
VC> код потоков не контролируешь и код чужой то ты им время раз ве как то ограничишь?

Я могу наложить на код требования, такие как "не запускать новых потоков, новых процессов".
Выполнение требований проверять просмотром исходного кода на наличие ключевых слов.

Ну или уже сборку проверять на наличие вызовов (хотя это пока не представляю как сделать).

VC>> можешь гарантировать что все нити стартанут одновременно


Плюс-минус несколько секунд это некритично, поэтому да, могу.
Отредактировано 19.07.2021 0:06 Эйнсток Файр . Предыдущая версия . Еще …
Отредактировано 19.07.2021 0:05 Эйнсток Файр . Предыдущая версия .
Отредактировано 19.07.2021 0:04 Эйнсток Файр . Предыдущая версия .
Re: Честное время
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 19.07.21 00:49
Оценка: +1
Здравствуйте, Эйнсток Файр, Вы писали:

ЭФ>Как в дотнете организовать многопоточное приложение таким образом, чтобы нити, выполняющие расчёты за разных AI-игроков, получали одинаковое количество процессорных ресурсов в час (или в другой промежуток времени)?


А что, есть такая проблема? Ты уже точно уверен, что куму-то недодают времени?
Маньяк Робокряк колесит по городу
Re[2]: Честное время
От: Эйнсток Файр Мухосранск Странный реагент
Дата: 19.07.21 01:28
Оценка:
M> А что, есть такая проблема? Ты уже точно уверен, что куму-то недодают времени?

Я хочу иметь обоснование, что всем всё додают.
Например, если код асинхронный, и нити все из пула, то у меня нет уверенности, что разные AI получают одинаковое количество времени.
Re: Честное время
От: varenikAA  
Дата: 19.07.21 02:23
Оценка: -1
Здравствуйте, Эйнсток Файр, Вы писали:

ЭФ>Как в дотнете организовать многопоточное приложение таким образом, чтобы нити, выполняющие расчёты за разных AI-игроков, получали одинаковое количество процессорных ресурсов в час (или в другой промежуток времени)?


Если на винде, то можно попробовать файберы
https://blog.adamfurmanek.pl/videos-talks-papers-articles/async-with-coroutines-and-fibers-in-c/
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re: Честное время
От: elmal  
Дата: 19.07.21 05:53
Оценка: 2 (1) +5
Здравствуйте, Эйнсток Файр, Вы писали:

ЭФ>Как в дотнете организовать многопоточное приложение таким образом, чтобы нити, выполняющие расчёты за разных AI-игроков, получали одинаковое количество процессорных ресурсов в час (или в другой промежуток времени)?

А зачем тебе время? Тупо снимай иммутабельный слепок состояния, его передавай потокам, каждый worker ограничен не по времени, в по числу итераций. Когда все вокреры отработали — уже делай отрисовку. Соответственно тебе будет вообще пофиг, это однопроцессорная одноядерная машина или какой 100 ядерный монстр.
Re[2]: Честное время
От: Эйнсток Файр Мухосранск Странный реагент
Дата: 19.07.21 09:54
Оценка:
E> каждый worker ограничен не по времени, в по числу итераций.

Я ничего не понял. Что такое итерация? Ты мне предлагаешь делать виртуальный процессор и считать виртуальные инструкции вручную?
Просто представь, что алгоритмы AI разные, и работу за один условный ход они проделывают разную.
Re: Честное время
От: Буравчик Россия  
Дата: 19.07.21 10:03
Оценка:
Здравствуйте, Эйнсток Файр, Вы писали:

ЭФ>Как в дотнете организовать многопоточное приложение таким образом, чтобы нити, выполняющие расчёты за разных AI-игроков, получали одинаковое количество процессорных ресурсов в час (или в другой промежуток времени)?


Пусть появился игрок, который исчерпал лимит. Что с ним будешь делать?
Best regards, Буравчик
Re[3]: Честное время
От: elmal  
Дата: 19.07.21 10:13
Оценка:
Здравствуйте, Эйнсток Файр, Вы писали:

ЭФ>Я ничего не понял. Что такое итерация? Ты мне предлагаешь делать виртуальный процессор и считать виртуальные инструкции вручную?

ЭФ>Просто представь, что алгоритмы AI разные, и работу за один условный ход они проделывают разную.
Если ты сказал про время, то у тебя алгоритмы скорее всего итеративные, в каждой итерации алгоритм выдает лучшее и лучшее решение. Иначе ты бы тупо считал до остановки. Потому имеет смысл ограничить количество итераций каким конфигом или нужной точностью. Параметры конфига ты можешь подобрать эмпирически, также можешь на конкретном процессоре при старте запустить какой бенчмарк чтобы посмотреть насколько эти параметры нужно подкорректировать на конкретном железе. Бенчмарк однопоточный и тупой как пробка делать.

Просто ограничивать по времени тебе скорее всего не надо. Ибо если у тебя реально появилась необходимость уложиться в определенное время, то тебе нужно использовать не винду ликунс макось, а специальные системы реального времени, которые из коробки дают гарантию отклика за внешнее воздействие за определенное количество времени, но при этом жертвуя общей эффективностью. Винда линукс макось таких гарантий не предоставляют даже в рамках процессов, про потоки даже говорить нет смысла, соответственно ничего путного ты не сделаешь.
Re[2]: Честное время
От: Эйнсток Файр Мухосранск Странный реагент
Дата: 19.07.21 10:33
Оценка:
Б> Пусть появился игрок, который исчерпал лимит. Что с ним будешь делать?

Игра условно пошаговая. Если время на ход закончилось, то для реализации принимаются текущие наработанные идеи игрока, у него отбирается процессор и отдаётся тем, кто ещё не насчитал до лимита.
Re[4]: Честное время
От: Эйнсток Файр Мухосранск Странный реагент
Дата: 19.07.21 10:35
Оценка:
E> Параметры конфига ты можешь подобрать эмпирически

Ты предполагаешь, что все AI одинаковые. Представь себе игру типа шахмат. Там конечно можно просчитать всё, только времени на это не хватит ни как.
Поэтому приходится вводить ограничение, которое связано с человеческими физиологическими характеристиками (сколько не надоедает ждать).
Re[5]: Честное время
От: elmal  
Дата: 19.07.21 10:53
Оценка:
Здравствуйте, Эйнсток Файр, Вы писали:

ЭФ>Ты предполагаешь, что все AI одинаковые. Представь себе игру типа шахмат. Там конечно можно просчитать всё, только времени на это не хватит ни как.

ЭФ>Поэтому приходится вводить ограничение, которое связано с человеческими физиологическими характеристиками (сколько не надоедает ждать).
Я сам работаю в отрасли где нужно выдать результат за определенное время, части алгоритма могут выполняться параллельно, и зачастую впараллель запускаются несколько конкурирующих алгоритмов и через определенное время управление говорит стоп и выбирается наилучшее решение из того, что посчиталось. Так вот, нет необходимости давать разным алгоритмам одинаковое процессорное время. Они вообще то могут работать на разных нодах кластера вообще то, ноды могут быть загружены другими задачами. Единственный смысл, который может быть — это прибивать все к чертям если не уложился в лимит времени, говоря давай те результаты что есть, больше ждать нельзя.
Re[6]: Честное время
От: Эйнсток Файр Мухосранск Странный реагент
Дата: 19.07.21 11:09
Оценка:
E> нет необходимости давать разным алгоритмам одинаковое процессорное время.

Это нужно в том случае, если алгоритмы играют друг против друга.
Иначе как понять, какой из алгоритмов играет лучше?
Re[7]: Честное время
От: elmal  
Дата: 19.07.21 11:21
Оценка:
Здравствуйте, Эйнсток Файр, Вы писали:

ЭФ>Это нужно в том случае, если алгоритмы играют друг против друга.

ЭФ>Иначе как понять, какой из алгоритмов играет лучше?
Если тебе реально нужно это понять — гоняй разные алгоритмы на разных свободных нодах, на одной и той же ОС на одном и том же железе, максимально убедившись что еще кто там что не запускает, соответственно соревнуйтесь. Иначе будет погрешность. Можно не заморачиваться, тупо запустить по потоку на алгоритм, но если ОС приспичило поток вытеснить — значит не повезло потоку, повезет в другой раз. Предполагаю что совсем жутко ОС будет вмешаваться достаточно редко и сможешь получить достаточные для примерного понимания результаты.
Re: Честное время
От: akasoft Россия  
Дата: 19.07.21 11:45
Оценка:
Здравствуйте, Эйнсток Файр, Вы писали:

ЭФ>Как в дотнете организовать многопоточное приложение таким образом, чтобы нити, выполняющие расчёты за разных AI-игроков, получали одинаковое количество процессорных ресурсов в час (или в другой промежуток времени)?

Что-то подсказывает мне, что эта задача не решаемая, кроме RTC OS.
Но если ты в разных потоках считаешь каждого игрока-AI и заодно людей, то пока человек тУпит в монитор на картинку, cpu может сделать сильно многое. И кроме того, что мешает алгоритму считать постоянно. Ведь человек играя постоянно прокручивает игру в голове, почему AI надо перезапускать каждый раз.
А если цель померять потраченное время, то можно поступить как разработчики MS SQL, ввести метрики и считать время, потраченное на то, на сё, на это, на вот это. Что именно — зависит от реализации алгоритмов и их разделения на функциональные блоки. Алгоритм AI по мере работы увеличивает метрики, их можно узнать, журналировать, анализировать у кого что где когда ушло, вплоть до стадии игры. Так что предлагаю не ограничивать время работы, а считать его.
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Re[2]: Честное время
От: Эйнсток Файр Мухосранск Странный реагент
Дата: 19.07.21 13:10
Оценка:
A> предлагаю не ограничивать время работы

Допустим, ходы происходят раз в 4 минуты, всё это время думают и люди и их противники.
Время на ход ограничено этими 4-мя минутами, но я не предполагаю давать AI меньшее количество времени.
Под "ограничивать", я имел в виду как обеспечить такую политику, чтобы один
AI не переиспользовал процессорное время, своровав его у всех других AI (и победив за счёт этого).
Re[8]: Честное время
От: Эйнсток Файр Мухосранск Странный реагент
Дата: 19.07.21 13:13
Оценка:
E> гоняй разные алгоритмы на разных свободных нодах, на одной и той же ОС на одном и том же железе

Железо будет недоиспользоваться. Задавили один из AI и всё — его физическое железо простаивает...
Re: Развязать поток и игрока
От: igor-booch Россия  
Дата: 19.07.21 16:21
Оценка: 3 (1)
ЭФ>Как в дотнете организовать многопоточное приложение таким образом, чтобы нити, выполняющие расчёты за разных AI-игроков, получали одинаковое количество процессорных ресурсов в час (или в другой промежуток времени)?

Создать очередь ConcurrentQueue<Computation>
Computation это расчёт. Допустим все Computation выполняются за одно и то же время и все игроки создают их с одинаковой скоростью.
Запустить n потоков (оптимально n — число ядер CPU).
В каждом потоке доставать в цикле из очереди Computation и выполнять его.
Если Computation по времени исполнения разные, то мудрить с тем кому можно сейчас добавить в очередь свой Computation.
Если ранее добавил тяжелый Computation и хочешь ещё, подожди дай другие добавят вперёд тебя.
Если скорость создания игроками Computation разная, тоже мудрить аналогично
Отвечайте на это сообщение, только если у Вас хорошее настроение и в Вашем ответе планируются только конструктивные вопросы и замечания
http://rsdn.ru/Info/rules.xml
Re[3]: Честное время
От: akasoft Россия  
Дата: 19.07.21 16:55
Оценка:
Здравствуйте, Эйнсток Файр, Вы писали:

ЭФ>Допустим, ходы происходят раз в 4 минуты, всё это время думают и люди и их противники.

Если я правильно читал, игра у тебя пошаговая. Это минимум 2 условных этапа, этап формирования приказов шага (возможно, совмещённый с информированием людей о произошедшем на предыдущем шаге) и этап исполнения собранных приказов и просчёта шага. На этапе формирования и AI, и люди формируют очередь воздействий на мир в соответствиями с правилами (с валидацией допустимости воздействий).
Кто как заполнил очередь приказов, тот так себе и Буратино.

Весь вопрос, хватит ли людям 4 мин макс на адекватную реакцию на изменения в мире, или их тонус переполнится и они с воплями про коня забьют на игру. AI-то по любому успеет.

ЭФ>Время на ход ограничено этими 4-мя минутами, но я не предполагаю давать AI меньшее количество времени.

ЭФ>Под "ограничивать", я имел в виду как обеспечить такую политику, чтобы один
ЭФ>AI не переиспользовал процессорное время, своровав его у всех других AI (и победив за счёт этого).
Вот тут я предлагаю не искать хитрого и вороватого, а вести учёт времени по каждому игроку, сколько времени он потратил и на что, не важно, человек или AI.

Человек думает, потом формирует приказ. Значит время между приказами у него уходит на обдумывание приказа, первый приказ — с момента показа состояния текущего шага. Можно замерять, сколько времени он что смотрел.
Для AI тоже можно выделить функциональные части, и замерять время на них потраченное. Сколько ушло на выявление главной цели, сколько на второстепенные и определение их количества. Приказывает AI явно быстрее человека, мышью водить не нужно.
Писать в журнал эти метрики на каждом шаге и всего за игру, и будет видно, как справляются игроки, где и когда у них затык и цугцванг.
Имея на руках тайминги и сами приказы можно судить об эффективности алгоритмов.
Наконец, можно схитрить и на этапе исполнения ещё немного времени дать AI "подумать".
... << RSDN@Home 1.3.110 alpha 5 rev. 62>> SQL DE 2016
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.