Определите FLOPS нашей программы ASM

Нам пришлось реализовать программу ASM для умножения разреженных матриц в формате координатной схемы (COOS), а также в формате сжатой строки (CSR). Теперь, когда мы внедрили все эти алгоритмы, мы хотим знать, насколько они более эффективны в отличие от обычного матричного умножения. Мы уже реализовали код для измерения времени выполнения всех этих алгоритмов, но теперь мы решили, что мы также хотим знать, сколько операций с плавающей запятой в секунду (FLOPS) мы можем выполнить. Любое предложение о том, как измерить/подсчитать это?

Вот некоторая справочная информация о используемой системе:

processor   : 0
model name  : ARMv7 Processor rev 2 (v7l)
Features    : swp half thumb fastmult vfp edsp thumbee neon vfpv3 tls vfpd32 
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x3
CPU part    : 0xc08
CPU revision    : 2

Наша первая идея заключалась в том, чтобы внедрить своего рода счетчик FPO, который мы увеличиваем после каждой операции с плавающей запятой (операции арифметики, а также операции сравнения и перемещения), но это будет означать, что мы должны вставлять операции инкремента по всему нашему коду что также замедляет работу приложения... Кто-нибудь знает, есть ли какой-то аппаратный счетчик, который подсчитывает количество операций с плавающей запятой или, может быть, если существует какой-то инструмент производительности, который можно использовать для мониторинга нашей программы и измерения количества FPOs. Любые предложения или указатели будут оценены.

Ниже приведена оценка FLOP для матричного умножения с использованием подхода подсчета. Сначала мы измерили время работы, чем вставленные счетчики, для каждой интересующей нас команды, а затем вычислили количество операций с плавающей запятой в секунду. Floating point operations per second for matrix multiplication

Ответ 1

Похоже, что ближе всего вы можете получить события производительности, поддерживаемые Cortex-A8, - это количество выполненных команд, которое isn ' t очень полезно, учитывая, что "инструкция" выполняет что-либо от 0 до (я думаю) 8 операций FP. Сделав шаг назад, становится очевидным, что попытка измерения FLOPS для алгоритма в аппаратных средствах не будет работать в любом случае - например. вы можете написать реализацию с использованием векторных ops, но не всегда помещать реальные данные во все полосы каждого вектора, тогда CPU должен быть психическим, чтобы знать, сколько из фактически выполняемых операций FP, которые он выполняет,


К счастью, учитывая формальное определение алгоритма, вычисление количества задействованных операций должно быть довольно простым (хотя и не обязательно легким, в зависимости от сложности). Например, пропуская его в моей голове, стандартное наивное умножение матрицы m x n с матрицей n x m выходит на операции m * m * (n + n - 1) (n умножений и (n - 1) дополнений на выходной элемент). После того, как на бумажном анализе появилась соответствующая параметризованная формула расчета порядка, вы можете отложить ее в свой инструмент сравнения, чтобы рассчитать числа для данных теста.

Как только вы это сделаете, вы, вероятно, начнете сожалеть о том, что тратите все время на это, потому что у вас будет (arbitrary number) / (execution time), что немного больше смысла, чем (execution time), и в основном просто затрудняет сравнение случаев, когда (arbitrary number) отличается. В частности, в производительности NEON преобладают задержки в конвейере и пропускная способность памяти, и поэтому детали реализации на низком уровне могут легко перевесить любую внутреннюю разницу, которую могут иметь алгоритмы.

Подумайте об этом так: скажем, на каком-то заданном 100-мегагерцовом процессоре a + a + b + b всего 5 циклов, а (a + b) * 2 занимает 4 цикла всего * - прежние баллы 60 MFLOPS, последние всего 50 MFLOPS. Вы скажете, что больше FLOPS означает лучшую производительность, и в этом случае процедура, которая на 25% больше, чтобы дать тот же результат, как-то "лучше"? Собираетесь ли вы сказать, что меньшее количество FLOPS означает лучшую производительность, что явно неверно для любой разумной интерпретации? Или вы поймете, что FLOPS практически бессмысленна для чего-либо, кроме синтетических тестов, для сравнения теоретической максимальной пропускной способности одного процессора с другим?

* числа, вырванные из воздуха для аргументации; однако они на самом деле не так уж и похожи на Cortex-M4F - одноточечный FPU, где и добавление, и умножение - однотактные, плюс один или два для опасностей регистров.

Ответ 2

Число ядер x Средняя частота x Операция percycle