uint64_t res[8];
fill_with(res, 0); // заполняет нулями
for (int bit = 0; bit < 64; ++bit) {
for (int i = 0; i < 8; ++i) {
res[i] ^= ((block[i] >> (64 - bit - 1)) & 1) * l_matrix[bit];
}
}
copy_block(block, res); // копирует res в block
}
l_matrix[i] почти случайное
1. Поставь оптимизацию О2. Посмотри на ассемблер. Потом замени bit и int на unsigned, потому что они очевидно unsigned. std::move блок вместо копирования(не знаю уж как на стеке, но че нить такое), Переверни цикл наизнанку, то есть для каждого i сразу проводи 64 операции умножения не пересчитывая и не перетаскивая из другой возможно части памяти инфу по 64 раза
лубая возня с битами, это либо готовые (заранее) таблицы смотри любой CRC либо работа с целыми интами\байтами за раз, чтоб убрать итерацию хотябы по битам в байте
move для 8 интов?
псевдомув какой то чтобы не было копирования вообще, ну тут надо математически разобраться что вообще происходит
Скалярное произведение строчки матрицы на двоичный вектор
Здесь копирование - вообще последнее, что подлежит оптимизации. Солидарен с @KoynovStas
Надеюсь, в copy_block находится memcpy?
Где можно почитать, как таблички эти делают?
Нет, но copy_block <1% времени
берёшь все возможные варианты своей ебанины прогоняешь по твоему алгоритму записывая результат и делаешь самую большую и бесполезную таблицу в истории хДД
Больно много выйдет 2^64 табличка
эмм, ну смотри если у тебя есть, итерация по байту(битам байта)! значит ты можешь где-то один раз сделать результат для x байта. их всего 256 штук будет. дальше зная байт, ты знаешь рузультат. говорю попробуй разобрать самый простой табличный црц 8 битный который. а так если возня с битами, то есть книжка: Алгоритмические трюки для программистов 2014 Генри С. Уоррен
Да, действительно, протупил. Попробую сделать, спасибо.
Кажется, стоит разобраться в мув семантике, а потом давать такие советы
Обсуждают сегодня