Самый эффективный способ изменить поток данных - PullRequest
0 голосов
/ 25 октября 2010

У меня есть поток 16-битных значений, и мне нужно отрегулировать 4 младших значащих бита каждой выборки. Новые значения различны для каждого короткого замыкания, но повторяют каждое короткое замыкание X - по сути, помечая каждое короткое замыкание идентификатором.

Есть ли какие-нибудь хитрые трюки, чтобы сделать это быстрее, чем просто цикл for?

Подробнее Я конвертирую файл из одного формата в другой. В настоящее время реализовано с FILE *, но я мог бы использовать специальные API для Windows, если это будет полезно.

[while data remaining]
{
   read X shorts from input
   tag 4 LSB's
   write modified data to output
}

В дополнение к массовым операциям, я думаю, я искал мнения о том, как лучше растоптать эти последние 4 бита.

  1. Сдвиг вправо 4, сдвиг влево 4, | в новых значениях
  2. & в моих нулевых битах, тогда | в 1 бит
  3. модуль 16, добавить новое значение

Сейчас мы поддерживаем только win7 (32 или 64), поэтому аппаратное обеспечение будет тем, что люди выберут для этого.

Ответы [ 2 ]

3 голосов
/ 25 октября 2010

Если вы работаете, например, на 32-битной платформе, вы можете делать их по 2 одновременно.Или на современном эквиваленте x86, вы можете использовать SIMD-инструкции для работы с 128 битами за один раз.

Кроме этого, нет никаких методов сдвига битов, которые позволили бы избежать зацикливания всего набора данных, учитывая, что онПохоже, вы должны изменить каждый элемент!

0 голосов
/ 25 октября 2010

Лучший способ растоптать эти последние 4 бита - ваш вариант 2:

int i;
i &= 0xFFF0;
i |= tag;

Делать это на лонге будет быстрее, если вы заранее знаете значения тегов. Вы можете записать 4 коротких шорта в одну длинную, а затем выполнять те же операции, что и выше, над 4 короткими шортами одновременно:

long l;
l &= 0xFFF0FFF0FFF0FFF0;
l |= tags;

, где tags = (long) tag1 << 48 + (long) tag2 << 32 + (long) tag3 << 16 + (long) tag4; Это имеет смысл, если вы часто используете эти теги значений, а не если вам приходится создавать их по-разному для каждого набора из 4 шорт.

...