Флопы, что на самом деле такое Флоп

Я пришел из этой темы: Ядро Intel FLOPS и тестирование его с помощью C (внутренний продукт)

Когда я начал писать простые тестовые сценарии, у меня возникло несколько вопросов.

  1. Почему с плавающей запятой? Что такого важного в плавающей запятой, что мы должны учитывать? Почему не просто int?

  2. Если я хочу измерить FLOPS, скажем, я делаю внутренний продукт двух векторов. Должны ли два вектора быть float[] ? Как изменится измерение, если я использую int[]?

  3. Я не знаком с архитектурой Intel. Допустим, у меня есть следующие операции:

    float a = 3.14159; float b = 3.14158;
    for(int i = 0; i < 100; ++i) {
        a + b;
    }
    

    Сколько это "операций с плавающей запятой"?

  4. Я немного запутался, потому что изучал упрощенную 32-битную архитектуру MIPS. Для каждой инструкции есть 32 бита, например, 5 бит для операнда 1 и 5 бит для операнда 2 и т. д., поэтому для архитектур Intel (в частности, той же архитектуры из предыдущего потока) мне сказали, что регистр может содержать 128 бит. Для ОДИНОЧНОЙ ТОЧНОСТИ с плавающей запятой, 32 бита на число с плавающей запятой, означает ли это, что для каждой инструкции, подаваемой в процессор, она может принимать 4 числа с плавающей запятой? Разве мы не должны также учитывать биты, используемые в операндах и других частях инструкции? Как мы можем просто передать процессору 4 числа с плавающей запятой без какого-либо конкретного значения?

Я не знаю, имеет ли смысл мой подход к мышлению всего по кусочкам. Если нет, то на какую «высоту» перспективы я должен смотреть?


person Community    schedule 09.10.2009    source источник
comment
en.wikipedia.org/wiki/FLOPS   -  person Todd Gamblin    schedule 09.10.2009
comment
@tgambin, пожалуйста, прочитайте это, прежде чем комментировать. На этой странице нет ответа на мой вопрос   -  person    schedule 09.10.2009
comment
Я хочу подсчитать количество голов: скажем, у меня есть инструкция, содержащая 3 числа с плавающей запятой. Он берет первые два, умножает их и прибавляет к третьему. Считается ли это одной операцией с плавающей запятой? Как учитывать сингулярность операции с плавающей запятой, если она включает более одного числа с плавающей запятой? Кроме того, могу ли я предположить, что операция в основном представляет собой одну инструкцию?   -  person    schedule 09.10.2009
comment
Мы используем математику с плавающей запятой в компьютерах по той же причине, по которой мы учим школьников дробям и десятичным точкам.   -  person Crashworks    schedule 15.10.2009


Ответы (9)


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

2.) Они оба должны быть плавающими. ЦП не будет добавлять целое число и число с плавающей запятой, одно или другое будет неявно преобразовано (скорее всего, целое число будет преобразовано в число с плавающей запятой), поэтому это все равно будут операции с плавающей запятой.

3.) Это будет 100 операций с плавающей запятой, а также 100 целочисленных операций, а также несколько (100?) операций управления потоком/ветвления/сравнения. Обычно также были бы загрузки и магазины, но вы, похоже, не сохраняете значение :)

4.) Не знаю, с чего начать, кажется, у вас есть общий взгляд на материал, но вы перепутали некоторые детали. Да, отдельная инструкция может быть разделена на разделы, подобные:

|OP CODE | Operand 1 | Operand 2 | (among many, many others)

Однако операнд 1 и операнд 2 не обязательно должны содержать фактические добавляемые значения. Они могут просто содержать регистры, которые нужно добавить. Например, возьмите эту инструкцию SSE:

mulps      %%xmm3, %%xmm1

Он говорит исполнительному блоку перемножить содержимое регистра xmm3 и содержимое регистра xmm1 и сохранить результат в xmm3. Поскольку регистры содержат 128-битные значения, я выполняю операцию со 128-битными значениями, это не зависит от размера инструкции. К сожалению, x86 не имеет такой же структуры команд, как MIPS, поскольку это архитектура CISC. Инструкция x86 может иметь от 1 до 16(!) байтов.

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

