Что такое FLOP / s и является ли это хорошим показателем производительности? - PullRequest
39 голосов
/ 30 ноября 2008

Меня попросили измерить производительность программы на Фортране, которая решает дифференциальные уравнения в многопроцессорной системе. Мой работодатель настаивает на том, чтобы я измерял FLOP / s (число операций с плавающей запятой в секунду) и сравнивал результаты с эталонными показателями ( LINPACK ), но я не уверен, что это путь, просто потому что никто не может объяснить мне что такое FLOP.

Я провел небольшое исследование о том, что такое FLOP, и получил довольно противоречивые ответы. Один из самых популярных ответов, которые я получил, был «1 FLOP = Операция сложения и умножения». Это правда? Если да, то опять же физически, что именно это означает?

Какой бы метод я ни использовал, он должен быть масштабируемым. Некоторые из версий кода решают системы с многомиллионными неизвестными, и для их выполнения требуются дни.

Какими были бы другие, эффективные способы измерения производительности в моем случае (краткий обзор моего случая - это «код Fortran, который много раз выполняет многократные арифметические вычисления в течение нескольких дней на нескольких сотнях процессоров)?

Ответы [ 8 ]

47 голосов
/ 30 ноября 2008

Это довольно приличный показатель производительности, если вы точно понимаете, что он измеряет.

FLOPS - это, как следует из названия, количество операций с плавающей точкой в ​​секунду, то, что составляет FLOP, может варьироваться в зависимости от процессора. (Некоторые процессоры могут выполнять сложение и умножение как одну операцию, другие не могут, например). Это означает, что в качестве показателя производительности он довольно близок к аппаратному обеспечению, а это означает, что 1) вам необходимо знать свое оборудование, чтобы вычислить идеальные FLOPS для данной архитектуры, и вы должны знать свой алгоритм и реализацию, чтобы выяснить, как много операций с плавающей запятой, из которых он фактически состоит.

В любом случае, это полезный инструмент для проверки того, насколько хорошо вы используете процессор. Если вам известна теоретическая пиковая производительность ЦП в FLOPS, вы можете определить, насколько эффективно вы используете модули с плавающей запятой ЦП, которые зачастую являются одними из трудных для эффективного использования. Программа, которая запускает 30% FLOPS, на которые способен процессор, имеет место для оптимизации. Тот, который работает на 70%, вероятно, не станет намного более эффективным, если вы не измените основной алгоритм. Для таких сложных математических алгоритмов, как ваш, это в значительной степени стандартный способ измерения производительности. Вы можете просто измерить, сколько времени занимает выполнение программы, но это сильно варьируется в зависимости от процессора. Но если ваша программа использует ЦП на 50% (относительно пикового числа FLOPS), это несколько более постоянное значение (оно все равно будет варьироваться в зависимости от радикально разных архитектур ЦП, но намного более согласованно, чем время выполнения).

Но зная, что «Мой ЦП способен X GFLOPS, и я на самом деле достигаю пропускную способность, скажем, 20% от этого», это очень ценная информация в высокопроизводительном программном обеспечении. Это означает, что что-то отличное , кроме операций с плавающей запятой, сдерживает вас и мешает работе модулей FP эффективно. А поскольку блоки FP составляют большую часть работы, это означает, что у вашего программного обеспечения есть проблема.

Легко измерить «Моя программа запускается за X минут», и если вы считаете, что это неприемлемо, тогда, конечно, вы можете ответить «Интересно, смогу ли я снизить эту скидку на 30%», но вы не знать , если это возможно, если вы не знаете точно, сколько работы выполняется, и точно, на что способен процессор в пике. Сколько времени вы хотите потратить на оптимизацию этого, если вы даже не знаете, способен ли процессор фундаментально выполнять больше инструкций в секунду?

