Операции с плавающей запятой за цикл - 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.