AVX2 и VPGATHERDD - продолжение

Продолжаем дневник программиста на AVX2 (начало и продолжение).

Добрался до 4-го места, которое хотелось пооптимизировать окончательно уже года два как: берем 16-битные целые (RAW-данные), конвертируем в плавучку, вычитаем черный, результат записываем. То есть первый этап дебайеризации.

Параллельно считаем RAW-гистограмму и карту пересвета-недосвета (на самом деле там карта экспозиции считается, а не просто пересвет-недосвет, а дальше она визуализируется с лимитами, все что выше/ниже лимита раскрашивается.).

Вот в этом месте VPGATHERDD (из RAW-значений в экспозицию по LUT) внезапно дал выигрыш процентов в 6% (меряю тремя замерами, разброс между ними больше, это усредненные 6%).

И, что приятно, сократился код, вместо cN = table[value[N]] (и так 8 раз, по числу элементов в векторе) стала одна команда. Аналогично и с записью, вместо побайтовой или пословной записи результата (смешно, но скорость выполенения не отличалсь значимо) - одна строчка на которую приятно посмотреть:

_mm_storel_epi64((__m128i*)&oeue[dcol], _mm256_castsi256_si128( _mm256_permutevar8x32_epi32( _mm256_shuffle_epi8(ldata, shuffle_mask), permute_mask)));

shuffle_mask собирает в кучку значащие байты из 32-битных слов, permute_mask ставит их в начало слова:

const __m256i shuffle_mask = _mm256_setr_epi8(0, 4, 8, 12, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 4, 8, 12, -1, -1, -1, -1, -1, -1, -1, -1);
const __m256i permute_mask = _mm256_set_epi32(7, 6, 4, 3, 2, 1, 5, 0);

Не могу не передать пару ласковых слов автору _mm256_unpacklo_epi16: там где в 128-битном SSE был просто unpacklo, там в 256-битном варианте нужно еще попереставлять байтики, потому что два 128-битных регистра (половинки YMM) - это не один 256-битный и работает оно не так.

Но главный спидап в этом месте оказался от замены _mm_store_ps() на _mm_stream_ps(), одно это место ускорило 128-битный вариант процентов на 25 и дальнейшие улучшения с gather и 256-битностью на фоне общего ускорения от stream - практически не видны.

Результат всех оптимизаций смешной: на жатых RAW форматах мы теперь абсолютно упираемся в декомпрессор (который для Huffman не параллелится совсем), ну разве только для tiled DNG не упираемся. А на нежатых (вроде Sony uncompressed) - упираемся в скорость единичной SSD-шки, при 82Mb x 5fps определяющим местом опять становится диск. И таки да, для нежатых Sony вместо 4-4.5fps теперь 5 с небольшими копейками. Было за что биться.

Посмотрим что будет на Skylake: на присмотренном девайсе скорость чтения диска вроде вовсе не ограничивает, увидим во что упремся там.
 

Comments

Оффтопик: а что ты можешь сказать про T/S-объективы на цифру? Вот тут весь отпуск мне такого остро не хватало. Причём мне на APS-C, что, как я понимаю, упрощает ситуацию и увеличивает выбор.
Но мне в голову ничего кроме Arax 2.8/35 не приходит (а надо бы пошире, обычно, если хочется T/S то значит я очень близко к чему-то архитектруно-=высокому и у меня нет физической возможности просто отойти ногами подальше).

На Sony NEX есть T/S переходник кипоновский, с обратной стороны у него Nikon F (и может и еще какие есть). Вешается обычный никон, движений там будет соответственно несколько миллиметров в каждую сторону, но будет.

На зеркальный рабочий отрезок - только или родные или СФ через переходник.

А не бывает переходников с MF на FF/APS-C c T/S внутри? Что бы объектив среднеформатный, но обычный?

Я ж пишу "СФ через переходник". Mirex, Kipon.
Но СФ-оптики шире 35-мм практически нет.
То есть какая-то есть, но
- из новых (типа всяких цифровых пентаксов и мамий) - и потому стоит неприлично.
- ну и с электронной диафрагмой многое (мамии так точно, пентаксы - не вдавался)

Ну так "СФ через переходник" можно понимать двояко. И как "T/S переходник для СФ-оптики" и как "тупой переходник и T/S-СФ оптика" :)

