2010

OpenMP: Intel vs Visual Studio

Непонятки с производительностью OpenMP в случае VisualStudio (см. еще обсуждение в каментах) заставило разобраться.

Выяснилось, что две переменные, которые read-only и вообще объявлены как const - считаются разделяемыми. Как следствие - локи при обращении и прочие удовольствия.

После устранения этого недоразумения (#pragma omp ... private(...)) и замены _mm_store_ps() на _mm_stream_ps(), чтобы в обеих компиляторах выходной массив писался через movntps, все встало на свои места: С-шный код с powf() остается сильно быстрее у Интела т.к. он векторизует powf в _svml_powf4, а SSE-код работает с практически одинаковой скоростью.

Его пример другим наука:

#pragma omp parallel for default(none)
и явное прописывание shared/private/whatever для всех переменных.

О степенной функции, OpenMP и прочих граблях

Есть вот такое вот известное выражение, переложеное из википедии:

#define To_sRGB(q) (((q)<=0.0031308f)? 12.92f*(q) : (1+0.055f)*powf(q,1/2.4f)-0.055f)
В том смысле, что у sRGB внизу - линейный участок, а дальше степенная функция.

Если его напрямую запрограммировать (вот прямо с powf()), то в зависимости от компилятора получается от 7 Mpix/sec (Visual C++ 2010, один поток) до 100Mpix/sec (Intel Parallel Studio XE, включен OpenMP). Пиксель - это 3 компонента по 4 байта (float), то бишь гигабайт с небольшим в секунду - это максимум.

Как-то медленно.

В-принципе, бывает быстрое приближенное возведение в степень для ограниченного диапазона значений. Более того, можно просто приблизить sRGB-кривую полиномом не очень высокой степени и получить вполне приемлемый для практики результат. Но хотелось заодно решить задачу быстрого наложения произвольной кривой.

Кому война....

Кому черезвычайная ситуация, а кому - выставка ледяной скульптуры.

P.S. Света еще немножко есть....

Полна чудес могучая природа

А в SSE4.1 оказывается есть минимум-максимум для 16-битных целых. 8 штук зараз.

Хреначит 11 гигабайт в секунду, сдается мне что параллелить по ядрам дальше смысла нет, упрешься в память.

И dot-product есть, правда только для float/double.

Чешутся руки забить на владельцев AMD и всего младше Penryn, держите меня...

Убийца предсказателей переходов

      if (cr2_slice[0]) {
        jidx = jrow*jwide + jcol;
        i = jidx / (cr2_slice[1]*jh.high);
        if ((j = i >= cr2_slice[0]))
                 i  = cr2_slice[0];
        jidx -= i * (cr2_slice[1]*jh.high);
        row = jidx / cr2_slice[1+j];
        col = jidx % cr2_slice[1+j] + i*cr2_slice[1];
      }
Для понимания контекста:
  • Этот кусок зовется на каждый пиксел и рассчитывает, куда именно поместить распакованный из CR2 пиксель (там не так просто все).
  • jidx - номер пикселя в потоке, плавно возрастает.
  • Изображение поделено на cr2_slice[0] полос шириной cr2_slice[1] и одну полосу шириной cr2_slice[2].
  • cr2_slice[0] - небольшое число, 1-3-5
  • j - соответственно - 0 или 1.

На 15 мегапикселях - 330 миллисекунд. Разворот if правильный (чтобы было не 1+j, а честно 1 или 2) - минус 70 миллисекунд. Замена на таблицу с заранее насчитанными оффсетами - минус 200 миллисекунд. Но все равно много, перемудрили в кэноне. Главное, их "слайсы" вполне можно было бы распаковывать впараллель (как они жмутся параллельными Digic-ами), если бы в RAW были бы смещения начал. Ан нет.

Rawspeed: записки на манжетах

Есть такая библиотека RawSpeed, которая натурально написана с душой и склонностью к правильным оптимизациям. Например, файлы .CR2 распаковываются раз в пять быстрее чем это делает LibRaw.

В стремлении эту несуразность поправить, фтыкаю в ее исходники одним глазом, вторым и третьим - в результаты прогона профайлера на LibRaw и RawSpeed на одном и том же файле.

И вижу интересное (в исходниках, не в профайле): Canon 1D Mark III обрабатывается у Коффина в dcraw (и у нас) специфическим способом. Там, как обычно, грубый хак, но работающий. Касается этот хак буквально двух пикселов по ширине на рамке, видимой части изображения - не касается. Ага, сказали мужики и достали лом побольше пошаговый отладчик и grep.

Зная, что меня читают некоторые пользователи RawSpeed, имею сказать, исключительно в информационных целях:

  • RawSpeed извлекает уровень черного только из DNG и NEF, в остальных случаях берется predefined-значение из базы данных по камерам.
  • Уровень черного - это одно число. Даже не два, как в LibRaw/dcraw и не сложная структура, как оно бывает в некоторых камерах вроде PhaseOne (да и DNG - тоже. DNG-шные теги усредняются).
В результате будет два интересных эффекта:

О цвете

Вынесу, пожалуй, из каментов, это существенное соображение.

Нам пишут, дескать при использовании dcraw -o 0 в тесте алгоритмов интерполяции, получающаяся "интерференция" не столь ужасна, как была с цветом по-умолчанию (sRGB output).

Отвечаем: ну да, в тестовом DNG такая цветовая матрица (это от лени случайно совпало специально сделано), что при попытке привести ее к sRGB, значения в матрице поворота будут большие (по модулю). В результате, наступает клиппинг, который видимость "интерференционных эффектов" усиливает. Если к тем же DNG-данным приписать sRGB ColorMatrix1 (или выключить color processing, что приведет к тем же результатам), то такого усиления видимости - да, не будет.

Да, в ICC-терминах движок LibRaw/dcraw работает в Absolute Colormetric: точка белого никак не правится, все выходящее за gamut - обрезается.

Вместе с тем, воспроизводимость получаемых в LibRaw/dcraw эффектов в коммерческих приложениях (ACR, HDR Studio) наводит нас на мысль, что тамошний цветовой движок в точности такой же - Absolute Colormetric и с обрезкой gamut. Соответственно, это надо учитывать и тестировать в реальной работе (смотреть что ушло в клиппинг и все такое...).

LibRaw 0.12

Тем временем, зарелизили LibRaw 0.12:

  • Поддержка дополнительных алгоритмов, распространяемых на условиях GPL2/GPL3:
    • demosaic-pack-GPL2: алгоритмы интерполяции AFD, LMMSE, VCD, modified AHD, AHD+VCD; дополнительные методы медианной фильтрации изображения; поддержка сенсоров Foveon.
    • demosaic-pack-GPL3: алгоритм AMaZE и подавление хроматических аберраций для AMaZE.
  • Дополнительный алгоритм интерполяции (DCB) и шумопонижения (FBDD) включены в состав основной LibRaw.
  • Поддержка LCMS 2.x
  • Новый механизм ./configure на базе GNU autotools.
  • Исправлены ошибки:
    • Исправления в green_matching для некоторых layouts (как это по нашему?) байеровских матриц.
    • Исправлена ошибка в вызове add_masked_borders_to_bitmap(), которая проявлялась на камерах с нечетной шириной черной рамки.
  • Новые параметры командной строки примера unprocessed_raw: -B - вычитать уровень черного, -M - добавлять маскированную рамку к изображению.

Последняя фишка с unprocessed_raw сделана для владельцев черно-белых камер (со смытыми светофильтрами), интерполяция им не нужна (более того, вредна), а какие-то другие средства получить черно-белую картинку без интерполяции, баланса белого и прочих лишних прыжков - просто отсутствуют. То бишь, unprocessed_raw для этого и так подходила, но зачем фотографу маскированная рамка и невычтенный черный?

Тихий, маленький....

По наводке с хабрахабра, погулил HP Proliant Microserver и мне понравилось:

  • Размер 27x25x21 см.
  • Прохладный, тихий
  • 4 SATA-диска 3.5", не hot-swap
  • Два PCIe-слота, 1x и 16x (и третий под IPMI card)
  • AMD Atom NEO, 2 core
  • Два слота DDR3, ECC до 8 гигов
  • гигабит, куча USB
  • $400 в Москве (с гигабайтом памяти и диском на 160), $300-330 в штатах.

Судя по результатам гугления, ставится туда все что шевелится: и винды, и Linux и FreeBSD и OpenSolaris, дисковый контроллер и сеть находятся.

Для дома и семьи - интересная замена 4-дисковым NAS-ам: дешевле "крутых", не дороже "дешевых", но расширяемое: можно, скажем, 4-портовый ethernet воткнуть (который, конечно, будет стоить еще столько же) и ОС можно выбрать. Но минус хот-свап, нафиг дома не нужный.

Жалко что мне не надо :)

Цирк-с-конями.рф

Цирк с конями Приколы в национальном домене продолжаются, я уже смеяться устал.

Комедия в бесконечном числе действий:

  1. Регламент регистрации в .РФ предусматривает отказ регистрации в случае, если нарушается нравственность и мораль. Список нарушений морали и нравственности установлен КЦ и широко обсуждался (гуглить по словам "ебля с перископом"), в том числе и в этом блоге.
  2. Прошел уже месяц с приключениями, блокировками и прочим боданием Руцентра и КЦ, аморальный список действует (в числе прочего, домен старые-бляди.рф довольно долго торчал в whois с личным E-mail Лесникова в контактных данных, недавно поменяли).
  3. ВНЕЗАПНО Руцентр вводит свой стоп-лист
  4. И начинает снимать с регистрации уже зарегистрированные домены.
  5. Которые ТУТ ЖЕ перехватывают другие регистраторы, а вы как думали.
Понятно, что у многих/большинства Руцентровских доменов Администратор - сам Руцентр, он может направить (сам себе?) письменное заявление о снятии с регистрации и снять. А владелец домена - при этом может пососать упса с витамином "С".

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

Pages