Информация об изменениях

Сообщение Re[2]: Красная Шапочка и Серый Волк от 11.11.2016 14:55

Изменено 11.11.2016 15:21 Кодт

Здравствуйте, antonio_banderas, Вы писали:

_>150*150*32000 = 720.000.000

_>Можно на сильном железе вытянуть за секунду столько?

Легко.

1. Как я уже сказал, из-за чётности можно обойтись единственным игровым полем.
2. Шапочки ходят
— ниоткуда: row[y] &= ((tact ^ y) % 1) ? even_row_mask : odd_row_mask
— вверх: row[y] |= row[y+1]
— вниз: row[y] |= row[y-1]
— влево: row[y] |= row[y]<<1
— вправо: row[y] |= row[y]>>1
3. Протравливаем шапочек деревьями
— row[y] &= nontrees[y]
4. Протравливаем шапочек волком
— row[wolf_y] &= wolf_row_mask

Для удобства можно окружить периметр леса плотной стеной деревьев, чтобы не заниматься ветвлениями на границах.
Поскольку длина битового вектора не более 150, нам вполне хватит одного 256-битного регистра (AVX) или даже 4 обычных 64-битных.
И в кеш это отлично влезает, и параллелится.
Re[2]: Красная Шапочка и Серый Волк
Здравствуйте, antonio_banderas, Вы писали:

_>150*150*32000 = 720.000.000

_>Можно на сильном железе вытянуть за секунду столько?

Легко.

1. Как я уже сказал, из-за чётности можно обойтись единственным игровым полем.
2. Шапочки ходят
— ниоткуда: row[y] &= ((tact ^ y) % 1) ? even_row_mask : odd_row_mask
— вверх: row[y] |= row[y+1]
— вниз: row[y] |= row[y-1]
— влево: row[y] |= row[y]<<1
— вправо: row[y] |= row[y]>>1
3. Протравливаем шапочек деревьями
— row[y] &= nontrees[y]
4. Протравливаем шапочек волком
— row[wolf_y] &= wolf_row_mask

Для удобства можно окружить периметр леса плотной стеной деревьев, чтобы не заниматься ветвлениями на границах.
Поскольку длина битового вектора не более 150, нам вполне хватит одного 256-битного регистра (AVX) или даже 4 обычных 64-битных.
И в кеш это отлично влезает, и параллелится при желании.

http://ideone.com/zfV4eJ — тупой бенчмарк. 32000 тактов за 70 миллисекунд.