Я знаю теорию, но у меня есть проблемы с практической реализацией. Я написал алгоритм AES на C. Теперь я хотел бы знать, сколько циклов на байт он «имеет». Я знаю, что я должен (это на 100% верно?):
- Вычислить скорость алгоритма в байтах в секунду
- Получите тактовую частоту в герцах
- Разделите скорость алгоритма в байтах в секунду на тактовую частоту в герцах
- Возьми ответное от 3.
- Измерьте скорость алгоритма в гигабайтах в секунду
- Разделите скорость алгоритма в гигабайтах в секунду на тактовую частоту в гигагерцах
- Возьми ответное от 6.
Возможно ли сделать это на C / C ++? Как сделать это и что я должен использовать / искать, чтобы сделать это?
Я заинтересован в решениях для Linux / Windows / Mac.
0
Решение
Это просто алгебра, а не уравнение или теория.
Если вы уже знаете байты / секунду и тактовую частоту (циклов / секунду), то
(bytes/second) / (cycles/second) => bytes/cycle
1 / (bytes/cycle) => cycles/byte
Если ты не знаешь байт в секунду, Вы можете рассчитать это по:
- получить метку времени с высоким разрешением T1 подходит для такого рода измерений
- запустить свой алгоритм N раз за В байтов
- получить другую временную метку T2
- вычтите временные метки одно из другого, чтобы дать истекшее время E = T2 — T1
- вы сейчас обработали (N *B) байты в Е единицы времени
- повторить несколько раз
- если ваши измерения нестабильны, или ваша продолжительность Е увеличение неудобно близко к нулю или подозрительно близко к некоторой детализации системного таймера N и / или В и попробуй еще раз. На самом деле, в любом случае, сделайте это несколько раз, чтобы убедиться, что вы получаете линейную зависимость между обработанными байтами и затраченным временем.
- масштабируйте свои единицы времени (наносекунды, микросекунды, какими бы они ни были) в секунды, если вы хотите, чтобы отобразить результат
Обратите внимание: если указанная выше «временная метка» на самом деле является счетчиком циклов, вы можете пропустить цикл / второй этап. В противном случае вы можете просто считать частоту ЦП из системного / аппаратного информационного инструмента для вашей платформы.
Для POSIX разумный таймер может быть clock_gettime(CLOCK_THREAD_CPUTIME_ID,...)
, например. Вы должны быть в состоянии найти пример кода для rdtsc
, документация для лучшей функции синхронизации Windows и т. д. путем поиска.
Что касается фактических измерений, в комментариях есть хорошие предложения. Вам нужно:
- взять большое (достаточное) количество образцов, чтобы оно было надежным
- в идеале, когда ничего не борется за ресурсы, если не с FIFO / планированием в реальном времени
- либо убедитесь, что любое масштабирование тактовой частоты процессора отключено, либо откажитесь от первых образцов, где он прогревался
1
Другие решения
Других решений пока нет …