Получение циклов на байт для моего алгоритма?

Я знаю теорию, но у меня есть проблемы с практической реализацией. Я написал алгоритм AES на C. Теперь я хотел бы знать, сколько циклов на байт он «имеет». Я знаю, что я должен (это на 100% верно?):

  1. Вычислить скорость алгоритма в байтах в секунду
  2. Получите тактовую частоту в герцах
  3. Разделите скорость алгоритма в байтах в секунду на тактовую частоту в герцах
  4. Возьми ответное от 3.
  5. Измерьте скорость алгоритма в гигабайтах в секунду
  6. Разделите скорость алгоритма в гигабайтах в секунду на тактовую частоту в гигагерцах
  7. Возьми ответное от 6.

Возможно ли сделать это на C / C ++? Как сделать это и что я должен использовать / искать, чтобы сделать это?

Я заинтересован в решениях для Linux / Windows / Mac.

0

Решение

Это просто алгебра, а не уравнение или теория.

Если вы уже знаете байты / секунду и тактовую частоту (циклов / секунду), то

(bytes/second) / (cycles/second) => bytes/cycle
1 / (bytes/cycle) => cycles/byte

Если ты не знаешь байт в секунду, Вы можете рассчитать это по:

  1. получить метку времени с высоким разрешением T1 подходит для такого рода измерений
  2. запустить свой алгоритм N раз за В байтов
  3. получить другую временную метку T2
  4. вычтите временные метки одно из другого, чтобы дать истекшее время E = T2 — T1
  5. вы сейчас обработали (N *B) байты в Е единицы времени
  6. повторить несколько раз
  7. если ваши измерения нестабильны, или ваша продолжительность Е увеличение неудобно близко к нулю или подозрительно близко к некоторой детализации системного таймера N и / или В и попробуй еще раз. На самом деле, в любом случае, сделайте это несколько раз, чтобы убедиться, что вы получаете линейную зависимость между обработанными байтами и затраченным временем.
  8. масштабируйте свои единицы времени (наносекунды, микросекунды, какими бы они ни были) в секунды, если вы хотите, чтобы отобразить результат

Обратите внимание: если указанная выше «временная метка» на самом деле является счетчиком циклов, вы можете пропустить цикл / второй этап. В противном случае вы можете просто считать частоту ЦП из системного / аппаратного информационного инструмента для вашей платформы.

Для POSIX разумный таймер может быть clock_gettime(CLOCK_THREAD_CPUTIME_ID,...), например. Вы должны быть в состоянии найти пример кода для rdtsc, документация для лучшей функции синхронизации Windows и т. д. путем поиска.


Что касается фактических измерений, в комментариях есть хорошие предложения. Вам нужно:

  • взять большое (достаточное) количество образцов, чтобы оно было надежным
  • в идеале, когда ничего не борется за ресурсы, если не с FIFO / планированием в реальном времени
  • либо убедитесь, что любое масштабирование тактовой частоты процессора отключено, либо откажитесь от первых образцов, где он прогревался
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]