FLOPS что на самом деле FLOP

Я пришел из этой темы: шлепает ядро ​​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 ответов

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

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

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

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

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

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

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

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

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

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

  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]

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

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

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

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

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

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

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 публикует действительные коды операций где-нибудь, если вы действительно заинтересованы.

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

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

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

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

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

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

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

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

Другие вопросы по тегам