person Falaina    schedule 09.10.2009
comment
Хорошо, допустим, теоретически вы можете ввести 16 байтов на инструкцию. Тогда 16 byes просто хороши для 4 чисел с плавающей запятой. Независимо от того, сколько чисел с плавающей запятой содержит эта инструкция, она все равно считается 1 операцией с плавающей запятой, верно? Если у меня есть инструкция, содержащая 3 числа с плавающей запятой, это по-прежнему работает с 1 числом с плавающей запятой, верно? - person ; 09.10.2009

  1. Операции с плавающей запятой и целочисленные операции используют разные конвейеры на чипе, поэтому они работают с разной скоростью (на простых/достаточно старых архитектурах может вообще не быть встроенной поддержки с плавающей запятой, что делает операции с плавающей запятой очень медленными) . Поэтому, если вы пытаетесь оценить реальную производительность для задач, использующих математику с плавающей запятой, вам нужно знать, насколько быстры эти операции.

  2. Да, вы должны использовать данные с плавающей запятой. См. № 1.

  3. FLOP обычно определяется как среднее значение для определенной комбинации операций, которое предназначено для представления проблемы реального мира, которую вы хотите смоделировать. Для вашего цикла вы просто считаете каждое добавление как 1 операцию, что в сумме дает 100 операций. НО: это не относится к большинству реальных рабочих мест, и вам, возможно, придется принять меры, чтобы компилятор не оптимизировал всю работу.

  4. Vectorized или SIMD (Single Instruction Multiple Data) могут сделать именно это. Примеры систем SIMD, используемых прямо сейчас, включают AltiVec (на чипах серии PowerPC) и MMX/SSE/... на Intel x86 и совместимых. Такие улучшения в микросхемах должны получить признание за выполнение большей работы, поэтому ваш тривиальный цикл, описанный выше, все равно будет считаться 100 операциями, даже если имеется только 25 циклов выборки и обработки. Компиляторы либо должны быть очень умными, либо получать подсказки от программиста, чтобы использовать модули SIMD (но большинство передовых компиляторов в наши дни очень умны).

person dmckee --- ex-moderator kitten    schedule 09.10.2009
comment
+1 за замечание, что оптимизатор может оптимизировать этот цикл. - person Jonathan Leffler; 15.10.2009

Операций с плавающей запятой в секунду.

http://www.webopedia.com/TERM/F/FLOPS.html

Ваш пример - 100 операций с плавающей запятой (сложение двух чисел с плавающей запятой вместе - это одна операция с плавающей запятой). Выделение чисел с плавающей запятой может учитываться или не учитываться.

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

person Robert Harvey    schedule 09.10.2009
comment
Если ЦП имеет модуль с плавающей запятой, который изначально использует формат с двойной точностью, выполнение вычислений для двойных чисел будет быстрее, чем для одиночных, поскольку не требуется никакого преобразования формата. Но, как вы заметили, не все операции с плавающей запятой одинаково быстры. С точки зрения количества тактовых циклов ЦП, как правило, (сложение == вычитание) ‹ умножение ‹ деление. Некоторые FPU даже имеют различные трансцендентные функции, такие как sin, cos, e ^ x, x ^ l, ln и т. Д., И они НАМНОГО медленнее, чем деление. На самом деле вам нужно посмотреть документацию по процессору, чтобы получить подробную информацию. - person Bob Murphy; 09.10.2009

1) Поскольку многие реальные приложения работают с большим количеством чисел с плавающей запятой, например, все векторные приложения (игры, САПР и т. д.) почти полностью зависят от операций с плавающей запятой.

2) FLOPS для операций с плавающей запятой.

3) 100. Управление потоком использует целочисленные операции.

4) Эта архитектура лучше всего подходит для ALU. Представления с плавающей запятой могут использовать 96-128 бит.

person Rodrigo    schedule 09.10.2009

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

Архитектура Intel началась с простых 80-битных инструкций с плавающей запятой, которые можно загружать или сохранять в 64-битных ячейках памяти с округлением. Позже они добавили инструкции SSE, которые используют 128-битные регистры и могут выполнять несколько операций с плавающей запятой с единая инструкция.

person Mark Ransom    schedule 09.10.2009

Фу, упрощенный MIPS. Как правило, это нормально для вводных курсов. Я собираюсь взять книгу Хеннеси/Паттерсона?

Прочтите инструкции MMX для архитектуры Pentium (586) для подхода Intel. Или, в более общем смысле, изучите архитектуры SIMD, также известные как архитектуры векторных процессоров. Они были впервые популяризированы суперкомпьютерами Cray (хотя я думаю, что было несколько предшественников). Чтобы узнать о современном подходе SIMD, см. подход CUDA от NVIDIA или различные процессоры DSP, представленные на рынке.

