Грабли третьи: если недостаточное количество объектов синхронизации - зло, ибо программист рискует заполучить время от времени глючащую программу, то переизбыток этих объектов - жуткие вериги на шее проекта. Пусть, скажем, практически любой из наших объектов может изменять игровую землю и стремится получить ее для себя. Поскольку принадлежать двум объектам одновременно земля не сможет, то находится она в каждый момент времени только у одного объекта. Который и будет обрабатываться, а всем остальным потокам придется терпеливо ожидать своей очереди. Получится вот такая картинка (рис. 3), где параллельными вычислениями и не пахнет. С этим успешно борются, беря блокировку ровно на то время, пока она действительно необходима (прочитать состояние земли, проверить его и записать новое состояние), но тогда возникают новые грабли - дедлоки. Предположим, что мы угодили снарядом в землю совсем рядышком от стоящего на ней танка. Пострадала и земля, и танк. Программа добросовестно определяет, что, где и как требуется изменить (поменять рельеф земли и изменить «жизни» у танка), берет первый объект синхронизации «на землю», тянется ко второму объекту синхронизации «на танк»… и тут же виснет. В чем дело? Оказывается, этот танк ждет, когда освободится земля, чтобы внести в нее свои изменения. И пока он земли не дождется, он не отдаст блокировку на самого себя, которая нужна потоку, который «держит» блокировку на ту самую землю. Считаете, что подобный дедлок - надуманная штука? Значит, вы никогда не занимались параллельным программированием: подобные ситуации здесь возникают если не на каждом шагу, то, по крайней мере, очень часто. Еще одна ситуация того же рода - один из потоков взял блокировку на что-то, но забыл освободить, а сторонний поток некстати решил это что-то проверить. Отсюда вытекает второе золотое правило «параллельного» программиста - никогда не пытаться обладать двумя объектами одновременно и тщательно проверять, что все однажды взятые объекты своевременно освобождаются.
Неплохой джентльменский набор, не правда ли? А сколько занятных вопросов связано с работой в «параллельном» режиме стандартных библиотек! К примеру, функция GetHostByAddr в стандартном программном интерфейсе Microsoft, активно использующаяся сетевыми программами, одно время грешила тем, что при ее повторных вызовах с разными адресами из разных потоков выдавала обоим потокам указатель на одну и ту же структуру данных, хотя запрашивали они совсем разное. И если производитель клятвенно заверяет вас, что его библиотека совсем-совсем, ну честно-честно является thread-safe[Безопасной для использования в параллельном режиме], - вспомните, что даже Microsoft нет-нет да и ошибается, модифицируя продукт с десятилетней историей. А о трудности отыскания подобных глюков красноречиво свидетельствует то, сколько потребовалось времени, чтобы GetHostByAddr выловить[Исправили его в Windows XP SP1. Сколько лет он жил никем не замеченный, одному богу известно].
Еще один стандарт де-факто в мире параллельных вычислений - пакет MPI (Message Passing Interface), тоже разрабатывавшийся как универсальное средство облегчения жизни разработчику параллельного ПО. Только устроено оно совсем иначе, нежели OpenMP, и ориентировано в основном для других, «более возвышенных» целей.
Идея MPI заключается в следующем. OpenMP (да и многие другие системы для разработки параллельного ПО) ориентируется на так называемые системы с общей памятью, когда на компьютере запущена всего одна программа (точнее, один процесс), но внутри этого процесса «живет» несколько потоков исполнения, каждому из которых доступна вся память процесса, а стало быть, и все его данные. MPI исходит из другой предпосылки: на компьютере запущено много-много программ (процессов), которые друг с другом напрямую общаться не могут и вынуждены устанавливать контакт через специальные окна или даже внешние каналы связи. Называется все это IPC (Inter-Process Communication) и, как вы уже, наверное, догадались, сильно изменяется от компьютера к компьютеру и от операционной системе к операционной системе. А MPI - попытка стандартизировать связь между процессами, предоставив всем желающим удобную модель запуска на нескольких процессорах тех программ, которые будут коллективно обрабатывать данные, и обеспечивая «почтовые пересылки» между этими программами. Вот и весь Message Passing Interface.
MPI универсален и всеяден. Он не накладывает практически никаких ограничений на приложение, на железо, на каналы, которые используются для связи между компьютерами. Можно в буквальном смысле слова поставить на стол две персоналки с MPI, соединить их Ethernet-кабелем - и кластер на два процессора, на котором можно запускать любое MPI-приложение, - готов! Потому-то этот интерфейс так и любят ученые, реализующие с его помощью программы для самых немыслимых суперкомпьютеров.
Впрочем, при желании можно использовать MPI и для обычных двухъядерных процессоров или двухпроцессорных систем - «вотчины» проектов OpenMP. Но, конечно, MPI для таких целей «тяжеловат», - как в плане быстроты исполнения программного кода, которому, в отличие от его OMP-коллег, приходится еще и оплачивать «накладные расходы» на канал связи, так и в плане высокой сложности разработки MPI-приложений. Последние, правда, лишены большинства тех «граблей», которые существуют для обычных систем с распределенной памятью; но зато для написания соответствующего кода от программиста требуется четкое мышление, позволяющее в деталях продумать систему обмена информацией между процессами.
Это отдельная песня. Я не говорю даже о том, что когда в программе запущен не один, а несколько потоков, то пошаговая отладка превращается в настоящий кошмар: контрольные точки «ловят» все треды подряд, а шаг одного потока запросто может сопровождаться полусотней шагов соседнего. Главная проблема в отладке параллельных приложений заключается в том, что возникающие там глюки уникальны. Зачастую они связаны со случайным совпадением каких-то событий в «жизни» слабо связанных друг с другом потоков, а потому проявляются, как говорится, в соответствии с текущей фазой луны, - возникнут раз-другой и бесследно исчезнут. Мало того, иногда присутствие «наблюдателя» (отладочных средств) изменяет результат измерений, поскольку слегка перестраивает «свойства окружающей среды», - вот и вылавливай после этого какой-нибудь плавающий глюк, обусловленный параллельностью.
Возможных решений тут всего три. Во-первых, средства, подобные OpenMP, заметно упрощают разработку «параллельных» программ, поскольку устраняют необходимость ручного задания объектов синхронизации. Правда, платить за это приходится еще более суженной функциональностью и производительностью (автоматика особой сообразительностью не отличается), так что изучить объекты синхронизации программисту не помешает. Второй способ - использование «по старинке» большого объема выводимой вручную отладочной информации. И, наконец, третий - использование специальных программ вроде Intel Thread Checker, не только наглядно и доступно отображающих в виде графика ход исполнения программы, но и способных в некоторых случаях находить распространенные ошибки начинающих.
Как ни крути, за параллельными приложениями будущее, - а значит, пришла пора осваивать соответствующие приемы программирования и инструментарий. Компания Intel не только обещает завалить рынок недорогими многоядерными процессорами, но и предоставляет весь необходимый инструментарий для полноценного использования своих разработок. И судя по тому, что новейшие продукты Intel на процессорах AMD зачастую отказываются запускаться - AMD как платформе разработчиков вскоре придется неуютно.
Софтерра: Фотографическая чертовщина
В мире программного обеспечения популярны два диаметрально противоположных тезиса. Первый заключается в том, что весь софт должен быть свободным и распространяться с исходными текстами, что только открытый способ разработки приносит плоды, с аппетитом съедаемые конечными пользователями. Против этой идеи выступают некоторые руководители крупных софтверных компаний: они утверждают, что продукция компании должна оплачиваться «нормальным» способом - а именно коммерческой реализацией товара.
Конечно, каждый разработчик вправе сам выбирать модель распространения будущего продукта. Нам же интересно сравнить конечные результаты обоих подходов.
Инструменты обработки цифровых изображений уже давно выпорхнули из умелых рук профессионалов и прочно обосновались на компьютерах пользователей, которых никто ни разу в жизни не называл «фотографами». Сегодня даже начинающим секретарям-референтам вменяется в обязанность обработка цифровых снимков и рассылка заказчикам. Что уж говорить о нас с вами… горе-специалистах.
Ситуацию усугубляет то, что популяризация цифрового фото привела к огромным продажам маленьких аппаратов с еле заметным глазком объектива, в народе называемых «мыльницами». Их использование можно свести к трем этапам: машинальное нажатие на кнопку спуска, укладка прически после увиденного снимка, обращение за помощью к компьютеру, чтобы как-то исправить отснятый материал. И в этот момент нашей последней соломинкой оказывается ПО для обработки цифровых изображений.
За долгие годы бесшабашного использования разнообразного софта россияне привыкли к тому, что программы бывают только бесплатные, но некоторые нехорошие разработчики зачем-то заставляют пользователей при установке вводить серийный код, созданный ближайшей программой keygen.exe. Однако не за горами тот день, когда в домашних ПК будет жить только лицензионный софт. А раз так, то пора подумать - хватит ли нам возможностей бесплатного ПО для обработки цифровых шедевров или все же придется раскошеливаться?
В связи с особенностями лицензирования ПО в нашей стране поистине народным средством обработки фотографий стал весьма недешевый Adobe Photoshop. Единственным редактором из лагеря бесплатного ПО, сравнимым с этим гигантом, является GIMP, распространяемый по свободной лицензии GPL. Логотип редактора - чертенок с кисточкой в зубах.
Разумеется, Photoshop мощнее. Но его преимущества сводятся к наличию функций, применяемых лишь профессионалами: любителям не понять прелестей преобразования RAW-файлов, работы с изображением в пространстве CMYK и прочих фотографических и полиграфических таинств. Зато масса других возможностей наверняка пригодится пользователям мыльниц.
Размер дистрибутива GIMP - 7,5 Мбайт. Установка программы в Windows требует наличия библиотеки GTK+, которая весит 3,6 Мбайт. При этом для нормальной работы в Windows XP «Чертенку» достаточно 128-256 Мбайт оперативной памяти. Интерфейс программы не вполне обычен, к нему нужно привыкнуть - например, правая кнопка мыши вызывает не контекстное меню, отвечающее текущему элементу, а главное, что позволяет быстро вызывать любые функции редактора.
GIMP обладает всеми атрибутами серьезного графического «комбайна»: он умеет работать со слоями, накладывать множество фильтров, а также поддерживает язык Script-Fu, с помощью которого можно сделать из нескольких функций одну новую и получить самые немыслимые результаты.
Adobe Photoshop - дорогой профессиональный инструмент, его дистрибутив занимает один CD. Редактор настойчиво требует хотя бы 512 Мбайт оперативной памяти для комфортной работы. Как средство редактирования фотографий, Photoshop, наверное, является самым мощным продуктом среди конкурентов. Остается решить, а не стреляем ли мы из пушки по воробьям, используя этого «монстра»?
Снимки, получаемые в яркий солнечный день, чаше всего не нуждаются в коррекции цвета, но стоит только оказаться в помещении при свете обычных ламп накаливания, как автоматика наших фотоаппаратов начинает барахлить. Несильные завалы в тот или иной тон исправляются в Photoshop с помощью функции «Цветовой баланс». Обратите внимание, что вы можете менять цветовую гамму раздельно в трех диапазонах яркости - тенях, полутонах и бликах.
Другая возможная проблема - ошибки экспозиции. Если снимок получился «засвеченным» и в некоторых местах яркость такая, что все сливается в единый белый фон, то это уже «не лечится». Слишком темные снимки, напротив, поддаются исправлению. Для корректировки экспозиции следует воспользоваться инструментом «Уровни», с помощью которого вы можете не только установить нужные параметры яркости для снимка, но и окончательно выправить баланс цвета.
Нажатие кнопки «Авто» позволит редактору настроить всю группу параметров по своему усмотрению. Если вас не устраивает работа «автоматики» - добро пожаловать в ручную правку уровней. Выбор черной и белой точек позволяет скорректировать изображение так, чтобы равномерно задействовать на снимке весь диапазон яркости, а с помощью серой можно построить всю цветовую гамму без перекосов в сторону того или иного канала.
Аналогичные функции присутствуют и в GIMP, однако меньшее внимание уделяется «автоматике». В меню «Инструменты цвета» нет ни одного пункта, который бы помог автоматически скорректировать изображение, хотя заветная кнопка «Авто» доступна из окошка «Уровней».
Все инструменты обработки цвета у обоих редакторов лежат в меню второй степени вложенности, что несколько замедляет скорость работы пользователя.
В общем, оба редактора заслуживают одинаковую оценку по предмету «манипуляции с цветом».
Если при съемке использовалось высокое значение ISO, фотография получается зернистой. Этот недостаток отчасти устраняется с помощью гауссова размытия, которое есть у обоих редакторов. Однако не всегда разумно накладывать фильтр сразу на все фото: например, при портретной съемке желательно, чтобы кожа была «размыта» больше, чем волосы и одежда. Чтобы достичь нужного результата, приходится обращаться к функциям выделения произвольных областей изображения - здесь-то и проявляются различия программ.
В Photoshop есть три инструмента для подобных целей. Принцип работы «Лассо» всем известен: вы удерживаете левую кнопку мыши и рисуете на изображении нужный контур. Отпускаете кнопку - контур автоматически замыкается и превращается в выделение. Второй инструмент, «Прямолинейное лассо», отличается тем, что граница выделения составляется из прямых отрезков, а третий, «Магнитное лассо», даже не требует удерживания левой кнопки мыши: достаточно приблизительно обводить нужный контур, а редактор уже сам определит, как прокладывать «маршрут» и в каких местах расставлять точки фиксации. Впрочем, последнее можно делать и вручную.
GIMP обладает аналогами как обычного «лассо», так и магнитного[На самом деле, используя понятия «контура» (path), можно выделять и многоугольники - правда, делать это не так удобно, как в Photoshop. - И.Щ], и если первое работает в обоих редакторах одинаково, то второе ведет себя иначе: вы указываете последовательность точек, между которыми алгоритм редактора рисует кривые, максимально приближаясь к резким переходам цвета.
Photoshop, позволяя более гибко удалять шумы за счет простоты выделения произвольных областей, зарабатывает один балл.
Цифровые мыльницы, у которых вспышка расположена близко к объективу, дают при съемке хорошо известный эффект красных глаз.
Лечение этого недуга в Photoshop производится инструментом «Замена цвета». Достаточно выбрать кисть подходящего размера и поводить ею по зрачку.
GIMP столь специальной функции не имеет, однако это не значит, что задача ему не по силам. Напротив, на этот случай есть несколько рецептов - ваш покорный слуга пользуется таким: с помощью «Выделения эллиптических областей» выделяем область зрачка, а затем применяем инструмент «Тонирование»; насыщенность ставим минимальную. Играя параметром «Тон», можно придавать зрачку любой оттенок.
Инструментарий Photoshop более нагляден, разработчики не поленились добавить лишнюю кнопку для решения конкретной задачи. GIMP тоже превосходно исправляет цвета зрачков, но требует минимальных знаний о работе с цветом. Один балл в пользу Photoshop.
Червивые яблоки, прыщи на лице, царапины на сканированных изображениях, пятна на блузках, шрамы, родинки в самом неподходящем месте - на фотографии это может смотреться просто ужасно. Photoshop имеет весь необходимый инструментарий для исправления подобных катастроф. «Восстанавливающая кисть» позволяет легко переносить текстуру изображения с неповрежденного участка на поврежденный, в большинстве случаев не оставляя никаких следов проделанной операции.
В арсенале обих редакторов есть также менее интеллектуальный инструмент «Штамп», основанный на аналогичной идее замены одних участков изображения другими. Качество реализации штампа в Photoshop несколько выше, что позволяет с меньшими усилиями добиваться желаемого результата.
Суммируя полученный опыт, можно дать два балла в пользу Photoshop.
Очень часто на снимках небо получается засвеченным, тогда как остальная часть композиции радует глаз естественными цветами.
Нарисовать красивое небо в GIMP довольно легко. Для начала нужно создать новый слой как копию текущего. Инструментом «Выделение связанных областей» (аналог «Волшебной палочки») щелкните на любой точке неба, затем инвертируйте выделение с помощью соответствующего пункта меню. Удалите все, кроме неба. Теперь воспользуйтесь фильтром «Плазма». На этом этапе вместо неба мы получим мешанину красок, отдаленно напоминающую облака. Чтобы получить более адекватное изображение, нужно тонировать картинку: с помощью ползунка «Тон» добейтесь естественного голубого оттенка. Затем немного размажьте слой с помощью «гауссового размытия» и, играя прозрачностью слоя, придайте картинке реалистичность. Добавьте синевы нашим грязным рекам с помощью регулирования цветового баланса в тенях.
Порядок действий в Photoshop, в общем-то, аналогичен: создание нового слоя, выделение, инверсия, удаление лишнего. Дальше начинаются некоторые отличия: фильтр «Облака» рисует совершено другое небо, не похожее на то, что мы видим в GIMP. На мой взгляд, облака, созданные в Photoshop, менее реалистичны. Разумеется, тонирование и прозрачность доводят вашу работу до приемлемого уровня, но все равно в этом вопросе GIMP на один балл впереди.
Некоторые девушки стесняются камеры, выдвигая нелепую причину, связанную с отсутствием достойного мейкапа для съемок. Скорее всего, они не знают, что и Photoshop, и GIMP имеют все необходимые инструменты для наложения самого качественного макияжа. Не будем углубляться в особенности программной реализации средств раскрашивания женских лиц, а лучше рассмотрим общие принципы работы виртуального гримера.
Для начала необходимо создать новый пустой слой. С помощью обычной кисточки нанесем на щеки девушки румяна - их следует накладывать чуть выше крайней точки скул. Затем применим на слое «гауссово размытие» с такими параметрами, чтобы штрихи превратились в пятно. Теперь с помощью регулировки прозрачности слоя добьемся максимального реализма изображения. Точно так же накладываются тени вокруг глаз - на новом слое тонким черным карандашом обводятся глаза и размываются в меньшей степени, чем румяна.
Иногда имеет смысл слегка размыть изображение под глазами, так как вспышки дешевых аппаратов могут создавать в этом месте эффект жирной кожи.
Самое сложное - это губы. Для создания эффекта губной помады перечисленной нехитрой техники уже недостаточно: чтобы воссоздать всю прелесть этой выразительнейшей части лица, требуется точно передать текстуру кожи. Последовательность действий такая: сначала тонким карандашом обволим контур губ, немного его размазав. Затем выделяем губы и с помощью регулировки тона/насыщенности выбираем оттенок, сочетающийся с цветом контурного карандаша. Кроме того, можно увеличить резкость, что придаст губам дополнительный объем.
Оба редактора позволяют в одинаковой степени вжиться в роль профессионального гримера.
Photoshop опережает GIMP на три абстрактных балла. Дорогой профессиональный редактор оказывается удобнее даже при выполнении самых простых операций (не всегда, конечно, но как правило).
Что может противопоставить ему GIMP? Бесплатный редактор требует намного меньше системных ресурсов, имеет необычный интерфейс, привыкнув к которому, начинаешь ощущать комфорт в работе.
Проблема в том, что если вам нужны только базовые инструменты для работы с цифровыми фото, то на передний план сразу выходят другие игроки, такие как ACDSee, Picasa и другие менеджеры изображений, требующие для освоения буквально пару вечеров. Решающим фактором могла бы стать цена продукта, но мы живем не совсем по правилам рынка (по крайней мере, пока).
Софтерра: Тень сурка
Существует множество компьютерных проблем, с которыми каждый пользователь борется по-своему - начиная от вирусов и заканчивая «естественным старением» системы. Что бы вы ни делали, в один прекрасный день ваша любимая Windows начнет проявлять болезненные симптомы: долгая загрузка, медленная работа, постоянные ошибки. Огромное количество утилит обещают продлить срок жизни системы, но как бы они ни старались, результат один - рано или поздно ОС придется переустанавливать.
Выбор антивируса - задача непростая. Я решил ее радикально: не стал ставить защиту вообще, ибо для моего не очень шустрого компьютера любой современный антивирус был обузой. Приходилось бороться с нечистью собственными силами: постоянно просматривать папку «Автозагрузка» и отслеживать работающие процессы на предмет подозрительной активности - понятно, что при частом использовании Интернета столь нехитрых средств хватало не надолго. Когда ОС в очередной раз «ломалась», на помощь приходила отличная программа Acronis True Image, позволяющая восстановить систему из предварительно записанного образа. Впрочем, несмотря на относительную простоту операции, регулярно заниматься восстановлениями мне надоело.
Уже стало казаться, что придется покупать новый компьютер только ради установки нормального антивируса. И вот совершенно случайно ко мне попала программа весом 6,5 Мбайт, описание которой ничего сверхъестественного не обещало…
Попробую объяснить, что делает таинственная софтина по имени ShadowUser. Говоря коротко и не совсем точно, она запоминает состояние вашего жесткого диска и при каждой перезагрузке восстанавливает его. Казалось бы, ничего особенного, об этом мы говорили чуть выше - однако есть одна тонкость: вам не требуется ни делать образ диска, ни создавать «точку восстановления», как в утилитах класса True Image или GoBack. Достаточно активировать ShadowUser и перезагрузить компьютер - все, теперь вы в безопасности, о которой и не мечтали.
Насколько удалось понять из описания, принцип работы программы довольно прост. После активации «теневого режима» ваш компьютер загрузится как обычно - вот только это будет уже не настоящая система, а виртуальная. Удаляйте папки и файлы (можете даже попробовать удалить папку Windows - насколько это возможно), изменяйте все параметры реестра, удаляйте Boot.ini, попытайтесь отформатировать диск - все будет тщетно. После очередной перезагрузки от ваших действий не останется и следа.
Вся прелесть этой софтины - абсолютная незаметность ее работы. Конечно, программа занимает место на жестком диске, однако для нормального функционирования ей достаточно процессора с тактовой частотой 133 МГц и 128 Мбайт ОЗУ. В диспетчере задач висят два процесса, связанных с работой программы, забирают они до 8 Мбайт памяти, но самое удивительное - по-видимому, их можно спокойно завершить безо всякого вреда для функционирования ShadowUser.
Несмотря на то что за несколько месяцев жизни «в тени» я не выявил ни одной явной проблемы, здесь есть некоторые тонкие места, о которых полезно помнить. Например, если вы в «теневом режиме» поменяете обои на «Рабочем столе», то после перезагрузки, естественно, обнаружите, что все осталось по-прежнему. В случае неправильных настроек программа может с той же легкостью «откатить» изменения файлов, не задумываясь о том, что в них вложены многие часы вашего труда.
Неплохой джентльменский набор, не правда ли? А сколько занятных вопросов связано с работой в «параллельном» режиме стандартных библиотек! К примеру, функция GetHostByAddr в стандартном программном интерфейсе Microsoft, активно использующаяся сетевыми программами, одно время грешила тем, что при ее повторных вызовах с разными адресами из разных потоков выдавала обоим потокам указатель на одну и ту же структуру данных, хотя запрашивали они совсем разное. И если производитель клятвенно заверяет вас, что его библиотека совсем-совсем, ну честно-честно является thread-safe[Безопасной для использования в параллельном режиме], - вспомните, что даже Microsoft нет-нет да и ошибается, модифицируя продукт с десятилетней историей. А о трудности отыскания подобных глюков красноречиво свидетельствует то, сколько потребовалось времени, чтобы GetHostByAddr выловить[Исправили его в Windows XP SP1. Сколько лет он жил никем не замеченный, одному богу известно].
Интерфейс MPI
Еще один стандарт де-факто в мире параллельных вычислений - пакет MPI (Message Passing Interface), тоже разрабатывавшийся как универсальное средство облегчения жизни разработчику параллельного ПО. Только устроено оно совсем иначе, нежели OpenMP, и ориентировано в основном для других, «более возвышенных» целей.
Идея MPI заключается в следующем. OpenMP (да и многие другие системы для разработки параллельного ПО) ориентируется на так называемые системы с общей памятью, когда на компьютере запущена всего одна программа (точнее, один процесс), но внутри этого процесса «живет» несколько потоков исполнения, каждому из которых доступна вся память процесса, а стало быть, и все его данные. MPI исходит из другой предпосылки: на компьютере запущено много-много программ (процессов), которые друг с другом напрямую общаться не могут и вынуждены устанавливать контакт через специальные окна или даже внешние каналы связи. Называется все это IPC (Inter-Process Communication) и, как вы уже, наверное, догадались, сильно изменяется от компьютера к компьютеру и от операционной системе к операционной системе. А MPI - попытка стандартизировать связь между процессами, предоставив всем желающим удобную модель запуска на нескольких процессорах тех программ, которые будут коллективно обрабатывать данные, и обеспечивая «почтовые пересылки» между этими программами. Вот и весь Message Passing Interface.
MPI универсален и всеяден. Он не накладывает практически никаких ограничений на приложение, на железо, на каналы, которые используются для связи между компьютерами. Можно в буквальном смысле слова поставить на стол две персоналки с MPI, соединить их Ethernet-кабелем - и кластер на два процессора, на котором можно запускать любое MPI-приложение, - готов! Потому-то этот интерфейс так и любят ученые, реализующие с его помощью программы для самых немыслимых суперкомпьютеров.
Впрочем, при желании можно использовать MPI и для обычных двухъядерных процессоров или двухпроцессорных систем - «вотчины» проектов OpenMP. Но, конечно, MPI для таких целей «тяжеловат», - как в плане быстроты исполнения программного кода, которому, в отличие от его OMP-коллег, приходится еще и оплачивать «накладные расходы» на канал связи, так и в плане высокой сложности разработки MPI-приложений. Последние, правда, лишены большинства тех «граблей», которые существуют для обычных систем с распределенной памятью; но зато для написания соответствующего кода от программиста требуется четкое мышление, позволяющее в деталях продумать систему обмена информацией между процессами.
Отладка параллельных приложений
Это отдельная песня. Я не говорю даже о том, что когда в программе запущен не один, а несколько потоков, то пошаговая отладка превращается в настоящий кошмар: контрольные точки «ловят» все треды подряд, а шаг одного потока запросто может сопровождаться полусотней шагов соседнего. Главная проблема в отладке параллельных приложений заключается в том, что возникающие там глюки уникальны. Зачастую они связаны со случайным совпадением каких-то событий в «жизни» слабо связанных друг с другом потоков, а потому проявляются, как говорится, в соответствии с текущей фазой луны, - возникнут раз-другой и бесследно исчезнут. Мало того, иногда присутствие «наблюдателя» (отладочных средств) изменяет результат измерений, поскольку слегка перестраивает «свойства окружающей среды», - вот и вылавливай после этого какой-нибудь плавающий глюк, обусловленный параллельностью.
***
Возможных решений тут всего три. Во-первых, средства, подобные OpenMP, заметно упрощают разработку «параллельных» программ, поскольку устраняют необходимость ручного задания объектов синхронизации. Правда, платить за это приходится еще более суженной функциональностью и производительностью (автоматика особой сообразительностью не отличается), так что изучить объекты синхронизации программисту не помешает. Второй способ - использование «по старинке» большого объема выводимой вручную отладочной информации. И, наконец, третий - использование специальных программ вроде Intel Thread Checker, не только наглядно и доступно отображающих в виде графика ход исполнения программы, но и способных в некоторых случаях находить распространенные ошибки начинающих.
Выводы
Как ни крути, за параллельными приложениями будущее, - а значит, пришла пора осваивать соответствующие приемы программирования и инструментарий. Компания Intel не только обещает завалить рынок недорогими многоядерными процессорами, но и предоставляет весь необходимый инструментарий для полноценного использования своих разработок. И судя по тому, что новейшие продукты Intel на процессорах AMD зачастую отказываются запускаться - AMD как платформе разработчиков вскоре придется неуютно.
Софтерра: Фотографическая чертовщина
В мире программного обеспечения популярны два диаметрально противоположных тезиса. Первый заключается в том, что весь софт должен быть свободным и распространяться с исходными текстами, что только открытый способ разработки приносит плоды, с аппетитом съедаемые конечными пользователями. Против этой идеи выступают некоторые руководители крупных софтверных компаний: они утверждают, что продукция компании должна оплачиваться «нормальным» способом - а именно коммерческой реализацией товара.
Конечно, каждый разработчик вправе сам выбирать модель распространения будущего продукта. Нам же интересно сравнить конечные результаты обоих подходов.
Чертенок с кисточкой в магазине фототоваров
Инструменты обработки цифровых изображений уже давно выпорхнули из умелых рук профессионалов и прочно обосновались на компьютерах пользователей, которых никто ни разу в жизни не называл «фотографами». Сегодня даже начинающим секретарям-референтам вменяется в обязанность обработка цифровых снимков и рассылка заказчикам. Что уж говорить о нас с вами… горе-специалистах.
Ситуацию усугубляет то, что популяризация цифрового фото привела к огромным продажам маленьких аппаратов с еле заметным глазком объектива, в народе называемых «мыльницами». Их использование можно свести к трем этапам: машинальное нажатие на кнопку спуска, укладка прически после увиденного снимка, обращение за помощью к компьютеру, чтобы как-то исправить отснятый материал. И в этот момент нашей последней соломинкой оказывается ПО для обработки цифровых изображений.
За долгие годы бесшабашного использования разнообразного софта россияне привыкли к тому, что программы бывают только бесплатные, но некоторые нехорошие разработчики зачем-то заставляют пользователей при установке вводить серийный код, созданный ближайшей программой keygen.exe. Однако не за горами тот день, когда в домашних ПК будет жить только лицензионный софт. А раз так, то пора подумать - хватит ли нам возможностей бесплатного ПО для обработки цифровых шедевров или все же придется раскошеливаться?
В связи с особенностями лицензирования ПО в нашей стране поистине народным средством обработки фотографий стал весьма недешевый Adobe Photoshop. Единственным редактором из лагеря бесплатного ПО, сравнимым с этим гигантом, является GIMP, распространяемый по свободной лицензии GPL. Логотип редактора - чертенок с кисточкой в зубах.
Разумеется, Photoshop мощнее. Но его преимущества сводятся к наличию функций, применяемых лишь профессионалами: любителям не понять прелестей преобразования RAW-файлов, работы с изображением в пространстве CMYK и прочих фотографических и полиграфических таинств. Зато масса других возможностей наверняка пригодится пользователям мыльниц.
Построение перед боем
Размер дистрибутива GIMP - 7,5 Мбайт. Установка программы в Windows требует наличия библиотеки GTK+, которая весит 3,6 Мбайт. При этом для нормальной работы в Windows XP «Чертенку» достаточно 128-256 Мбайт оперативной памяти. Интерфейс программы не вполне обычен, к нему нужно привыкнуть - например, правая кнопка мыши вызывает не контекстное меню, отвечающее текущему элементу, а главное, что позволяет быстро вызывать любые функции редактора.
GIMP обладает всеми атрибутами серьезного графического «комбайна»: он умеет работать со слоями, накладывать множество фильтров, а также поддерживает язык Script-Fu, с помощью которого можно сделать из нескольких функций одну новую и получить самые немыслимые результаты.
Adobe Photoshop - дорогой профессиональный инструмент, его дистрибутив занимает один CD. Редактор настойчиво требует хотя бы 512 Мбайт оперативной памяти для комфортной работы. Как средство редактирования фотографий, Photoshop, наверное, является самым мощным продуктом среди конкурентов. Остается решить, а не стреляем ли мы из пушки по воробьям, используя этого «монстра»?
Равноправие цветов
Снимки, получаемые в яркий солнечный день, чаше всего не нуждаются в коррекции цвета, но стоит только оказаться в помещении при свете обычных ламп накаливания, как автоматика наших фотоаппаратов начинает барахлить. Несильные завалы в тот или иной тон исправляются в Photoshop с помощью функции «Цветовой баланс». Обратите внимание, что вы можете менять цветовую гамму раздельно в трех диапазонах яркости - тенях, полутонах и бликах.
Другая возможная проблема - ошибки экспозиции. Если снимок получился «засвеченным» и в некоторых местах яркость такая, что все сливается в единый белый фон, то это уже «не лечится». Слишком темные снимки, напротив, поддаются исправлению. Для корректировки экспозиции следует воспользоваться инструментом «Уровни», с помощью которого вы можете не только установить нужные параметры яркости для снимка, но и окончательно выправить баланс цвета.
Нажатие кнопки «Авто» позволит редактору настроить всю группу параметров по своему усмотрению. Если вас не устраивает работа «автоматики» - добро пожаловать в ручную правку уровней. Выбор черной и белой точек позволяет скорректировать изображение так, чтобы равномерно задействовать на снимке весь диапазон яркости, а с помощью серой можно построить всю цветовую гамму без перекосов в сторону того или иного канала.
Аналогичные функции присутствуют и в GIMP, однако меньшее внимание уделяется «автоматике». В меню «Инструменты цвета» нет ни одного пункта, который бы помог автоматически скорректировать изображение, хотя заветная кнопка «Авто» доступна из окошка «Уровней».
Все инструменты обработки цвета у обоих редакторов лежат в меню второй степени вложенности, что несколько замедляет скорость работы пользователя.
В общем, оба редактора заслуживают одинаковую оценку по предмету «манипуляции с цветом».
Шуметь неприлично
Если при съемке использовалось высокое значение ISO, фотография получается зернистой. Этот недостаток отчасти устраняется с помощью гауссова размытия, которое есть у обоих редакторов. Однако не всегда разумно накладывать фильтр сразу на все фото: например, при портретной съемке желательно, чтобы кожа была «размыта» больше, чем волосы и одежда. Чтобы достичь нужного результата, приходится обращаться к функциям выделения произвольных областей изображения - здесь-то и проявляются различия программ.
В Photoshop есть три инструмента для подобных целей. Принцип работы «Лассо» всем известен: вы удерживаете левую кнопку мыши и рисуете на изображении нужный контур. Отпускаете кнопку - контур автоматически замыкается и превращается в выделение. Второй инструмент, «Прямолинейное лассо», отличается тем, что граница выделения составляется из прямых отрезков, а третий, «Магнитное лассо», даже не требует удерживания левой кнопки мыши: достаточно приблизительно обводить нужный контур, а редактор уже сам определит, как прокладывать «маршрут» и в каких местах расставлять точки фиксации. Впрочем, последнее можно делать и вручную.
GIMP обладает аналогами как обычного «лассо», так и магнитного[На самом деле, используя понятия «контура» (path), можно выделять и многоугольники - правда, делать это не так удобно, как в Photoshop. - И.Щ], и если первое работает в обоих редакторах одинаково, то второе ведет себя иначе: вы указываете последовательность точек, между которыми алгоритм редактора рисует кривые, максимально приближаясь к резким переходам цвета.
Photoshop, позволяя более гибко удалять шумы за счет простоты выделения произвольных областей, зарабатывает один балл.
Очарование красных глаз
Цифровые мыльницы, у которых вспышка расположена близко к объективу, дают при съемке хорошо известный эффект красных глаз.
Лечение этого недуга в Photoshop производится инструментом «Замена цвета». Достаточно выбрать кисть подходящего размера и поводить ею по зрачку.
GIMP столь специальной функции не имеет, однако это не значит, что задача ему не по силам. Напротив, на этот случай есть несколько рецептов - ваш покорный слуга пользуется таким: с помощью «Выделения эллиптических областей» выделяем область зрачка, а затем применяем инструмент «Тонирование»; насыщенность ставим минимальную. Играя параметром «Тон», можно придавать зрачку любой оттенок.
Инструментарий Photoshop более нагляден, разработчики не поленились добавить лишнюю кнопку для решения конкретной задачи. GIMP тоже превосходно исправляет цвета зрачков, но требует минимальных знаний о работе с цветом. Один балл в пользу Photoshop.
Курс реабилитации изображений
Червивые яблоки, прыщи на лице, царапины на сканированных изображениях, пятна на блузках, шрамы, родинки в самом неподходящем месте - на фотографии это может смотреться просто ужасно. Photoshop имеет весь необходимый инструментарий для исправления подобных катастроф. «Восстанавливающая кисть» позволяет легко переносить текстуру изображения с неповрежденного участка на поврежденный, в большинстве случаев не оставляя никаких следов проделанной операции.
В арсенале обих редакторов есть также менее интеллектуальный инструмент «Штамп», основанный на аналогичной идее замены одних участков изображения другими. Качество реализации штампа в Photoshop несколько выше, что позволяет с меньшими усилиями добиваться желаемого результата.
Суммируя полученный опыт, можно дать два балла в пользу Photoshop.
Небо в облаках
Очень часто на снимках небо получается засвеченным, тогда как остальная часть композиции радует глаз естественными цветами.
Нарисовать красивое небо в GIMP довольно легко. Для начала нужно создать новый слой как копию текущего. Инструментом «Выделение связанных областей» (аналог «Волшебной палочки») щелкните на любой точке неба, затем инвертируйте выделение с помощью соответствующего пункта меню. Удалите все, кроме неба. Теперь воспользуйтесь фильтром «Плазма». На этом этапе вместо неба мы получим мешанину красок, отдаленно напоминающую облака. Чтобы получить более адекватное изображение, нужно тонировать картинку: с помощью ползунка «Тон» добейтесь естественного голубого оттенка. Затем немного размажьте слой с помощью «гауссового размытия» и, играя прозрачностью слоя, придайте картинке реалистичность. Добавьте синевы нашим грязным рекам с помощью регулирования цветового баланса в тенях.
Порядок действий в Photoshop, в общем-то, аналогичен: создание нового слоя, выделение, инверсия, удаление лишнего. Дальше начинаются некоторые отличия: фильтр «Облака» рисует совершено другое небо, не похожее на то, что мы видим в GIMP. На мой взгляд, облака, созданные в Photoshop, менее реалистичны. Разумеется, тонирование и прозрачность доводят вашу работу до приемлемого уровня, но все равно в этом вопросе GIMP на один балл впереди.
Гримерная
Некоторые девушки стесняются камеры, выдвигая нелепую причину, связанную с отсутствием достойного мейкапа для съемок. Скорее всего, они не знают, что и Photoshop, и GIMP имеют все необходимые инструменты для наложения самого качественного макияжа. Не будем углубляться в особенности программной реализации средств раскрашивания женских лиц, а лучше рассмотрим общие принципы работы виртуального гримера.
Для начала необходимо создать новый пустой слой. С помощью обычной кисточки нанесем на щеки девушки румяна - их следует накладывать чуть выше крайней точки скул. Затем применим на слое «гауссово размытие» с такими параметрами, чтобы штрихи превратились в пятно. Теперь с помощью регулировки прозрачности слоя добьемся максимального реализма изображения. Точно так же накладываются тени вокруг глаз - на новом слое тонким черным карандашом обводятся глаза и размываются в меньшей степени, чем румяна.
Иногда имеет смысл слегка размыть изображение под глазами, так как вспышки дешевых аппаратов могут создавать в этом месте эффект жирной кожи.
Самое сложное - это губы. Для создания эффекта губной помады перечисленной нехитрой техники уже недостаточно: чтобы воссоздать всю прелесть этой выразительнейшей части лица, требуется точно передать текстуру кожи. Последовательность действий такая: сначала тонким карандашом обволим контур губ, немного его размазав. Затем выделяем губы и с помощью регулировки тона/насыщенности выбираем оттенок, сочетающийся с цветом контурного карандаша. Кроме того, можно увеличить резкость, что придаст губам дополнительный объем.
Оба редактора позволяют в одинаковой степени вжиться в роль профессионального гримера.
Выборы
Photoshop опережает GIMP на три абстрактных балла. Дорогой профессиональный редактор оказывается удобнее даже при выполнении самых простых операций (не всегда, конечно, но как правило).
Что может противопоставить ему GIMP? Бесплатный редактор требует намного меньше системных ресурсов, имеет необычный интерфейс, привыкнув к которому, начинаешь ощущать комфорт в работе.
Проблема в том, что если вам нужны только базовые инструменты для работы с цифровыми фото, то на передний план сразу выходят другие игроки, такие как ACDSee, Picasa и другие менеджеры изображений, требующие для освоения буквально пару вечеров. Решающим фактором могла бы стать цена продукта, но мы живем не совсем по правилам рынка (по крайней мере, пока).
Софтерра: Тень сурка
Существует множество компьютерных проблем, с которыми каждый пользователь борется по-своему - начиная от вирусов и заканчивая «естественным старением» системы. Что бы вы ни делали, в один прекрасный день ваша любимая Windows начнет проявлять болезненные симптомы: долгая загрузка, медленная работа, постоянные ошибки. Огромное количество утилит обещают продлить срок жизни системы, но как бы они ни старались, результат один - рано или поздно ОС придется переустанавливать.
Выбор антивируса - задача непростая. Я решил ее радикально: не стал ставить защиту вообще, ибо для моего не очень шустрого компьютера любой современный антивирус был обузой. Приходилось бороться с нечистью собственными силами: постоянно просматривать папку «Автозагрузка» и отслеживать работающие процессы на предмет подозрительной активности - понятно, что при частом использовании Интернета столь нехитрых средств хватало не надолго. Когда ОС в очередной раз «ломалась», на помощь приходила отличная программа Acronis True Image, позволяющая восстановить систему из предварительно записанного образа. Впрочем, несмотря на относительную простоту операции, регулярно заниматься восстановлениями мне надоело.
Уже стало казаться, что придется покупать новый компьютер только ради установки нормального антивируса. И вот совершенно случайно ко мне попала программа весом 6,5 Мбайт, описание которой ничего сверхъестественного не обещало…
Фармакологические свойства
Попробую объяснить, что делает таинственная софтина по имени ShadowUser. Говоря коротко и не совсем точно, она запоминает состояние вашего жесткого диска и при каждой перезагрузке восстанавливает его. Казалось бы, ничего особенного, об этом мы говорили чуть выше - однако есть одна тонкость: вам не требуется ни делать образ диска, ни создавать «точку восстановления», как в утилитах класса True Image или GoBack. Достаточно активировать ShadowUser и перезагрузить компьютер - все, теперь вы в безопасности, о которой и не мечтали.
Насколько удалось понять из описания, принцип работы программы довольно прост. После активации «теневого режима» ваш компьютер загрузится как обычно - вот только это будет уже не настоящая система, а виртуальная. Удаляйте папки и файлы (можете даже попробовать удалить папку Windows - насколько это возможно), изменяйте все параметры реестра, удаляйте Boot.ini, попытайтесь отформатировать диск - все будет тщетно. После очередной перезагрузки от ваших действий не останется и следа.
Вся прелесть этой софтины - абсолютная незаметность ее работы. Конечно, программа занимает место на жестком диске, однако для нормального функционирования ей достаточно процессора с тактовой частотой 133 МГц и 128 Мбайт ОЗУ. В диспетчере задач висят два процесса, связанных с работой программы, забирают они до 8 Мбайт памяти, но самое удивительное - по-видимому, их можно спокойно завершить безо всякого вреда для функционирования ShadowUser.
Побочные эффекты
Несмотря на то что за несколько месяцев жизни «в тени» я не выявил ни одной явной проблемы, здесь есть некоторые тонкие места, о которых полезно помнить. Например, если вы в «теневом режиме» поменяете обои на «Рабочем столе», то после перезагрузки, естественно, обнаружите, что все осталось по-прежнему. В случае неправильных настроек программа может с той же легкостью «откатить» изменения файлов, не задумываясь о том, что в них вложены многие часы вашего труда.