Очень легко предотвратить эффективное использование блока FP процессора, поскольку у него слишком много зависимостей между операциями FP или слишком много ветвей или аналогичных элементов, препятствующих эффективному планированию. И если это сдерживает вашу реализацию, вам нужно , чтобы знать это. Вы должны знать, что «я не получаю пропускную способность FP, которая должна быть возможной, поэтому очевидно, что другие части моего кода препятствуют тому, чтобы инструкции FP были доступны, когда процессор готов к их выпуску».

Зачем вам нужны другие способы измерения производительности? Что плохого в том, чтобы просто рассчитать количество FLOPS, как вас просил ваш босс? ;)

26 голосов
/ 30 ноября 2008

Я просто хотел бы добавить пару более тонких пунктов:

  • деление является особенным. Поскольку большинство процессоров могут выполнять сложение, сравнение или умножение за один цикл, все они считаются одним флопом. Но деление всегда занимает больше времени. Сколько еще времени зависит от процессора, но в сообществе HPC есть своего рода стандарт defacto, который учитывает одно деление как 4 флопа.

  • Если у процессора есть слитая с умножением инструкция умножения-сложения , которая выполняет умножение и сложение в одной инструкции - обычно A + = B * C - которая считается за 2 операции.

  • Всегда будьте осторожны при различении флопов одинарной точности и флопов двойной точности . Процессор, способный на такое количество гигафлопс с одинарной точностью, может иметь лишь небольшую долю от этого количества гигафлопс с двойной точностью. Процессоры AMD Athlon и Phenom, как правило, могут сделать вдвое меньше флопов с двойной точностью, чем с одинарной точностью. Процессоры ATI Firestream обычно могут сделать 1/5 столько же флопов двойной точности, сколько одинарной точности. Если кто-то пытается продать вам процессор или пакет программного обеспечения и он просто цитирует провалы, не говоря, что, вам следует позвонить им.

  • Термины мегафлоп, гигафлоп, терафлоп и т. Д. Широко используются. Они относятся к коэффициентам 1000 , , а не 1024 . Например, 1 мегафлоп = 1 000 000 флоп / сек, а не 1 048 576. Как и в случае с дисководами, в этом есть некоторая путаница.

3 голосов
/ 30 ноября 2008

"сравнить результаты с эталонами" и что делать?

FLOPS означает, что вам нужно

1) FLOPs за какую-то единицу работы.

2) время для этой единицы работы.

Допустим, у вас есть некоторый входной файл, который выполняет 1000 итераций в некотором цикле. Цикл - это удобная единица работы. Он исполняется 1000 раз. Это займет час.

В цикле есть несколько сложений и умножений, несколько делений и квадратный корень. Вы можете рассчитывать добавляет, умножает и делит. Вы можете посчитать это в источнике, ища +, * и /. Вы можете найти выходные данные на языке ассемблера от компилятора и посчитать их там. Вы можете получить разные номера. Какой из них прав? Спроси своего босса.

Вы можете сосчитать квадратные корни, но вы не знаете, что они действительно делают с точки зрения умножения и сложения. Таким образом, вам нужно будет сделать что-то вроде теста умножения на квадратный корень, чтобы понять, сколько времени занимает квадратный корень.

Теперь вы знаете FLOPS в вашем цикле. И вы знаете время, чтобы запустить его 1000 раз. Вы знаете, FLOPS в секунду.

Затем вы смотрите на LINPACK и обнаруживаете, что вы медленнее. Что теперь? Ваша программа не LINPACK, и она медленнее, чем LINPACK. Скорее всего, ваш код будет работать медленнее. Если ваш код не был написан и оптимизирован за такое же количество лет как LINPACK, вы будете медленнее.

Вот другая часть. Ваш процессор имеет определенный рейтинг FLOPS против различных тестов. Ваш алгоритм не является одним из тех критериев, поэтому вы не соответствуете критериям. Это плохо? Или это очевидное следствие того, что он не является эталоном?

Каким будет ожидаемый результат?

