Может ли многопоточность повлиять на клона Conway Game of Life? - PullRequest
2 голосов
/ 21 июля 2010

Я реализовал эту маленькую игровую идею, которая (как-то?) Похожа на игру жизни Конвея:

0) У вас есть матрица цветных точек (значения RGB) 1) Если соседняя ячейка имеет более низкое значение X, чем ваш Y, поместите Y = 0 в эту ячейку (Где X и Y - красный || зеленый || синий) 2) Красные удары Зеленые удары Голубые удары Красные

То, что я делаю сейчас, это просто пошагово, проверяя, соблюдаются ли вышеуказанные правила. Однако это не совсем то, что я задумал, поскольку иногда ячейки в первых строках имеют преимущество перед ячейками в конечных строках.

Может ли многопоточность предотвратить это (скажем, запустить два потока, один инициирующий в первой ячейке, а другой в последней)? Прошу прощения за мое невежество в отношении параллелизма, но я чувствовал, что это хороший способ начать работать с ним.

Ответы [ 4 ]

7 голосов
/ 21 июля 2010

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

3 голосов
/ 21 июля 2010

Нет.Ваша проблема - врожденный недостаток.Проблема, с которой вы столкнулись, заключается в том, что вы используете промежуточные результаты, т. Е. Изменение одной ячейки сразу же влияет на следующую ячейку в этом обновлении.Это не должноВы должны создать новую матрицу, сохранить измененные значения там, а затем поменять их местами, чтобы новые значения были загружены.Повторите.

1 голос
/ 21 июля 2010

Вам лучше будет адаптировать свой алгоритм, чтобы предотвратить это.

Полагаться на многопоточность для изменения поведения - не очень хорошая вещь. По сути, это попытка ввести условие гонки в ваш код. Обычно, при добавлении многопоточности в алгоритм, первым приоритетом является предотвращение любых изменений в поведении.

Пытаясь использовать условие гонки для изменения поведения, вы делаете это очень недетерминированным, но не в хорошем смысле. Было бы гораздо лучше, если бы вы попытались найти другое решение (возможно, с использованием генератора псевдослучайных чисел и т. Д.), А затем внедрили многопоточность, чтобы сделать это быстрее (надеюсь, не влияя на результаты). *

0 голосов
/ 21 июля 2010

Это зависит от того, какую часть обработки вы выбираете для многопоточности. Пример прототипа многопоточности - это матричный множитель. Вы можете в основном разбить его на квадранты и рассчитать один квадрант в каждом потоке без обмена информацией, кроме исходной матрицы. Обратите внимание, что Game of Life представляет собой разреженную матрицу, и может или не может выиграть от многопоточности.

Однако, если вы решите сделать это, имейте в виду, что все должно рассчитать, что нужно для «следующего хода», и поместить его в новую матрицу, когда в матрицу своп (желательно не копировать, изменить указатель где-нибудь) в конце хода, чтобы один поток не изменил значения, необходимые другим для выполнения своих вычислений. Так что потоку нельзя позволять «опережать» друг друга. Это может означать, что с несколькими потоками оказывается неэффективным - ваш пробег может варьироваться.

...