Intel corporate blog
High performance
Programming
Assembler
System Programming
Comments 27
+3
Злодей номер два.


Не могу повторить (Intel B960).
Вот этот код выполняется приблизительно одинаковое время при любом значении в fptest.

  for (int b = 0; b < 100000000; b++)
  {
    a += int(2 + fptest);
00231020  movsd       xmm0,mmword ptr ds:[233018h]  
00231028  addsd       xmm0,xmm1  
0023102C  cvttsd2si   ecx,xmm0  
00231030  add         edi,ecx  
00231032  dec         edx  
00231033  jne         main+20h (0231020h)  
  }

+3
Сейчас проверю последний раз этот пример я запускал 2 года назад. Наверное, -fast-math включился, он отбрасывает denormals. Но код вроде правильный сгенерился.
+2
У меня были примеры с денормалами. И если на SB & YB они нормально тормозили, то на haswell все стало быстро как с нормальными числами.
+1
да, я что-то код сверху не могу заставить тормозить, исполняю как раз на HSW. Схожу в лабу на SNB проверю, как раз выдран с реального кода на SNB.
+2
Ну еще совсем простой пример. David Dice рассказывал про случай, когда просто доступ к чужой NUMA пямяти на 8-сокетной системе (за 2 хопа) занимал > 1000 тактов.
0
Только чтобы подключить старое железо — старше broadwell и skylake, или редкое/мелкое. Весь зоопарк постоянно держать подключеным места не хватает, да и зачем — очень редко нужно.
0
div [memory]?
Ну хотя тут десятки тактов, даже если кэш-промах.
Еще вариант — syscall / sysenter. Там сотни тактов, емнип.
0
Да, десятки и сотни, все примеры из статьи кроме fy2x — тысячи.
+1
FYl2X — я так понимаю, параллелится с обычными инструкциями на ура?
+3
Эта инструкция декодируется в длинный микрокод, так что нет (то есть этот микрокод, понятно, ипользует ILP внутри себя, но следующие инструкции ждут).
0
Хм. А я думал что FP ядро слегка независимо от целочисленного. Отстал от жизни на пять поколений процессоров, видимо :D
+2
В Atom еще почти независимое. Но даже там в этом микрокоде полно load/store, которые занимают обычные порты. а в HSW core просто 8 портов, некоторые содержат в том числе execution units, работающие с fp.
+1
То есть старый трюк «бесплатной» плавающей точки исчез в результате интеграции, зато большинство инструкций стало просто не настолько медленные, так?
0
Неужели логарифм по основанию 2 так долго считается? Есть ли аналоги для расчёта логарифма? AVX и SSE содержат что-либо для расчёта тригонометрических и экспоненциальных функций? Или только приблизительно можно считать?
0
AVX и SSE содержат достаточно простые инструкции. Скорее всего, если на них написать свой логарифм, может быть быстрее.
+2
WBINV надо быть в ring 0, ее неожиданно в пользовательском коде оказаться не может. Кстати, она сама не очень медленная, тормоза начинаются потом, когда оказывается что кэш пустой.
+1
Вы правы. Остается тогда только CLFLUSH, а он уже не такой медленный.
0
А вот вопрос, зачем ты в последнем примере делаешь цикл на 8К? ;)
Сдается мне, что тут ты сгущаешь краски ;)
+2
А, это от vtune осталось, иначе ивенты не ловились. Конечно можно один раз померить, будет несколько тысяч циклов. Спасибо, поправлю.
+1
этот код заставит все остальные ядра тоже остановиться на перекур на срок в несколько тысяч тактов


Как это будет себя вести в VM? Можно заДОСсить соседей по VM?
0
Можно, даже если другие VM работают на других ядрах. Но для многопроцессорного сервера — только соседей по процессору. VM можно запрограмировать это ловить и давать таким гостям совсем мало тактов, но вроде это нигде пока не реализовано.
0
Насколько я понимаю, что с того момента, когда Intel похоронила SMP, самые дорогие операции — это операции связанные с инвалидацией кешей у «соседей».
0
Да, выше уже написали, что еще это может быть особенно дорого на Xeon-EX, там NUMA особенно злая.
0
Если с splitlock как в примере, то несущественная. Если без сплитлока, надо измерять, не знаю так.
Only those users with full accounts are able to leave comments. , please.