индексация в массив с SSE - PullRequest
       4

индексация в массив с SSE

12 голосов
/ 19 декабря 2010

Предположим, у меня есть массив:

uint8_t arr[256];

и элемент

__m128i x

, содержащий 16 байтов,

x_1, x_2, ... x_16

.новый __m128i элемент

__m128i y

со значениями от arr в зависимости от значений в x, такой что:

y_1  = arr[x_1]
y_2  = arr[x_2]
   .
   .
   .
y_16 = arr[x_16]

Команда для достижения этого по существу будет загружатьсярегистр из несмежного набора областей памяти.У меня мучительно смутное воспоминание о том, что я видел документацию по такой команде, но сейчас не могу ее найти.Это существует?Заранее благодарим за помощь.

1 Ответ

7 голосов
/ 19 декабря 2010

Этот тип возможностей в архитектурах SIMD известен как загрузка / сохранение / разброс / сбор данных.К сожалению, у SSE его нет.У будущих SIMD-архитектур от Intel это может быть - злополучный процессор Larrabee был одним из примеров.Пока что вам нужно будет просто спроектировать свои структуры данных таким образом, чтобы подобный функционал не требовался.

Обратите внимание, что вы можете добиться эквивалентного эффекта, например, используя _mm_set_epi8:

y = _mm_set_epi8(arr[x_16], arr[x_15], arr[x_14], ..., arr[x_1]);

хотя, конечно, это просто сгенерирует скалярный код для загрузки вашего вектора y.Это хорошо, если вы выполняете этот тип операций вне каких-либо циклов, критичных к производительности, например, как часть инициализации перед циклом, но внутри цикла это, вероятно, будет причиной снижения производительности.

...