Вопрос к коллегам-программистам
Sep. 1st, 2013 01:19 pmКоллеги,
В кои-то веки столкнулся с задачкой, которую я не знаю как оптимизировать. Надо побитово умножить число на матрицу.
Псевдокод:
unsigned val;
unsigned A[];
unsigned res;
int i;
...
res = 0;
for (i = 0; i < 32; i++)
if (val & (1 << i))
res ^= A[i];
Пара моих попыток подойти в лоб не увенчалась серьезным ускорением.
Кто-нибудь может что-нибудь хорошее подсказать/сообразить? А то я, кажется, отвык решать такие задачи.
UPD: Получил ускорение ~30% тупо раскрыв цикл. Все равно очень медленно. Хочется чего-то более радикального.
UPD2: Матрица - фиксированная, число изменяется.
no subject
Date: 2013-09-01 09:31 am (UTC)И если повторяющееся, то матрица/число оказываются одинаковыми?
no subject
Date: 2013-09-01 11:15 am (UTC)no subject
Date: 2013-09-01 03:08 pm (UTC)* для каждого из 256 возможных байтов закешировать результат умножения A на вектор этого байта: m
* разбить val на 4 байта b1, b2, b3, b4
* res ^= m[b1] ^ m[b2] ^ m[b3] ^ m[b4]
UPD: увидел вконтакте, что тебе Саша Аланов то же самое написал, и что это ускоряет в 8 раз. Ну что ж, круто :)
no subject
Date: 2013-09-01 04:08 pm (UTC)no subject
Date: 2013-09-01 10:17 pm (UTC)no subject
Date: 2013-09-01 10:17 pm (UTC)