person Paul Nathan    schedule 09.10.2009

  1. Скорость вычислений с плавающей запятой имела большое значение для научных вычислений и компьютерной графики.
  2. По определению нет. В этот момент вы тестируете целочисленную производительность.
  3. 302, см. ниже.
  4. x86 и x64 сильно отличаются от MIPS. MIPS, будучи архитектурой RISC (компьютер с сокращенным набором команд), имеет очень мало инструкций по сравнению с архитектурой CISC (компьютер со сложным набором команд) в предложениях Intel и AMD. Для декодирования инструкций x86 использует инструкции переменной ширины, поэтому инструкции имеют длину от одного до 16 байтов (включая префиксы, они могут быть больше)

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

fld  A      //st=[A]
fld  B      //st=[B, A]
Loop:
fld st(1)   //st=[A, B, A]
fadd st(1)  //st=[A + B, B, A]
fstp memory //st=[B, A]
person Patrick    schedule 09.10.2009
comment
большинство компиляторов, вероятно, будут помещать a и b в регистры только один раз. это оставляет операцию сложения, которая сохраняет результат в другой регистр, поэтому точная сумма, вероятно, составляет 102 FLOPS. с другой стороны, компиляторы могут оптимизировать весь этот цикл и просто оставить вам 2 хранилища с плавающей запятой. - person Igor Serebryany; 09.10.2009
comment
Основываясь на том, что я знаю о стеке с плавающей запятой x86, я не думаю, что это правильно. Я изменил свой ответ, добавив, что это может быть возможно. Но мы оба знаем, что любой достойный компилятор удалит весь набор операторов из-за отсутствия каких-либо побочных эффектов! :) - person Patrick; 09.10.2009

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

  2. Элементы вектора должны быть типа float, double или long double. Вычисление внутреннего продукта будет медленнее, чем если бы элементы были целыми.

  3. Это будет 100 добавлений с плавающей запятой. (То есть, если только компилятор не понял, что с результатом ничего не делается, и не оптимизирует все целиком.)

  4. Компьютеры используют множество внутренних форматов для представления чисел с плавающей запятой. В приведенном вами примере ЦП преобразует 32-битное число с плавающей запятой в свой внутренний 128-битный формат, прежде чем выполнять операции с числом.

В дополнение к использованию, упомянутому в других ответах, люди, называемые «квантами», в наши дни используют математику с плавающей запятой для финансов. Парень по имени Дэвид Э. Шоу начал применять математику с плавающей запятой для моделирования Уолл-стрит в 1988 году, и по состоянию на 30 сентября 2009 года его состояние оценивалось в 2,5 миллиарда долларов, и он занимал 123-е место в списке 400 самых богатых американцев Forbes.

Так что стоит немного узнать о математике с плавающей запятой!

person Bob Murphy    schedule 09.10.2009

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

2) Если два вектора являются целыми, вы не будете измерять FLOPS. Если один вектор имеет тип int, а другой — число с плавающей запятой, вы будете выполнять множество преобразований int->float, и нам, вероятно, следует рассматривать такое преобразование как FLOP.

3/4) Операции с плавающей запятой в архитектурах Intel действительно весьма экзотичны. На самом деле это набор инструкций с одним операндом на основе стека (обычно). Например, в вашем примере вы должны использовать одну инструкцию с кодом операции, которая загружает операнд памяти в верхнюю часть стека FPU, а затем вы должны использовать другую инструкцию с кодом операции, которая добавляет операнд памяти в верхнюю часть стека FPU. , а затем, наконец, еще одна инструкция с кодом операции, которая перемещает вершину стека FPU в операнд памяти.

На этом сайте перечислены многие операции.

http://www.website.masmforum.com/tutorials/fptute/appen1.htm

Я уверен, что Intel где-то публикует фактические коды операций, если вам действительно это интересно.

person ajs410    schedule 14.10.2009
comment
Компиляторы действительно не должны больше использовать основанные на стеке инструкции x87 FPU; они были объявлены устаревшими SSE, которая имеет новый, гораздо более быстрый набор скалярных инструкций с плавающей запятой. Конечно, несмотря на введение SSE десять лет назад, GCC по-прежнему демонстративно игнорирует его по умолчанию. - person Crashworks; 15.10.2009