T/S-СФ-оптика вся ж довольно длинная, короче 55 вроде и нет ничего.

Да, у кипона что-то ничего нет, а у Мирекса есть, но 400 евро, Аракс побюджетнее получается.

У кипона есть хассель на пентакс-к: http://www.adorama.com/KATSHSPXK.html

Мирекс - это с VAT, поэтому реально там минус налог, плюс пересылка, плюс перевод (потому что карточки Mirex так и не принимает вроде).

Но с Pentax-K вообще плохо жить, самый вменяемый зеркальный байонет под переходники - это Canon.

Хи-хи, на сайте киппона я этот переходник пропустил (не смог найти?). Вот такой у них удобный сайт.
$272 это уже куда приятнее (хотя, что это я говорю, как при баксе по 73 может быть что-то приятное вообще?!), надо смотреть что со старой хасселевской оптикой...

Ничего хорошего. 40-мм, довольно дорогой даже старый, а про новый вообще слов нет.
Ну и 50.

Проще, поди, узкий от Canon-FD (или старый никон) пересадить на другой байонет.

По идее, под хассель же цейса должно быть навалом? Ну, времён 500-ки какой-ниубудь, я не про современную инкарнацию, конечно. Дистагон там, такое?

Я тебе и говорю: 40mm (старый - так себе, новый - хороший, но дорогой), 50мм.
И фишай какой-то, 30 или 35, не помню.

Вообще, если оглянуться вокруг, то можно увидеть, что у Самьянга/Рокинора есть и 24 и 35мм T/S, с поворотами к тому же. Первый подороже, а второй так ещё и подешевле. И они делают Pentax-K.

Думаю, это будет самый дешёвый вариант, кроме, возможно, переделки Canon-FD, но для переделки нужны какие-то особые социальные скиллы по поиску очень хорошего фрезеровщика, которых у меня нет.

А они делают для K-байонета? Если да, то 24-мм наверное и есть вариант (раз 35 - узковато)

Делают, да. В Россию их не возят, а на Адораме находится. Как Рокинор а не Самьянг.

Кстати, и возят: http://specphoto.ru/#2;3;18;;167614;3026

Но чего-то про 35-TS я сомневаюсь, никогда не встречал.

Хм. Я вчера вроде не пил и точно видел, причём заметно дешевле, чем 24. А сегодня уже найти не могу. Что это было?!

Если такая переделка вообще возможна, у FD рабочий отрезок меньше чем у K. Переходники все линзовые. Что качества не добавит.

Лучше потери в линзах, чем виньетирование на краях.
Хотя.., если оптика не даёт нужного диаметра изображения (не помню термина, когда картинка режется конструктивом оптики), то и линзы не спасут.

Любой TS объектив по определению рисует приемлемую по техническому качеству картинку на большем поле (или формате, если угодно). Поэтому и с шириками TS проблемы. Попробуйте сконструировать 16 мм на СФ (а для ФФ это не так и экстремально). Но можно поставить любой штатный объектив, и двигать/гнуть, жертвуя при этом краями.

Ну 17/TS для кэнона сделали ж. Да, не 16. Но близко.

Миллиметров на 10 его можно двигать, т.е. кроет, грубо говоря, 645-й формат.

Я, конечно, весьма далёк от программирования, тем более с использованием SSE-инструкций.
Но мне кажется, что "стрим" чего-то не гарантирует. Как пример, разница между TCP и UDP.
При потоковой передаче видео вообще возможны массовые потери кадров... Но всё в пределах стандартов.

MOVNTQ

Moves the quadword in the source operand (second operand) to the destination operand (first operand) using a non-temporal hint to minimize cache pollution during the write to memory.

Я же оговорился, что "в Вашем французском" я не комильфо. :-)
Но "сторе" (ИМХО!) предполагает сначала гарантированную запись, а "стрим" - обсчёт налету.Именно здесь собака могла и порыться.

Да нет же. Стрим - это запись мимо кэша. Для случая "именно записи" - в самый раз.

Но ведь и чтение и запись "именно мимо кэша" на порядок медленнее.
Или сегодня это уже не так?

Запись то с чего?
Если мы линейно пишем много мегабайтов, много больше чем есть кэша, то мы кэш только вымываем.

Да и с чтением аналогично, если мы не используем повторно значение.