эффективный способ преобразования индексов разброса в индексы сбора?

Я пытаюсь написать сжатие потока (взять массив и избавиться от пустых элементов) с помощью встроенных функций SIMD. Каждая итерация цикла обрабатывает 8 элементов за раз (ширина SIMD).

Благодаря встроенным функциям SSE я могу сделать это довольно эффективно с помощью _mm_shuffle_epi8 (), которая выполняет поиск в таблице из 16 записей (соблюдайте терминологию параллельных вычислений). Индексы перемешивания предварительно вычисляются и просматриваются с помощью битовой маски.

for (i = 0; i < n; i += 8)
{
  v8n_Data = _mm_load_si128(&data[i]);
  mask = _mm_movemask_epi8(&is_valid[i]) & 0xff;     // is_valid is byte array
  v8n_Compacted = _mm_shuffle_epi8(v16n_ShuffleIndices[mask]);
  _mm_storeu_si128(&compacted[count], v8n_Compacted);

  count += bitCount[mask];
}

Моя проблема теперь в том, что я хотел бы реализовать это и для Altivec SIMD (не спрашивайте почему - ошибочное бизнес-решение). У Altivec нет эквивалента для _mm_movemask_epi8 (), важного ингредиента. Итак, мне нужно будет найти способ либо

  1. эмулировать _mm_movemask_epi8 () - кажется дорогостоящим, несколько сдвигов и операций OR

  2. напрямую эффективно генерируют индексы тасования -

а именно, индекс i будет индексом i-го действительный элемент в несжатых данных

element_valid:   0 0 1 0 1 0 0 1 0
gather_indices:  x x x x x x 6 4 1
scatter_indices: 3 3 2 2 1 1 1 0 0

Это просто сделать последовательно, но мне нужно, чтобы он был параллельным (SIMD). Кажется, легко сгенерировать индексы разброса с помощью префиксной суммы, но поскольку ни AltiVec, ни SSE не имеют инструкции разброса, мне нужно вместо этого собрать индексы. Индексы сбора являются обратной функцией индексов разброса, но как их можно получить параллельно? Я знаю, что в первые дни программирования на GPU преобразование разбросов в сборки было обычным методом, но ни один из этих двух описанных методов не казался практичным.

Возможно, если не настаивать на сохранении уплотнения, порядок элементов позволит более эффективная реализация? Я могу бросить это.

8
задан Yale Zhang 7 June 2011 в 19:36
поделиться