Редактировать 3: Изображения являются ссылками на полноразмерные версии. Извините за изображения в тексте, но графики будут трудно скопировать/вставить в текстовую таблицу.Что может привести к тому, что один и тот же код SSE будет работать несколько раз медленнее в той же функции?
У меня есть следующий профиль VTune для программы, составленной с icc --std=c++14 -qopenmp -axS -O3 -fPIC
:
В этом профиле, две группы команд, выделены в окне сборки. Верхний кластер занимает значительно меньше времени, чем нижний, несмотря на то, что инструкции идентичны и в одном порядке. Оба кластера расположены внутри одной и той же функции и, очевидно, оба называются n
раз. Это происходит каждый раз, когда я запускаю профилировщик, как на Westmere Xeon, так и на ноутбуке Haswell, который я использую прямо сейчас (скомпилирован с SSE, потому что сейчас я нацеливаюсь и участвую в обучении).
Что мне не хватает?
Игнорируйте плохую параллельность, это, скорее всего, связано с дросселированием ноутбука, поскольку на настольном компьютере Xeon этого не происходит.
Я считаю, что это не пример микро-оптимизации, так как эти три вместе составляют достойное% от общего времени, и меня действительно интересует возможная причина такого поведения.
Edit:OMP_NUM_THREADS=1 taskset -c 1 /opt/intel/vtune...
же профиль, хотя и с несколько более низким ИПЦ на этот раз.
выравнивание данных –
@SegFault Тогда это было бы в время загрузки из памяти или кэша в регистрах, который является 'movapsx' инструкция здесь?. это всего лишь операции FPU, насколько я понимаю. – iksemyonov
Многопоточность? Ваше изображение трудно читать, но, возможно, FPU занят другими вещами в одном из случаев ... –