задержка магазина simd - PullRequest
       15

задержка магазина simd

1 голос
/ 08 декабря 2011

У меня есть следующий тип кода

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, то общая производительность не улучшится, но ожидание будет разделено поровну между каждым доступом, а не только первым.

1 Ответ

6 голосов
/ 08 декабря 2011

Вместо создания SIMD-хранилища с последующей скалярной загрузкой следует использовать _mm_extract_epi16 (PEXTRW) для получения 16-битных скалярных значений непосредственно из 128-битного регистра SSE без использования памяти, например,

outp[0] = _mm_extract_epi16(some_m128i_value, 6);
...