У меня есть следующий тип кода
short v[8] __attribute__ (( aligned(16)));
...
// in an inlined function :
_mm_store_si128(v, some_m128i_value);
... // some more operation (4 additions )
outp[0] = v[1] / 2; // <- first access of v since the previous store
Когда я аннотирую этот код с помощью perf, эта единственная строка составляет 18% всей выборки!Когда я говорю строку, она находится на уровне сборки, то есть инструкция сразу после перехода от v считать на 18%
Это ошибка кэша?Как я могу это проверить?
Мне на самом деле не нужно сохранять результат, но как я могу избежать обращения к памяти и по-прежнему индивидуально обращаться к 8 коротким, составляющим мое значение m128i.
Обновление: если я использую _mm_extract_epi16, то общая производительность не улучшится, но ожидание будет разделено поровну между каждым доступом, а не только первым.