Измерение с использованием некоторой базы эталонного кода только скажет вам, что ваш алгоритм не является эталонным алгоритмом. Это предрешенный вывод, что вы будете другими; обычно медленнее.

Очевидно, что результатом измерения по LINPACK будет (а) вы отличаетесь и, следовательно, (б) вам необходимо оптимизировать.

Измерение действительно ценно только в том случае, если вы сами против 1028 *. Не какой-то гипотетический набор инструкций, а ваш собственный набор инструкций. Измерьте свою собственную производительность. Изменить. Посмотрите, улучшится ли ваша производительность - по сравнению с вами - лучше или хуже.

Шлопы не имеют значения. Важно время на единицу работы. Вы никогда не будете соответствовать параметрам проектирования вашего оборудования, потому что вы не используете тесты, которые ожидали дизайнеры вашего оборудования.

LINPACK не имеет значения. Важна ваша кодовая база и изменения, которые вы вносите для повышения производительности.

2 голосов
/ 02 сентября 2013

Старый вопрос со старыми, если популярными, ответами, которые не совсем хороши, ИМО.

«FLOP» - математическая операция с плавающей точкой. «FLOPS» может означать одну из двух вещей:

  • Простое множественное число слова «FLOP» (то есть «операция X занимает 50 FLOP»)
  • Скорость FLOP в первом смысле (то есть математические операции с плавающей запятой в секунду)

Там, где неясно из контекста, что из них имеет в виду, часто устраняется неоднозначностью, записывая первое как «FLOPs», а второе как «FLOP / s».

FLOP являются так называемыми, чтобы отличать их от других операций ЦП , таких как целочисленные математические операции, логические операции, побитовые операции, операции с памятью и операции ветвления, которые имеют разные затраты (читай « занимать разное время »), связанное с ними.

Практика «подсчета FLOP» восходит к самым ранним дням научных вычислений, когда FLOP были, относительно говоря, чрезвычайно дорогими, занимая много циклов ЦП каждый. Например, математический сопроцессор 80387 потребовал около 300 циклов для одного умножения. Это было за время до конвейерной обработки и до того, как пропасть между тактовыми частотами ЦП и скоростями памяти действительно открылась: операции с памятью занимали всего один или два цикла, а ветвление («принятие решений») было таким же дешевым. Тогда, если бы вы могли исключить один FLOP в пользу дюжины обращений к памяти, вы выиграли. Если вы можете устранить один FLOP в пользу дюжины веток, вы выиграли. Итак, в прошлом имело смысл подсчитывать FLOP и не беспокоиться о ссылках на память и ветвлениях, потому что FLOP сильно доминировали во времени выполнения , поскольку они были очень дорогими по сравнению с другими видами операций.

В последнее время ситуация изменилась. FLOP стали очень дешевыми - любой современный процессор Intel core может выполнять около двух FLOP за цикл (хотя разделение остается относительно дорогим), а доступ к памяти и ветвям сравнительно намного дороже: попадание в кэш L1 может стоить 3 или 4 цикла, выборка из основной памяти стоит 150–200. Учитывая эту инверсию, уже не тот случай, когда устранение FLOP в пользу доступа к памяти приведет к выигрышу ; на самом деле это маловероятно. Точно так же зачастую дешевле просто «сделать» FLOP, даже если он избыточен, а не решать, делать это или нет. Это в значительной степени полная противоположность ситуации 25 лет назад.

К сожалению, практика слепого FLOP-подсчета как абсолютной метрики алгоритмического достоинства сохранилась далеко за пределами своей даты продажи. Современные научные вычисления гораздо больше касаются управления пропускной способностью памяти - пытаясь удерживать исполнительные блоки, которые делают FLOP, постоянно снабженными данными - чем речь идет об уменьшении количества FLOP. Ссылка на LINPACK (которая была по существу устаревшей LAPACK 20 лет назад) заставляет меня подозревать, что ваш работодатель, вероятно, имеет очень старую школу, которая не усвоила тот факт, что создание ожидаемые результаты больше не являются просто подсчетом FLOP. Решатель, который делает вдвое больше FLOP, может быть в двадцать раз быстрее, чем другой, если он имеет гораздо более выгодную схему доступа к памяти и структуру данных.

