FLOPS что на самом деле FLOP - PullRequest
3 голосов
/ 09 октября 2009

Я пришел из этой ветки: ПОЛЫ ядро ​​Intel и тестирование его с C (innerproduct)

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

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

  2. Если я хочу измерить FLOPS, скажем, я делаю внутреннее произведение двух векторов. Должны ли два вектора быть плавающими []? Как изменится измерение, если я использую 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 числа с плавающей запятой на процессор без какого-либо конкретного значения для этого?

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

Ответы [ 9 ]

4 голосов
/ 09 октября 2009

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 (!) Байтов.

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

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

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

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

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

1 голос
/ 09 октября 2009

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

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

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

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

0 голосов
/ 14 октября 2009

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

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

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

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

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

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

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

  2. Элементы вектора должны быть плавающими, двойными или длинными двойными. Внутренний расчет продукта будет медленнее, чем если бы элементы были целыми числами.

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

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

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

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

0 голосов
/ 09 октября 2009

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

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

0 голосов
/ 09 октября 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]
0 голосов
/ 09 октября 2009

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

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

0 голосов
/ 09 октября 2009

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

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

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

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

...