Как я могу убедиться, что N потоков работают примерно с одинаковой скоростью? - PullRequest
15 голосов
/ 13 марта 2009

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

У этого подхода было бы несколько преимуществ. Концептуально это было бы очень близко к тому, как работает реальный мир. Было бы намного проще масштабировать систему на несколько машин.

Однако, чтобы это работало, мне нужно убедиться, что все потоки работают с одинаковой скоростью, с довольно либеральной интерпретацией «то же самое». Скажите в пределах 1% друг от друга.

Вот почему мне не обязательно нужно решение, подобное Thread.join (). Я не хочу, чтобы какая-то школьная хозяйка, которая контролировала вас, контролировала бы регулярную синхронизацию всех потоков друг с другом. Мне просто нужно иметь возможность попросить среду выполнения (в зависимости от того, какая она есть - может быть Java, Erlang или что-то еще, что наиболее подходит для этой проблемы) запустить потоки с более или менее равной скоростью.

Буду очень признателен за любые предложения.

ОБНОВЛЕНИЕ 2009-03-16

Я хотел бы поблагодарить всех, кто ответил на этот вопрос, в частности всех, чей ответ был, по сути, «НЕ ДЕЛАЙТЕ ЭТОГО». Теперь, благодаря всем комментариям, я понимаю свою проблему намного лучше, и я не уверен, что мне следует продолжать, как я планировал изначально. Тем не менее, я чувствовал, что ответ Петра был лучшим ответом на сам вопрос, поэтому я принял его.

Ответы [ 14 ]

1 голос
/ 13 марта 2009

Я не эксперт по многопоточности, но разве весь смысл потоков в том, что они независимы друг от друга - и недетерминированы?

0 голосов
/ 13 марта 2009

Я первым признаю, что я не специалист по многопоточности, но это звучит как очень неправильный подход к симуляции. Как уже отмечали другие, слишком много потоков вычислительно дорого. Кроме того, если вы планируете делать то, о чем я думаю, то ваша симуляция может привести к случайным результатам (может не иметь значения, если вы делаете игру).

Я бы пошел с несколькими рабочими потоками, используемыми для вычисления дискретных шагов моделирования.

0 голосов
/ 13 марта 2009

Работая над управлением двигателями, я использовал немного математики для поддержания скорости в стабильном состоянии. Система имеет ПИД-регулятор, пропорциональный, интегральный и производный. Но это аналоговая / цифровая система. Может быть, можно использовать аналогичным образом, чтобы определить, сколько времени должен работать каждый поток, но самый большой совет, который я могу вам дать, это то, что у всех потоков будет синхронизация часов.

0 голосов
/ 13 марта 2009

Для достижения этой цели должно произойти две вещи. Вы должны убедиться, что у вас одинаковое количество потоков на ядро ​​процессора, и вам нужна какая-то синхронизация.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...