Результатом всего этого является то, что оценка производительности программного обеспечения с интенсивными вычислениями стала намного более сложной, чем раньше . Тот факт, что FLOP стали дешевыми, чрезвычайно усложняется огромной вариабельностью стоимости операций с памятью и веток. Когда дело доходит до оценки алгоритмов , простой подсчет FLOP просто не учитывает общие ожидания производительности.

Возможно, лучший способ думать о PerfoОжидания и оценка романтики обеспечиваются так называемой моделью линии крыши , которая далека от совершенства, но имеет то преимущество, что заставляет вас задуматься о компромиссе между проблемами с плавающей запятой и пропускной способностью памяти в то же время , предоставляя более информативную и проницательную «2D картинку», которая позволяет сравнивать измерения производительности и ожидания производительности.

Стоит посмотреть.

1 голос
/ 12 июня 2009

Я бы просто попытался заставить его работать как можно быстрее, и для этого нужно выяснить, где он проводит время, особенно если есть вызовы функций, которых можно было бы избежать.

Я делаю это простым способом, просто прерывая его несколько раз во время работы и наблюдая за тем, что он делает. Вот что я нахожу:

  • Большую часть времени он находится в процессе вычисления производной и / или якобиана. Большую часть этого времени можно использовать для вызовов математических функций, таких как exp(), log() и sqrt(). Часто они повторяются с одинаковыми аргументами и могут быть запомнены. (Массовое ускорение.)

  • Большая часть времени затрачивается на вычисление производных слишком много раз, поскольку допуски интегрирования более жесткие, чем необходимо. (Faster)

  • Если используется неявный алгоритм интеграции (такой как DLSODE Gear), потому что уравнения считаются жесткими, скорее всего, нет, и можно использовать что-то вроде Рунге-Кутты. (DVERK). (Еще быстрее)

  • Возможно, можно использовать матричный алгоритм экспоненты, если модель является линейной (DGPADM). Это большой выигрыш как по производительности, так и по точности, и он невосприимчив к жесткости. (Намного быстрее)

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

Вы можете рассматривать каждый уровень стека как возможность находить вещи для оптимизации, и ускорения будут увеличиваться. Затем, когда вы переходите на мультипроцессор, предполагая, что он распараллеливается, это должно обеспечивать собственный множитель.

Итак, вернемся к FLOP. Вы можете попытаться максимизировать FLOPs / second, но также может быть гораздо полезнее минимизировать FLOPs / run, оптимизируя на всех уровнях стека. В любом случае, просто измерение их почти ничего не говорит.

1 голос
/ 30 ноября 2008

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

0 голосов
/ 30 ноября 2008

Я не думаю, что измерение FLOPS будет очень полезным.

Количество достигнутых FLOPS скажет вам, насколько ваш алгоритм удерживает процессор, но не скажет, насколько хорошо работает ваш алгоритм.

Вы можете найти два разных алгоритма, которые заставляют процессор выполнять одинаковое количество FLOPS, но один предоставляет вам желаемый результат в половину времени.

Я думаю, что вам лучше посмотреть статистику «более высокого уровня», такую ​​как число дифференциальных уравнений, решаемых за единицу времени (что, в конце концов, и является целью вашего алгоритма).

С другой стороны, измерение количества достигнутых FLOPS может помочь вам улучшить ваш алгоритм, поскольку он покажет вам, насколько вы заняты процессором.

0 голосов
/ 30 ноября 2008

Ваш работодатель прав.
Единственный способ измерить эффективность вашей программы на Фортране (или любой другой программы, кстати) - это проверить ее на соответствие стандартным тестам, если они существуют.

И, что касается FLOP, это означает «операции с плавающей запятой в секунду» - см. Определение в Википедии.

...