OpenMP на многоядерном процессоре и криптография
Практический пример использования
OpenMP — это набор директив компилятора, библиотечных процедур и переменных окружения, которые предназначены для программирования многопоточных приложений на многопроцессорных системах с разделяемой памятью. OpenMP реализует параллельные вычисления с помощью многопоточности, в которой главный поток создает набор подчиненных потоков и задача распределяется между ними. Предполагается, что потоки выполняются параллельно на машине с несколькими процессорами. Использование OpenMP должно приводить [...]
← Вернуться к полной версии записи «OpenMP на многоядерном процессоре и криптография»…
Автор: Vladimir; опубликовано в: OpenMP; метки: benchmark, C/C++, ECB, OpenMP, криптография, производительность, шифрованиеАпр
2009
Комментарии к статье «OpenMP на многоядерном процессоре и криптография» (13) »
Пожалуйста, не используйте эту форму для комментирования! Данная форма предназначена исключительно для ботов.
Оставить комментарий к записи «OpenMP на многоядерном процессоре и криптография»
गते गते पारगते पारसंगते बोधि स्वाहा
Меня зовут Владимир, я программист-фрилансер, специализирующийся на Web-программировании и програмировании под Linux.
По совместительству занимаюсь администрированием LAMP/LNMP-серверов и техническим переводом.


С замером времени тож самое было)) пропарился как говориться…..Аналогично считал что распаралеленная версия медленнее однопоточной
хаха, у меня лапа с иедленная спользованием OpenMP самая медленная по сравнению с pthread и однопоточний… Интернесно, почему так
Вообще странно — OpenMP в Linux использует pthreads.
А процессор многоядерный? И ключ
-fopenmpиспользовался при компиляции?Здравствуйте, Владимир. Скажите пожалуйста как вам удалось выпилить из госта циклический сдвиг влево на 11?
Я с S-box извратился.
Там как-то так это выглядит:
for (uint8_t a=0; a<16; ++a) {
ax = sbox[1][a] << 15;
bx = sbox[3][a] << 23;
cx = sbox[5][a];
cx = (cx >> 1) | (cx << 31);
dx = sbox[7][a] << 7;
gost_sbox_1[i] = ax | (sbox[0][0] << 11);
gost_sbox_2[i] = bx | (sbox[2][0] << 19);
gost_sbox_3[i] = cx | (sbox[4][0] << 27);
gost_sbox_4[i] = dx | (sbox[6][0] << 3);
++i;
gost_sbox_1[i] = ax | (sbox[0][1] << 11);
gost_sbox_2[i] = bx | (sbox[2][1] << 19);
gost_sbox_3[i] = cx | (sbox[4][1] << 27);
gost_sbox_4[i] = dx | (sbox[6][1] << 3);
++i;
// ...
}
Тесты такая реализация точно проходила.
PS — называется это всё S-box precomputation.
Спасибо большое, по ключевой фразе S-box precomputation нарыл кое что в гугле. У меня было немного попроще с precompution’ом, там все равное нужно было сдвиг делать каждый раз
и кстати у меня наложение маски почему то работает быстрее чем приведение типа
А это от компилятора, вероятно, зависит. Нужно смотреть, какой код генерируется в одном и в другом случае.
Не могли бы вы показать код инициализации таблиц замен, мне интересна эта оптимизация.
Код такой, как в комментарии, только по всем индексам (от 0 до 15).
for (uint8_t a=0; a<16; ++a) {
ax = sbox[1][a] << 15;
bx = sbox[3][a] << 23;
cx = sbox[5][a];
cx = (cx >> 1) | (cx << 31);
dx = sbox[7][a] << 7;
for (uint8_t j=0; j<16; ++j) {
gost_sbox_1[i] = ax | (sbox[0][j] << 11);
gost_sbox_2[i] = bx | (sbox[2][j] << 19);
gost_sbox_3[i] = cx | (sbox[4][j] << 27);
gost_sbox_4[i] = dx | (sbox[6][j] << 3);
++i;
}
}
Как-то так.
Не знаю проверяли вы или нет этот код на 64 битной платформе, но на ней uint_fast32_t t – будет почти наверное 64 битной, и тогда t = * + * – может выйти за границы 32 бит, и тогда gost_data_4[t >> 24] – может выйти за границы массива (у меня лично выходит
), так что тут видимо тоже надо приводить тип.
Кстати у меня примерно такой же код (я немного циклы развернул) шифрует со скоростью ~ 366,3 МБит/сек (не параллельная реализация)
Процессор: AMD Athlon(tm) X2 Dual-Core QL-60 1.9 Гц
Попробуйте еще флаги: -funroll-loops / -funroll-all-loops
флаг -ftree-parallelize-loops=число, почему то у меня ничего не ускоряет.
Я вообще хотел еще оптимизировать хеш функцию, но её распараллелить видимо нереально…
Вы абсолютно правы, спасибо, сейчас поправлю.
Здорово. Впечатляет.