Производительность цикла кода C [продолжение]

Этот вопрос продолжает мой вопрос здесь (по совету Mystical):

Производительность цикла кода C


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

for(int i=0; i

Измеренная производительность этого ядра составляет около 5,6 операций FP за цикл, хотя я ожидаю, что она будет ровно в 4 раза выше, чем у скалярной версии, т. е. 4,1,6 = 6,4 операций FP за цикл.

С учетом хода весового коэффициента (спасибо, что указали на это), расписание выглядит так:

schedule

Похоже, что расписание не меняется, хотя после movss есть лишняя инструкция операция, которая перемещает скалярное значение веса в регистр XMM, а затем использует shufpsдля копирования этого скалярного значения во весь вектор. Похоже, что весовой вектор готов к использованию для mulpsво времени, принимая во внимание задержку переключения с нагрузки на область с плавающей запятой, так что это не должно вызвать дополнительной задержки.

Инструкции movaps(выровненное, упакованное перемещение), addpsи mulps, которые используются в этом ядре (проверено с помощью ассемблерного кода), имеют одинаковую задержку. & пропускная способность как их скалярные версии, поэтому это также не должно вызывать дополнительных задержек.

Есть ли у кого-нибудь идеи, на что тратится этот дополнительный цикл из 8 тактов, если предположить, что максимальная производительность, которую может получить это ядро, составляет 6,4 операций FP за цикл, а оно работает со скоростью 5,6 операций FP за цикл?


Кстати, вот как выглядит реальная сборка:

…
Block x: 
  movapsx  (%rax,%rcx,4), %xmm0
  movapsx  0x10(%rax,%rcx,4), %xmm1
  movapsx  0x20(%rax,%rcx,4), %xmm2
  movapsx  0x30(%rax,%rcx,4), %xmm3
  movssl  (%rdx,%rcx,4), %xmm4
  inc %rcx
  shufps $0x0, %xmm4, %xmm4               {fill weight vector}
  cmp $0x32, %rcx 
  mulps %xmm4, %xmm0 
  mulps %xmm4, %xmm1
  mulps %xmm4, %xmm2 
  mulps %xmm3, %xmm4
  addps %xmm0, %xmm5 
  addps %xmm1, %xmm6 
  addps %xmm2, %xmm7 
  addps %xmm4, %xmm8 
  jl 0x401ad6 

83
задан Community 23 May 2017 в 11:54
поделиться