OpenMP на многоядерном процессоре и криптография

Практический пример использования

OpenMP — это набор директив компилятора, библиотечных процедур и переменных окружения, которые предназначены для программирования многопоточных приложений на многопроцессорных системах с разделяемой памятью. OpenMP реализует параллельные вычисления с помощью многопоточности, в которой главный поток создает набор подчиненных потоков и задача распределяется между ними. Предполагается, что потоки выполняются параллельно на машине с несколькими процессорами. Использование OpenMP должно приводить [...]

← Вернуться к полной версии записи «OpenMP на многоядерном процессоре и криптография»…

Автор: ; опубликовано в: OpenMP; метки: benchmark, C/C++, ECB, OpenMP, криптография, производительность, шифрование
4
Апр
2009

RSS Комментарии к статье «OpenMP на многоядерном процессоре и криптография» (13)  »

  1. Konstantyn

    С замером времени тож самое было)) пропарился как говориться…..Аналогично считал что распаралеленная версия медленнее однопоточной

  2. хаха, у меня лапа с иедленная спользованием OpenMP самая медленная по сравнению с pthread и однопоточний… Интернесно, почему так

  3. Максим

    Здравствуйте, Владимир. Скажите пожалуйста как вам удалось выпилить из госта циклический сдвиг влево на 11? :)

    • Я с S-box извратился.

      Там как-то так это выглядит:

      [-]
      View Code C
          int i = 0;
          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’ом, там все равное нужно было сдвиг делать каждый раз :)

  4. Максим

    и кстати у меня наложение маски почему то работает быстрее чем приведение типа

    • А это от компилятора, вероятно, зависит. Нужно смотреть, какой код генерируется в одном и в другом случае.

      • Максим

        Не могли бы вы показать код инициализации таблиц замен, мне интересна эта оптимизация.

        • Код такой, как в комментарии, только по всем индексам (от 0 до 15).

          [-]
          View Code C
              int i = 0;
              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;
                  }
              }

          Как-то так.

  5. Максим

    Не знаю проверяли вы или нет этот код на 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=число, почему то у меня ничего не ускоряет.

    Я вообще хотел еще оптимизировать хеш функцию, но её распараллелить видимо нереально…

    • gost_data_4[t >> 24] – может выйти за границы массива

      Вы абсолютно правы, спасибо, сейчас поправлю.

      Кстати у меня примерно такой же код (я немного циклы развернул) шифрует со скоростью ~ 366,3 МБит/сек

      Здорово. Впечатляет.

      Я вообще хотел еще оптимизировать хеш функцию, но её распараллелить видимо нереально…

      :-) Если честно, я не знаю ни одной хэш-функции, вычислять которую можно параллельно. В принципе, в этом есть свой плюс: подбор хэша тоже не особо распараллелишь.

Пожалуйста, не используйте эту форму для комментирования! Данная форма предназначена исключительно для ботов.

Оставить комментарий к записи «OpenMP на многоядерном процессоре и криптография»

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Оставляя комментарий, вы выражаете своё согласие с Правилами комментирования.

Подписаться, не комментируя

गते गते पारगते पारसंगते बोधि स्वाहा