операций с плавающей запятой за цикл - Intel

Я долго искал и, похоже, не могу найти официальную / окончательную цифру, указывающую количество операций с плавающей запятой одинарной точности / тактовый цикл, которые может выполнить четырехъядерный процессор Intel Xeon. У меня четырехъядерный процессор Intel Xeon E5530.

Я надеюсь использовать его для расчета максимального теоретического FLOP / s, которого может достичь мой процессор.

MAX FLOPS = (# Количество ядер) * (Тактовая частота (циклов / сек)) * (# FLOPS / цикл)

Было бы полезно все, что указывало бы мне в правильном направлении. Я нашел этот FLOPS за цикл для песчаных- мост и haswell SSE2 / AVX / AVX2

Intel Core 2 и Nehalem:

4 DP FLOP / цикл: 2-кратное сложение SSE2 + 2-кратное умножение SSE2

8 SP FLOP / цикл: 4-кратное сложение SSE + 4-кратное умножение SSE

Но я не уверен, где были найдены эти цифры. Предполагают ли они операцию слитного умножения и сложения (FMAD)?

РЕДАКТИРОВАТЬ: Используя это, в DP я вычисляю правильную арифметическую пропускную способность DP, указанную Intel как 38,4 GFLOP / s (процитировано здесь). Для SP я получаю вдвое больше, 76,8 GFLOP / s. Я почти уверен, что 4 DP FLOP / цикл и 8 SP FLOP / цикл являются правильными, я просто хочу подтвердить, как они получили значения FLOP / цикл 4 и 8.


person user3495341    schedule 21.04.2014    source источник
comment
(8 SP FLOP / цикл) * (4 ядра) * (2,4 ГГц) = 76,8 GFLOP / с. Процессор может выполнять инструкции сложения и умножения в каждом цикле. Но они не срослись.   -  person Mysticial    schedule 21.04.2014
comment
Вы, вероятно, не можете найти официальный номер, потому что его нет - он сильно зависит от набора инструкций, которые у вас есть, и зависимостей между ними. Теоретический максимум можно вычислить, но существует очень мало полезных реальных программ (кроме синтетических тестов), которые имели бы точно правильное сочетание инструкций в точном правильном порядке для достижения этого максимума ...   -  person twalberg    schedule 21.04.2014
comment
А если вам интересно узнать, как достичь максимального значения FLOP / s, обратите внимание на: stackoverflow.com/questions/8389648/ Это для двойной точности, но его можно легко изменить до одинарной точности.   -  person Mysticial    schedule 21.04.2014
comment
На практике часто требуется загрузить / сохранить данные, а также произвести вычисления. Таким образом, хотя теоретические значения пиковых значений FLOPS хорошо известны, это не очень полезно, если данные не могут быть прочитаны достаточно быстро, чтобы достичь этого. Более полезная метрика также дает количество загрузок / сохранений с плавающей запятой, которые могут быть получены как while. Например, ядро ​​SB может загружать 4 двойных за такт и выполнять 8 двойных операций (4 умножения и 4 сложения) за такт. Получить его сложнее, чем просто произвести расчет.   -  person Z boson    schedule 22.04.2014


Ответы (1)


Nehalem может выполнять 4 DP или 8 SP FLOP / цикл. Это достигается с помощью SSE, который работает с упакованными значениями с плавающей запятой, 2 / регистр в DP и 4 / регистр в SP. Для достижения 4 DP FLOP / цикл или 8 SP FLOP / цикл ядро ​​должно выполнять 2 инструкции SSE за цикл. Это достигается путем выполнения MULDP и ADDDP (или MULSP и ADDSP) за цикл. Причина, по которой это возможно, заключается в том, что Nehalem имеет отдельные исполнительные блоки для SSE-умножения и SSE-сложения, и эти блоки конвейерные, так что throughput - это одно умножение и одно добавление за цикл. Умножения находятся в конвейере умножителя для 4 циклов в SP и 5 циклов в DP. Добавления находятся в конвейере в течение 3 циклов независимо от SP / DP. Количество циклов в конвейере известно как latency. Все, что вам нужно знать, чтобы вычислить пиковое значение FLOP / цикл, - это пропускная способность. Таким образом, при пропускной способности в 1 векторную инструкцию SSE / цикл как для умножителя, так и для сумматора (2 исполнительных блока) у вас есть 2 x 2 = 4 FLOP / цикл в DP и 2 x 4 = 8 FLOP / цикл в SP. Чтобы действительно поддерживать эту пиковую пропускную способность, вам необходимо учитывать задержку (чтобы у вас было как минимум столько же независимых операций в конвейере, сколько глубина конвейера), и вам нужно подумать о том, чтобы можно было подавать данные достаточно быстро. Nehalem имеет встроенный контроллер памяти, способный обеспечить очень высокую пропускную способность из памяти, чего он может достичь, если средство предварительной выборки данных правильно предвидит шаблон доступа к данным (последовательная загрузка из памяти - это тривиальный шаблон, который он может предвидеть). Как правило, пропускной способности памяти недостаточно для поддержки подачи данных на все ядра при пиковом FLOP / цикл, поэтому необходимо некоторое количество повторного использования данных из кеша для поддержания пикового FLOP / цикл.

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

См. Стр. 105 8.9 Исполнительные единицы этого документа.

http://www.agner.org/optimize/microarchitecture.pdf

В нем говорится, что для Нехалема

Множитель с плавающей запятой на порту 0 имеет задержку 4 для одинарной точности и 5 для двойной и длинной двойной точности. Пропускная способность умножителя с плавающей запятой составляет 1 операцию за такт, за исключением длинной двойной точности на Core2. Сумматор с плавающей запятой подключен к порту 1. Он имеет задержку 3 и полностью конвейерный.

Чтобы получить 8 SP FLOP / цикл, вам нужно 4 SP ADD / цикл и 4 SP MUL / цикл. Сумматор и умножитель находятся на отдельных исполнительных модулях и отправляются из отдельных портов, каждый может одновременно выполнять 4 упакованных операнда SP с использованием упакованных (векторных) инструкций SSE (4x32 бит = 128 бит). Оба имеют пропускную способность 1 операцию за такт. Чтобы получить эту пропускную способность, вам необходимо учитывать задержку ... сколько циклов после выдачи инструкций, прежде чем вы сможете использовать результат ... поэтому вам нужно выпустить несколько независимых инструкций, чтобы покрыть задержку. У множителя с одинарной точностью задержка равна 4, а у сумматора - 3.

Вы можете найти те же значения пропускной способности и задержки для Nehalem в руководстве по оптимизации Intel, таблица C-15a.

http://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-optimization-manual.html

person amdn    schedule 21.04.2014