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

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

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

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

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

Intel Core 2 и Nehalem:

4 DP FLOPs / цикл: добавление SSE2 шириной 2 + умножение SSE2 шириной 2

8 SP FLOPs/ цикл: добавление SSE 4 в ширину + умножение SSE 4 в ширину

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

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

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-упакованные (векторные) инструкции (4x32bit = 128bit). Оба имеют пропускную способность 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

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