Friday, July 22, 2011

Уха застольная, дачная

Помню фразу “Кто не работает, тот не ест”, кажется, из кодекса строителя коммунизма, у нас он в школе висел. После грубой инверсии получаем “кто работает, тот ест”. Последнее логически не строго. Инверсия утверждения "для всех: не работает, значит не ест" тождественна следующему "найдется хотя бы один, кто: не работает и ест". В блоггере не вижу возможности ввести формулу, поэтому копирую из гугловского документа как картинку
Итак, изготавливаем деревянный столик (Р работаем) и готовим стерляжью уху на обед (Е едим). Рецепт следующий.
Имеем расходные материалы:
  • Стерлядь свежая (спасибо Кирьяновым), 2 небольшие картофелины, луковица, перец горошек, лавровый лист, семена укропа (видимо, соль, но я все готовлю и ем без соли), долька чеснока.
  • Доска из бука 1002х200х20, сосновая доска толщиной 50, обрезки дюймовых сосновых досок не короче 500.
Приготовление ухи.
Чистим картошку, или обдираем, если свежая, моем и кладем в кастрюльку. Кладем чищеную луковицу, бросаем перец, лавровый лист, укроп, чеснок (как учил Виктор Раевский). Доливаем воды в кастрюльку так, чтобы после того, как загрузим рыбу, уровень воды оставался ниже края. Медленное кипение на плитке до момента, когда картошка почти готова (минут 10 до готовности). Во время варки, иногда заглядываем и снимаем накипь, оставляя всплывший перец и лаврушку. Загружаем три кусочка рыбы, закрываем крышкой. Чуть снижаем мощность плитки. Крышку не поднимаем, накипь не снимаем - то будет жир. Через 10-15 минут трогаем рыбу - готово.
Стерляжья уха. Вид изо рта.
Идем за зеленью. Начинаем есть, обжигаясь и мыча от удовольствия.
Изготовление столика 500х300х500.
Из сосновой толстой доски нарезаем 4 бруска 480х50х50. Буковую доску пилим пополам, получая две длиной 500. Одну режем вдоль, получая ее шириной 100, чтобы две вместе стали шириной 300. Из оставшейся буковой доски нарезаем 6 планок: четыре - 300х20х20, и две - 270х20х20. 
В сосновых брусках делаем пазы глубиной 10 и шириной 20. По два паза на каждом: один сверху вровень с краем, рискну сказать заподлицо; другой снизу на высоте 150 (верхний край). Прикручиваем 4 планки в пазах саморезами, соединяя бруски парами. Можно с клеем.
Пара соединенных ног столика, подстолье
Соединяем буковые доски в щит, который будет столешницей. Режем 2 поперечных паза 60мм (40+20) от краев по длине щита. В ширину щита пазы короче ширины щита, чтобы паз был не виден сбоку. С клеем (ПВА в моем случае, хотя лучше столярный клей, так как ПВА не шлифуется. Помню какие-то Бажовские куски желто-зеленоватого цвета, похожие на канифоль, на уроках труда, которые с приготовлением клея превращались в уроки химии. В пазах крепим планки к щиту (то есть снизу) саморезами длиной 25 (меньше, чем 10+20=30). 
Столешница перевернутая
Переворачиваем щит, кладем на ровную поверхность и с клеем крепим саморезами две пары сосновых брусков, которые становятся ножками. Саморезы 40мм (20+20) врезаем изнутри столика в планки, которые соединяют ножки в пары. На чистовой стороне щита никаких отверстий не должно появиться (углубление для головки самореза не делаем).
Стол по прежнему перевернут. Строгаем 4 доски из сосновой дюймовки длиной 500 для полки нижнего уровня. Уложенные вместе они должны быть шириной 300. У двух крайних делаем пазы для брусков-ножек. Четыре таких паза 50х50 с краев крайних досок. Щит не делал, то есть, поперечины не врезал. Крепил каждую саморезами к планке второго ряда на брусках снизу. 
Полка 
Переворачиваем. Убеждаемся, что получился столик.
Далее по вкусу: шлифование, шпаклевка, лак. В перерыве на обед - уха.
После обеда заглянул сосед, сто-килограммовый или больше. Показывает через забор кусок трубы и спрашивает: “Тиски есть? Патрубок отвернуть не могу”. Зашел, одну гайку открутил, остальные не смог, чуть тисочки с подставкой не разрушил. Говорит: “Пойдем, огурец дам”. Зашел я к нему в теплицу и ахнул, висят огурцы с метр длиной (загнул, конечно, но 300мм точно. Как раз, поперек моего столика). Огурец похож на зеленый французский батон. Ел его 2 дня, столько же строил столик.

Tuesday, June 28, 2011

"Расслоение" языка

Искал комментарии Лотмана и  наткнулся на тексты, посвященные юбилею Аквариума. Обращения написаны А.Троицким в разных стилях (скорее на разных языках) для разных слоев населения.
Рок-фанатам
Чуваки, чувихи! «Аквариум» едва ли не самая подкованная на предмет торчкового музона команда. В 72-м году они лабали по танцам Sabbath и прочий хардешник, но очень скоро Боря и Гаккель крепко подсели на Дилана и Т. Rex , а потом еще Харрисона и Лу Рида. Они много читали NME и Maker , поэтому в конце 70-х резко въехали в PISTOLS и заиграли что-то вроде панка. Но гораздо клевее у них покатил реггей. В конце 81-го в «Аквариум» пришли Курехин и Ляпин на лидере, и они заиграли полное электричество. А потом Боря спел, что рок-н-ролл мертв, и стал это доказывать на практике. У них вышло еще до фига альбомов, были классические песни все в основном в таком фолковом стиле типа Донована, Вэна Моррисона, Тома Петти... Короче, есть во что врубиться.
Интеллигенции
Друзья мои! В противоречивом мире рок-музыки не много отыщется исполнителей, творчество которых отмечено печатью высокого интеллекта. «Аквариум» одна из таких групп. Поэзия Бориса Гребенщикова яркое явление российской словесности. Как истинный художник, он никогда не шел на поводу у властей предержащих, не ставил свою музу на службу рыночному заказу. Как истинный интеллигент и гражданин, он не раз возвышал свой голос против кровопролития, духовного обнищания народа, коммунистического мракобесия и разбазаривания госказны. Выражаясь лапидарно, «Аквариум» в процессе креативной эволюции адекватно рефлексирует брожение русского пытливого менталитета конца XX столетия.
Новым русским
Дамы и господа! «Аквариум» один из самых успешных российских музыкальных проектов. Инициированный Б. Гребенщиковым в 1972 году, он первым из советских коллективов наладил (в 1980-м) регулярное производство и дистрибуцию аудиокатушек с записями своих песен. Карьера А. успешно продолжалась и в постсоветский период. В 1995 году был подписан контракт на эксклюзивный выпуск всей архивной продукции А. с фирмой «Триарий». Держатель авторских прав на песни А., Б. Гребенщиков может наряду с А. Макаревичем («Машина времени», «Смак», « Toshiba », фирма «Партия») претендовать на звание самого богатого человека из числа российских рок-исполнителей. Резюме: начав практически с нулевых инвестиций, «Аквариум» благодаря органичному менеджменту вырос в рентабельный музыкальный ансамбль.
Хиппи
Пипл! Ну разве есть у нас рокеры кайфовей «Аквариума»? Ну кого еще вы так любите за божественный стеб, за красоту, высоту и миролюбие? За мальчика Евграфа и Серебро Господа? Зажгите свечи и бал-дейте!
Иностранцам
Леди и джентльмены! В годы агонии коммунистического режима СССР не многие артисты осмеливались бросить вызов властям, и в числе этих отважных был «Аквариум». Свободолюбивые песни и нонконформистская позиция бэнда вызывали гонения со стороны КГБ. Противопоставляя себя тоталитарной системе, они выбирали низкооплачиваемые работы дворников и кочегаров, а свободное время посвящали музыке и альтернативному стилю жизни. Целое поколение иностранных студентов прошло через «Аквариум», оставив музыкантам и их подругам много джинсов, книг Толкиена, кассет и кисетов для марихуаны и увезя домой прекрасные воспоминания об этих русских. Песня «Этот поезд в огне», содержащая аллегорический образ Горбачева, утвердилась как один из гимнов перестройки. То cut a long story short : не поняв песни 212-8506, вам будет крайне трудно постичь загадку русской души.
Братве
Пацаны! (Далее см. раздел «Интеллигенции»). Теперь чисто без базара: крутые песни! Особенно эта «Долгая память хуже, чем сифилис». Или «Здесь может спать только тот, кто мертв»... Юноши и девушки! Вы живете активной жизнью, насыщенной новыми реалиями от «нинтендо» до «экстази», от роликов до презервативов. И песни «Аквариума» практически не имеют точек соприкосновения с вашей жизнью. Под них не потанцуешь, они навевают тоску и полны непонятных заморочек и ненужного пафоса. Сторож Сергеев просто деклассированный элемент, а сам Гребенщиков вылитый старик Козлодоев, тщащийся залезть к юной деве в постель со своим очередным компакт-диском. Мораль: разбирайтесь сами, парни и девчата. «Аквариум» полон рыбок: съел и порядок!
Митькам
Братушечки и сестренки! Кто гавкает? Дык Акваримушка же, елы-палы! Greatest Hits . Только ноженьки торчат... Положи его в воду, сестра. Тельничек потом высуши.
Журналистам
Коллеги! С Гребенщиковым и «Аквариумом» с самого начала все складывается легко. Они доступны, расположены к общению, словоохотливы. Грани облома начинают проступать позже: они отказываются говорить о собственных автомобилях (похоже, их нет), о сексе (возможно, и его нет), гонорарах (неужели и их?..) и не e состоянии прокомментировать высказывания Маши Распутиной, поскольку не знают, кто она такая. Далее по ходу дела выясняется, что собеседник эрудированнее вас и обладает более богатым словарным запасом. В довершение всего он не только не желает оплачивать интервью, но и требует, чтобы его угостили водкой.

Впечатляет остроумие и владение языками. Захотел написать что-то аналогичное для программистов, типа: “Дорогой программер. Вероятно (95%), ты трэкаешь исполнительскую активность группы. Если да, то знаешь, у них нет ни одной висячей ссылки, ни дефолта, ни умолчаний. Иначе - “// никогда здесь не окажешься”. Так вот, они тестируют новый релиз …”
Затем вспомнил, что среди программистов есть и интеллигенты, не скажущие “клава”, и братва, крякающая модное приложение. Тогда делать нечего. Сообщение доставлено.

Friday, June 24, 2011

Золотая рыба

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

Wednesday, June 22, 2011

Любовь к древесине

Вот чем занимался в июне 2011 на даче.
Построил забор из горбыля. Местные пилорамщики подсунули липу для пары столбов вместо сосны. Сам согласился - знаете, как бывает, вам говорят: “Сахара нет, но есть соль, берите”. И вы соглашаетесь. Ну вы-то, наверное, не согласились бы, а я сказал: “Что же делать, ладно”. Засек время на сколько простоят эти липовые столбы. По замыслу, забор должен был отделять наш участок от дороги. Он был доступен для прохода через соседний участок, стоявший без забора года три. Вдруг, в то время я заканчивал свой забор, сосед приехал с командой профессионалов, и те установили за два дня стену из железа высотой более двух метров, обессмыслив мой труд.
Строительство туалета никакой сосед не сможет сделать бесполезным. Даже если он приедет на днях с двумя двух-метровыми био-кабинками голубого цвета. Для нового проекта потребовалось больше изобретательности. Пришлось даже варианты деталей рисовать на бумажке - что к чему крепить и как интегрировать дверь в переднюю стенку. Понадобилось: 4 бруса 100х100мм, 4 доски 50мм, пол куба обрезной доски, пол рулона рубероида, две накладные петли, стеклышко и четвертинка ели, засохшей прошлым летом. Суетиться пришлось во время установки столбов - засыпать и трамбовать нельзя, вдруг криво, а без этого они валятся, и выравнять все четыре столба не возможно. В итоге, добился вертикальности, но не справился с диагональю. Крыша оказалась маловата, должен быть навес, чтобы дождь сливался не по стене. Ручка на двери из ствола елки с двумя ветками, продернутыми сквозь дверь, оказалась самой приятной деталью туалета. 
Может забить очко и использовать помещение из смолистой, еще живой сосны, для чтения при открытой двери? Обходились же.

Sunday, June 05, 2011

Бабочка, шахматы и карандаш


Перечитал и переслушал В.Набокова: “Дар”, “Другие берега”, “Отчаяние”, “Защита Лужина”, “Приглашение на казнь”, “Король, дама, валет”, “Подвиг”. В этот раз внимательнее, не на ходу и не урывками. Почти в каждом произведении находим бабочку, шахматы и карандаш. Для меня это, если коротко: очарование мира, глубокое раздумье и текст. Чуть иначе: метаморфозы превращений, проекция на квадрат внутренних усилий мышления над множеством вариантов и острота, конечность изображения мира.
Проигнорировал “Лолиту” и “Волшебник”, прочитанные раньше. Признаться, после “Волшебника” захотелось вообще отложить Набокова, который с настойчивостью сладострастника стремится довести читателя до “эротических судорог” (использую выражение В.Ходасевича в “О Сирине”).
Но вот вернулся к Набокову и испытал наслаждение. Счастливое наслаждение от языка. Как он сам считает - язык важнее идей. Точнее, пишет - “Его [Гоголя] произведения,  как и всякая великая литература, - это феномен языка, а не идей”.
Неразгаданным произведением (идеей) остается “Приглашение на казнь” или предпочитаемое автором “Приглашение на отсечение головы” (“Invitation to Decapitation или Beheading”). Цинциннат, сын случайного прохожего, один раз видевший мать, женившийся на Марфиньке, родившей ему не с ним зачатых детей, занимавшийся “изготовлением мягких кукол для  школьниц, -- тут был и маленький волосатый Пушкин в бекеше,  и похожий на крысу Гоголь в цветистом  жилете, и старичок  Толстой, толстоносенький,   в  зипуне ...”, был по доносу обвинен “гносеологической гнусности” (в непознаваемости окружающими его обывателями) и приговорен к отсечению головы. Около трех недель, от оглашения смертного приговора (сообразно с законом - шепотом) до казни, Цинциннат провел в тюрьме-крепости, где все представляется мнимым и бутафорским, пытаясь читать, писать и спастись, не признавая вины. Язык великолепен, в чем идея?
Конечно, можно предположить, что, как и всякий художник, Цинциннат жил, терзаясь в мирах действительном и воображаемом. Что борьба плоти и творческого духа представлена нам в “убогих призраках” и “бессмысленных видениях”.
Но что делать с множеством деталей в романе? Как они задуманы и родились у художника Набокова? Отражением чего они явились нам? Паук на резинке; нарисованный циферблат часов на стене; пароль и отзыв - молчание; визит в тюрьму Марфиньки со всеми ее родственниками, любовником, мебелью и даже кошкой, здесь же задушенной; выкопанный начальником тюрьмы туннель, ведущий из камеры палача Пьера в камеру Цинцинната (и обратно); правила для заключенных, безусловно запрещающие покидать здание тюрьмы и приводить женщин.
Где взять такое “уродливое зеркало”, чтобы все эти “нетки” увидеть “чудными стройными образами”, понятными мне? Про “нетки” Цинциннату рассказала мать - это такие уродливые неузнаваемые вещи, приложенные к уродливым зеркалам которые, вдруг становятся знакомыми и прекрасными. Если Цинциннат принимает реальность (хотя то, что его окружает, реальностью не назовешь) как бред, то почему он боится предстоящей смерти, которая тоже должна оказаться театрально мнимой?
Уводимый на казнь узник оставляет в камере листок с написанным и зачеркнутым словом “смерть”. Эпиграфом к роману автором выдумано высказывание “выдуманного” Делаланда: “Подобно тому как глупец полагает себя богом, мы считаем, что мы смертны”. 
Одним словом, вам уготовано бессмертие, но вы не знаете, что такое жизнь.

Thursday, May 26, 2011

Удается ли "одновременно делать деньги и творить добро"

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

Уважаемый С.Пачиков (помните основателя "ПараГрафа"?) пишет это в комментариях к интервью "В России нет государства", интервью с Ульямом Браудером, открывшим Европарламенту детали дела Магнитского. Открывающим и нам. Страшное дело.

Sunday, May 08, 2011

"Совершенная строгость"

Получил сегодня после обеда книгу и, не отрываясь, прочитал ее - “Совершенная строгость (Perfect Rigor). Григорий Перельман: гений и задача тысячелетия” Маши (почему тогда не Гриша) Гессен. Исходно относился к книге скептически: как можно писать о человеке, ни разу не поговорив с ним. Но книга увлекла. Увлек образ мальчика, ставшего математиком. Конечно, некоторые фрагменты книги пришлось проигнорировать, не в смысле чтения, а в эмоциональном, в смысле принятия написанного. Скажу о них позже. Но книгу надо читать.
Невозможно определить, насколько близки реальный Перельман и впечатления о нем автора книги, друзей, одноклассников и коллег Перельмана, решившихся отвечать на вопрос, какой он. Возможно, что безнадежно далеки, и он реальный, гораздо выше тех представлений о нем, как математике и человеке, которые можно получить из книги. Занимаясь пространствами Александрова, Перельман, видимо, как и его учитель, “открыл в математике новые миры и сейчас пребывает там в одиночестве”. Кажутся убедительными выводимые объяснения Маши Гессен (хотя и не приведены явно, как причины), почему Перельман отказался от наград и “ушел”. Вообще, становятся ясными два пере-открытия: 1. для того, чтобы совершить значительное, надо паталогически игнорировать все, что не служит цели (в предположении, что одарен и служишь цели); 2. не рассчитывать на деликатность сообщества, если достиг. Первое словами автора: “Перельману в математике удавалось то, что он пытался делать в жизни: охватить все возможности, существующие в природе, и отбросить все, что выходит за рамки естественного - будь то голоса кастратов, автомобили, антисемиты или еще какие неудобные сингулярности”. Иллюстрацией ко второму может стать такой факт: “Третьего июня Яу созвал в своем математическом институте в Пекине пресс-конференцию и объявил: “Вклад Гамильтона в доказательство составляет около 50%, россиянина Перельмана - около 25%, китайцев Яу, Чжу, Цао и других - около 30%””.
То, что я “игнорировал” в тексте: рассказы о завязанной шапке; брошенной скрипке; о зарплате аспирантов, которой хватало на 3 буханки хлеба; математике, основавшем правозащитное движение в СССР; секс-ориентации Колмогорова. Кроме того, Маша Гессен, видимо, попыталась поставить диагноз, написав главу о синдроме Аспергера. Неудобство, также, вызвали примечания к текстам. Сами примечания - доказательны (даны источники) и полезны, но ссылок на них в тексте нет.

Автор, Маша Гессен, является заместителем главного редактора проекта “Сноб

Wednesday, May 04, 2011

Блочное умножение матриц

Продолжение.
Этот пост - продолжение предыдущего, где обсуждалась производительность кода, генерируемого LLVM, по сравнению с GCC и ICL на примере умножения матриц. Тестировались реализации без блокирования. Здесь представлены результаты измерения производительности блокирующего алгоритма и пример автоматической генерации кода.
Поблочное умножение.
Алгоритм реализован для произвольных размеров матриц и блока. Производительность сравнивается с реализаций на asm как самой быстрой.
Ничего удивительного на графике не найти. Как бы ни был быстр asm код, обработка больших матриц и доступ к данным за пределами кэша ведет к замедлению. Видно падение производительности для объемов данных, превышающих 4 MB. Обработка по блокам, в основном, имеет дело с данными, лежащими в кэше, поэтому быстрее и, как видим, значительно. Умножение блока выполняется тем же самым asm кодом, с которым сравниваем. Скачки для блочной реализации объясняются разными размерами блока. При произвольности параметров есть условия максимальной производительности:
  • размеры матриц кратны размеру блока,
  • размер блока кратен 8-ми элементам (два SSE2),
  • указатели выравнены на 16 байтов.
Использовал размер блока до 256х256. Каждый раз максимальная производительность достигалась при наибольшем размере блока. Небольшой размер блока дает гибкость в обработке (бо'льшая часть матриц может быть накрыта блоками), но добавляет больше непроизводительных операций (копирование данных в/из блока)
Код можно генерировать
Может оказаться интересным автоматическая генерация кода, возможная, например, при использовании metaocaml. Сгенерировать код умножения матриц с разверткой циклов обнуления массива результата и внутреннего цикла умножения элементов матриц можно с помощью такого кода
Использованы 2 функции развертки: одна разворачивает весь цикл, другая разворачивает цикл до 256 с фактором. Развертка, как видим, выполняется на 8. Размер блока фиксирован - 256х256. Мета-средства, а именно, многостадийное программирование multistage programming , нужны здесь для генерации тела операции, которая размножается. В коде таких две: присвоение нулю и умножение элементов. С помощью офшоринг-механизма ".!{Trx.run_gcc}" генерируется следующий С-код
void mmm_256_u(float*a_4,float*b_5,float*c_6)
{
 int i_7 ;
 for(i_7 = 0; i_7 <= 255; i_7++)
 {
   int i256_8 ;
   int ii_13 ;
   int k_9 ;
   i256_8 = i_7 * 256;
   for(ii_13 = 0; ii_13 <= 32 - 1; ii_13++)
   {
     c_6[i256_8 + (ii_13 * 8 + 0)] = 0.;
     c_6[i256_8 + (ii_13 * 8 + 1)] = 0.;
     c_6[i256_8 + (ii_13 * 8 + 2)] = 0.;
     c_6[i256_8 + (ii_13 * 8 + 3)] = 0.;
     c_6[i256_8 + (ii_13 * 8 + 4)] = 0.;
     c_6[i256_8 + (ii_13 * 8 + 5)] = 0.;
     c_6[i256_8 + (ii_13 * 8 + 6)] = 0.;
     c_6[i256_8 + (ii_13 * 8 + 7)] = 0.;
   } ;
   for(k_9 = 0; k_9 <= 255; k_9++)
   {
     int k256_10 ;
     float aa_11 ;
     int ii_12 ;
     k256_10 = k_9 * 256;
     aa_11 = a_4[i256_8 + k_9];
     for(ii_12 = 0; ii_12 <= 32 - 1; ii_12++)
     {
c_6[i256_8 + (ii_12 * 8 + 0)] = c_6[i256_8 + (ii_12 * 8 + 0)] + aa_11 * b_5[k256_10 + (ii_12 * 8 + 0)];
c_6[i256_8 + (ii_12 * 8 + 1)] = c_6[i256_8 + (ii_12 * 8 + 1)] + aa_11 * b_5[k256_10 + (ii_12 * 8 + 1)];
c_6[i256_8 + (ii_12 * 8 + 2)] = c_6[i256_8 + (ii_12 * 8 + 2)] + aa_11 * b_5[k256_10 + (ii_12 * 8 + 2)];
c_6[i256_8 + (ii_12 * 8 + 3)] = c_6[i256_8 + (ii_12 * 8 + 3)] + aa_11 * b_5[k256_10 + (ii_12 * 8 + 3)];
c_6[i256_8 + (ii_12 * 8 + 4)] = c_6[i256_8 + (ii_12 * 8 + 4)] + aa_11 * b_5[k256_10 + (ii_12 * 8 + 4)];
c_6[i256_8 + (ii_12 * 8 + 5)] = c_6[i256_8 + (ii_12 * 8 + 5)] + aa_11 * b_5[k256_10 + (ii_12 * 8 + 5)];
c_6[i256_8 + (ii_12 * 8 + 6)] = c_6[i256_8 + (ii_12 * 8 + 6)] + aa_11 * b_5[k256_10 + (ii_12 * 8 + 6)];
c_6[i256_8 + (ii_12 * 8 + 7)] = c_6[i256_8 + (ii_12 * 8 + 7)] + aa_11 * b_5[k256_10 + (ii_12 * 8 + 7)];
     } ;
   } ;
 } ;
}

Пришлось отредактировать только тип данных, заменил double на float - ocaml знает только тип данных с плавающей запятой double. Производительность кода с разверткой плохая. Как мы уже упоминали, ручная развертка мешает Intel компилятору векторизовать код. Следовательно, средства мета-программирования, использованные здесь для развертки, оказались неприменимы.
Высокой производительности достигает код без развертки, генерируемый из такого ocaml кода
ICL успешно векторизует оба цикла и обеспечивает производительность близкую к производительности asm кода - чуть хуже, смотри красный кружок на первом рисунке. Итак,
для матриц размером 2072x2072 и блоков размером 256x256
  • unrolled: 1161 MFlops,
  • vectorized by ICL: 2339 MFlops.
Многостадийное программирование особенно эффективно в тех случаях, когда на этапе компиляции известна дополнительная информация о данных. Например, есть умножения на 1.0 или 0.0, или вычисляются значения тригонометрических функций для pi/2, pi/4. Примером такой задачи является FFT, решение ее подробно рассмотрено в работе "A Methodology for Generating Verified Combinatorial Circuits" авторами O.Kiselyov, K.N.Swadi и W.Taha - восхитительный образец использования мета-программирования.

Monday, April 18, 2011

Дракон LLVM

Интерес к LLVM
Пока зал ремонтируют, а в лес не зайти, проверил C-компилятор LLVM. Проверял только производительность генерируемого кода, хотя возможности среды разработки LLVM значительно шире, например, генерация и выполнение бит-кода, и создание компилятора по вкусу. Скачал исходники и построил в Win32, точнее в cygwin, и Darwin9. Сообщу на всякий случай, что при сборке в Win32 встретил только одно затруднение - с ocaml. Проблема разрешилась установкой правильной переменной окружения OCAMLLIB, которая должна указывать на cygwin версию ocaml. LLVM действительно оказался сильным средством. Не зря его использует Apple. LLVM используется в ocamlopt среды программирования OCaml, его встроили в Haskell, и его используют с Питоном в Google. Разрабатывается реконфигурируемый MPEG видео-декодер LLVM-based scalable MPEG-RVC decoder. Это только крупные видимые проекты. 
Таймирование 
В качестве тестовой задачи написал на С несколько вариантов умножения матриц MMM, так называемые Schoolbook версии со сложностью O(n^3). До блокирования матриц дело не довел, может позднее получится сгенерировать код автоматически. Замечу, что сравнение с MKL имеет смысл только для кода с блокированием. Тест построил следующими компиляторами gcc, Microsoft, LLVM и Intel. Интерес, в основном, был к gcc и llvm, так как они доступны везде и бесплатно. Но затем, когда стало понятно, что llvm хорош, для полноты картины добавил MS и Intel компиляторы. Опции и версии компиляторов:
CL 16.0: -O2 -arch:SSE2 -fp:fast
clang 2.8: -O3 -msse2 -march=core2
ICL 10.0: -O3 /QxP /arch:SSE2
g++ 4.3.4: -O3 -msse2 -march=core2 -funroll-loops.
Тестовая машина: Win32, T2500 1994MHz L2=2048K.
Матрицы: 400x40 * 40x800 = 400x800
Задача - сравнение компиляторов, а не тестирование машины, и не оценка реализации функции умножения матриц. Поэтому ни Штрассен, ни блокирование не обязательны.
Результаты таймирования
Сначала посмотрим на результаты тестов производительности, а затем кратко обсудим LLVM. Результаты даны в MFlops
Супер-производительность кодов компилятора Intel не должна отвлечь нас от рассмотрения других результатов.
В любой задаче, даже сверх-вычислительной, имеет значение, как читается память: последовательно, значит из кэша, или фрагментами за пределами кэша. В наивной версии МММ, так называемой ijk (смотри Golub “Matrix computations”), только для одной матрицы читаем память последовательно без скачков. Для второй, мы читаем данные по столбцу, перемещаясь по памяти через строку, не используя данные в кэше и теряя производительность. В перспективной версии ikj, тоже наивной, данные двух матриц читаются последовательно по строкам. Плата за такое преимущество - дополнительная операция - обнуление матрицы результата перед вычислениями (или заполнение первыми результатами). В обнулении ICL тоже преуспел со своим intel_fast_memset.
MS без опции fp:fast в 2 раза медленнее из-за постоянных преобразований float-double.
GCC хорош, особенно на reference коде. Опция unroll значительно улучшила результаты. Однако, GCC использует только скалярные SSE инструкции и поэтому не может достичь высокой производительности.
ICL очень хорош на MMM реализации ikj с последовательным чтением данных, но тормозит, если программист сам пытается развернуть циклы.
Грубо говоря, имеем 2 кластера производительности на тестовой машине: 1000 MFlops и 2000 MFlops. Во второй можно попасть только с векторизацией и инструкциями для выравненных данных. В этом равных ICL нет.
LLVM
Результаты показывают, что LLVM имеет не плохой компилятор, хотя он значительно моложе gcc. Результаты были бы еще лучше, сумей я заставить его развернуть цикл. Не получилось ни в Win32 с clang, ни в Darwin c llvm-gcc. Даже демо версия компилятора, доступная на сайте online, не разворачивает скалярное произведение векторов. С разверткой он, думаю, уступил бы только ICL. Возможно, что в Linux, LLVM успешно разворачивает и векторизует. Не знаю, пока не было возможности попробовать.
LLVM использует, и дает такую возможность нам пользователям, промежуточное представление кода IR. IR является основой генерации и выполнения байт-кода, и вы можете программировать на его языке, близком к ассемблеру. Насколько близком? Например, для того, чтобы векторизовать основной цикл умножения матриц мне пришлось написать на LLVM ассемблере следующее (фрагмент, внутренний цикл, вычисляющий c+=a*b)
Код дан рисунком, потому что иначе blogger не может сохранить сообщение. Что интересного можно заметить в коде? Видим так называемую phi переменную, которая позволяет присваивание значений в ходе исполнения кода в зависимости от того, откуда инструкции пришло управление. Например, indvar будет присвоено значение indvar.next, если управление передано из текущего блока bb.nph; или 0, если управление пришло извне, в частности, из блока bb.nph14. Случай многократного присваивания значений переменной является специальным, так как в IR действует закон одного присваивания SSA. Видим строгую проверку типов - все операции сопровождаются указаниями типов операндов. Один из типов, а именно <4 x float>, обеспечивает использование SIMD. С параметром “align 4” генерируются инструкции movups, если заменить его на “align 16”, генерируются muvaps. Выгодно то, что код близок к уровню ассемблера и с ним можно идти на любую платформу, чего не скажешь о коде на masm или gas. 
Фрагмент представляет собой самостоятельный блок программы, который можно перемещать. Таким же образом, то есть перемещаемыми, оформляются эпилоги и прологи циклов, что обеспечивает оптимизирующие преобразования циклов - изменение порядка вложенности и слияние циклов. LLVM поддерживает большое количество преобразований кода, в том числе и развертку циклов, которой я безуспешно добивался. Оптимизирующими преобразованиями занимается модуль opt. Он анализирует и преобразует байт-код в оптимизированный байт-код. Чрезвычайно полезен, если код генерируется автоматически. Пользователь может встраивать свои собственные преобразования, которые будут включены в список проходов оптимизатора. 
Генерацией кода на конкретную платформу занимается компилятор llc. Так как полный список поддерживаемых процессоров в документации явно не дан, приведу его здесь: amdfam10, athlon, athlon-4, athlon-fx, athlon-mp, athlon-tbird, athlon-xp, athlon64, athlon64-sse3, atom, barcelona, c3, c3-2, core2, corei7, generic, i386, i486, i586, i686, istanbul, k6, k6-2, k6-3, k8, k8-sse3, nehalem, nocona, opteron, opteron-sse3, penryn, pentium, pentium-m, pentium-mmx, pentium2, pentium3, pentium4, pentiumpro, prescott, sandybridge, shanghai, westmere, winchip-c6, winchip2, x86-64, yonah. 
Последний шаг
Завершил я это короткое изучение написанием кода умножения матриц, версия ikj, на ассемблере c векторизацией на SSE2 инструкции, анализом выравненности указателей и специальным кодом для невыравненных. 
Производительность ассемблерного кода чуть лучше кода, генерируемого ICL и значительно лучше кода LLVM, как С, так и ассемблерного.
Заключение
Если вы решили написать компилятор, создать новый DSL, или решили, что писать на masm и на gas для пары процессоров один и тот же код слишком накладно или слишком “низко”, то LLVM является хорошим кандидатом для того, чтобы стать вашим основным инструментом. 
Если нет, продолжайте использовать MS CL и GCC. С требованием высокой производительности кода следует обратиться к Intel ICL.
Если выравнивание утесняет вашу самобытность
Использование SIMD инструкций для выравненных на 16 байт данных значительно ускоряет код, хотя и требует дополнительных затрат либо на выравнивание, либо на анализ указателей и написание отдельных “веток” кода. Выравнивание указателей есть не единственный пример повышения производительности выравниванием. Смотри, например, Морской словарь Самойлова: 
"ВЫРАВНЯТЬ ВЕСЛА" — команда, подающаяся на гребных шлюпках, когда весла засушены. По этой команде гребцы равняют весла по загребному так, чтобы все они оказались в одной горизонтальной плоскости и параллельными между собой.

Sunday, April 03, 2011

Лисичка и iPod

Расскажу тебе, дружок, о том, как лисичка-сестричка перестала кур таскать и заинтересовалась музыкальными устройствами. Однажды ранним утром я пошел в лес. Почти каждое летнее утро я хожу на наше с приятелем специальное место, чтобы размяться и подышать свежим лесным воздухом. Для того, чтобы не думать всякие неполезные мысли пока идешь, я слушаю сказки, романы и стихи. Для такой цели служит iPod, маленько устройство с надкусанным яблоком на обратной стороне. Наверное, ты видел его у своих родителей, а может оно у тебя есть. В этот раз я слушал “Маленькие трагедии” Александра Сергеевича Пушкина. Попробуй запомнить такие строчки из его произведения
Ныне церковь опустела;
Школа глухо заперта;
Нива праздно перезрела;
Роща темная пуста;
И селенье, как жилище
Погорелое, стоит, —
Тихо все.
Позднее, они помогут тебе узнать и полюбить великого русского поэта.
Придя на полянку, отгороженную молодыми кленами, я положил iPod на упавшее дерево. Раньше оно было могучей сосной. Около 10 лет назад страшная буря повалила деревья в лесу. Даже крепкие сосны не выдержали напора сильного ветра и рухнули, бессильно подняв свои переломанные корни. Теперь они покрываются мхом, трухлеют и постепенно исчезают, превращаясь в дерн.
Я тихо стоял, прислушиваясь к шорохам леса, как вдруг увидел, что рыжая лисичка бесшумно и уверенно семенит по тропинке в мою сторону. Мое неподвижное тело в одежде с зелеными разводами нисколько не встревожило ее. Она приближалась, обшаривая юрким носом следы на тропинке. Иногда поднимала острую мордочку и обнюхивала воздух. И тут она нашла устройство с нарисованным яблоком. Видимо, это было то, что она искала. Не раздумывая, лисичка схватила зубками провод и стала тянуть. iPod молча упал на землю. Кнопка “Играть” осталась не нажатой.
Я шевельнулся от восторга. Лисичка посмотрела на меня. Попробовала потянуть сильнее. Это было нелегко, потому что провод тянулся к коробочке через сучок. Рыжая умница поняла, что интерес к красивой игрушке затормозит ее бегство, отпустила провод и, не торопясь и оглядываясь, пошла по тропинке обратно.
Если ты, дружок, научишься замирать неподвижно, внимательно прислушиваться и наблюдать, то многое сможешь узнать о таинственном лесе и любопытных зверюшках, которые в нем живут.

Friday, April 01, 2011

Прикоснуться к Петру

Предлагается новый вид искусства скульптуры, предполагающий тактильное восприятие прекрасного. Разухабистые фигуры на арбатах такую роль сыграть не могут. В музее или выставочном зале скульптуры трогать запрещено. Думаю, это сильно ограничивает нас в восприятии, а некоторых лишает его совсем. Да и скульптор, очевидно, рассчитывает только на наше зрение. Конечно, есть изваяния, которые трогать не хочется, гипс шершав,  мрамор холоден. Фигуры должны быть из бронзы, меди или дерева, натуральных размеров, без высокого постамента. Я например, с удовольствием потрогал бы Петра работы Шемякина, суставы пальцев рук, череп, складки шарфа, полу сюртука, оказавшуюся отделенной от самого Петра. Ладонь должна накрывать несколько неровностей, морщин и складок. Ничего подобного невозможно достичь на Петре работы Церетели, вряд ли на того можно взобраться без снаряжения и лодки. Такие гиганты, кстати, могли бы стать отдельной разновидностью скульптуры, исследовать и рассматривать которые приходилось бы, взбираясь на нее. Тут Церетели стал бы непревзойденным.
Возвращаясь к воображаемому виду скульптуры, постигаемому через ощущение прикосновения, можно ожидать, что “зрительские” (скорее тактильные) симпатии можно будет легко обнаружить. Представим, например, стоят (или сидят) отполированный Путин и тусклый Медведев. Про женские фигуры особый разговор, их немедленно отнесли бы к эротике, потому что попадание руки на грудь может серьезно изменить состояние воспринимающего.