20 нояб. 2009 г.

О-у-о, теперь ты в армии

Недавно в городском транспорте встретил хорошего знакомого. Знакомый рассказал, что пяти лет обучения в нашем университете ему показалось мало и несмотря на разоблачающую статью “Зачем идти в аспирантуру?” друга Михи, он всё равно решил поступить в очную аспирантуру ХНУРЭ.

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

Это анонс небольшого цикла статей на тему “Как выжить молодому ученому в университете”. Что нас всех ожидает:

  • выбор темы научной работы
  • проведение исследований и получение практических результатов
  • научно-практические конференции
  • оформление рукописи
  • защита работы

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

3 нояб. 2009 г.

Каникулы как снег на голову

flu-face

Всё началось ещё в прошлую пятницу, когда мне друзья прислали ссылки на новости. В новостях говорилось, что принято решение закрыть вузы на три недели на карантин.

Мне сразу же захотелось получить какую-то официальную информацию от нашего руководства. Занятно, что на титульных страницах четырех крупных харьковских университетов: ХИРЭ, ХГУ, ХПИ, ХАИ, нет информации о карантине и переносе занятий и по сей день. На нашем сайте с электронными расписаниями у студентов до сих пор стоят пары на эту и следующие недели.

Вчера мне позвонил декан факультета КИУ Владимир Иванович Хаханов и мы всё-таки разместили это объявление на сайте факультета: занятия прекращены до 23 ноября 2009 года.

Чем же занять себя студенту на эти три недели? Понятно, что занятия за этот период отрабатывать придется. Лабы нужно будет сделать, курсовые и рефераты сдать, на экзаменах спросят все 120 % вопросов, и никаких поблажек не будет. Есть два варианта развития событий: а) уплотнение графика занятий, чтобы студенты учились с 7:45 до 21:45; или, что более вероятно: б) отсутствие зимних каникул — сдадите экзамены и сразу начнется следующий семестр.

Таким образом, список “чем заняться” может выглядеть так:

  • самостоятельно доделать лабораторные работы или выполнить их наперед, чтобы сэкономить время и досрочно закрыть предмет;
  • подготовить рефераты, если были заданы;
  • сделать курсовые проекты — обычно на них требуется много времени, можно делать с утра до вечера, как раз не будете отвлекаться на походы в университет;
  • найти книги и самостоятельно готовить материал, который предстоит пройти, — это высший пилотаж, но попробовать стоит.

Если уроки сделаны, то можно заняться другими вещами: повидаться с друзьями и родственниками, решить бытовые вопросы, заняться хозяйством, выучить новый язык программирования (или подтянуть старый), почитать ту книжку, которая давно стоит на полке и ждет своей очереди, сделать с другом какой-нибудь быстренький проект.

Если коротко: чем вы заполните своё время, то в результате и получите. Успехов и будьте здоровы!

P. S. Бонус-трек от Саши Адамова: советы по профилактике заболеваний.

16 окт. 2009 г.

Doxygen для SystemC 2.2.0

Часто при изучении новой библиотеки нужно посмотреть иерархию классов или список методов конкретного класса. Прыгать из файла в файл по ссылкам “Show Declaration” в Визуал Студии не всегда удобно. Есть утилита Doxygen, которая разбирает проекты, написанные на разных языках, и генерирует гипертекстовый сайт. На этом сайте можно просмотреть список всех классов, иерархию в UML-виде, список методов с описанием.

В курсе “Компьютерные технологии в автоматизированном проектировании” мы изучаем SystemC и такая документация была бы очень полезна. В интернете нашел несколько опубликованных сайтов с документацией, но с неактуальными версиями. Поэтому, решил сгенерировать и опубликовать самостоятельно: http://kiu.kture.kharkov.ua/systemc/html

К сожалению, реализация библиотеки SystemC с официального сайта не имеет встроенной документации в формате Doxygen, поэтому описания методов и классов не доступны.

2 окт. 2009 г.

ХНУРЭ — 79

И вот снова разгар осени, и вот снова День рождения родного университета. Руководство считает, что это именно 79-я годовщина основания, но тем не менее имеются и другие мнения на этот счет.

79 лет ХНУРЭ

На самом деле не так важно, сколько лет этим старым стенам или сколько лет назад было сменено название (а оно менялось несколько раз: ХИГМАВТ → ХИРЭ → ХГТУРЭ → ХНУРЭ). Университет — это люди которые в нем работают и учатся, а не стены. Люди учатся и работают здесь и сейчас. Хочу пожелать этим людям крепкого здоровья и ежедневных успехов. Для меня хороший университет — это где студенты учатся, преподаватели учат, и все отношения построены на любви и уважении друг к другу.

С праздником!

30 сент. 2009 г.

29 сент. 2009 г.

Гранты для аспирантов от IBM

IBM объявила о начале конкурса по Программе «IBM Ph. D. Fellowship Awards Program. Гранты IBM для аспирантов» на 2010—2011 академический год. Программа «IBM Ph. D. Fellowship Award» является ежегодным международным конкурсом, который поощряет талантливых аспирантов, проводящих исследования в областях, ключевых для IBM, являющихся фундаментом для инноваций.

Грантами IBM Ph. D. Fellowships награждаются только аспиранты дневной формы обучения, номинирующиеся их научными руководителями.

Период приема заявок на участие: с 22 сентября до 29 октября 2009 года.

https://www.ibm.com/developerworks/university/phdfellowship/

25 сент. 2009 г.

Рост использования С++-синтеза

Шон МакКлауд, директор из Ментор Графики, сообщает, что к концу 2009 года количество фирм, использующих С++-синтез для производства, превысит 33 %. В 2008 году этот показатель составил около 14 %. Статистика была собрана в результате анонимного опроса 800 инженеров. Опрос спонсировался Ментор Графикой.

Три причины, по которым инженеры выбирают С++-синтез, это: а) проще верифицировать (68 % опрошенных); б) быстрее получается RTL (64 %); в) нужно меньше людей, что в условиях кризиса очень актуально.

А вот интересная статистика по объему рынка продуктов высокоуровневого синтеза и связанных с ними сервисов. Эти цифры собраны аналитиком Гарри Смитом и опубликованы в июльском номере журнала “IEEE Design and Test of Computers”.

cppsynthesismarket

Диаграмма очень интересная. Смит сообщает, что в 90-х годах у пользователей появился интерес к высокоуровневому синтезу, но инструменты были далеки от того, чтобы быть пригодными на производстве. Из-за этого доверие к ним было утрачено. В последние же годы наблюдается повторный расцвет программ высокоуровневого синтеза нового поколения. Знаю, что многие скептически относятся к С++ и SystemC как к языкам описания систем. Посмотрим спустя несколько лет, как будет на самом деле.

А ещё знакомые подсказывают, что все эти цифры — маркетинговый булщит, чтобы завлекать пользователей, типа “смотри, уже половина купила С++-синтез, так давай покупай и ты”!

22 сент. 2009 г.

Гранты от “Лаборатории Касперского”

Коллеги из Москвы шлют добрые вести.
“Лаборатория Касперского” напоминает о том, что продолжается подача заявок на участие в  программе поддержки инновационных проектов.
Студенты, аспиранты, молодые ученые, преподаватели высших учебных учреждений, профессоры и научные сотрудники могут воплотить свои идеи в жизнь уже в этом году. Сумма гранта, выделяемая на один проект, может составлять от 50 до 150 тысяч рублей!
Заявку необходимо подать до 18:00 30 сентября 2009 г. Конкурсная комиссия из числа ведущих экспертов “Лаборатории Касперского” начнет свою работу сразу после завершения срока подачи заявок и посвятит этому два месяца.
Как вы помните, подробно ознакомиться с положением “Программы поддержки инновационных проектов” и скачать необходимые для подачи заявки документы можно по адресу http://www.kasperskyacademy.com/ru/grants
Каждая хорошая история начинается со знакомства. 22—23 марта 2005 года наша кафедра проводила международную конференцию “Информационные технологии — в науку и образование”. Среди участников конференции были и гости из московского офиса “Лаборатории Касперского”: Станислав Шевченко, Сергей Новиков и Светлана Ефимова. Их лекции произвели сильное впечатление, людей в 301б было столько, что некоторым пришлось стоять.
kaspersky-lecture
Сотрудниками ЛК было неоднократно заявлено, что компания всегда рада сотрудничеству со студентами и университетами. 25 марта Саша Егоров собрал около 10 студентов, чтобы обсудить возможные проекты с лабораторией. Эта дата считается основанием “Клуба Касперского” в ХНУРЭ. На фотографии показано одно из первых заседаний клуба тех времен.
kaspersky-club
За четыре года было сделано многое. Например:
  • начаты исследования по анализу вредоносного кода;
  • проведено тестирование различных продуктов “Лаборатории Касперского”;
  • разработано несколько версий “Вивария” — системы документооборота вирусных аналитиков;
  • подготовлен и читается несколько лет курс “Компьютерные вирусы и средства борьбы с ними”;
  • выполнены и успешно защищены несколько курсовых и дипломных работ.
Ещё один большой результат — это создание ООО “Лаборатория дизайн и тест”, целью которого есть исследования в области компьютерной безопасности. За эти четыре года наши вирусные аналитики подготовили более 5 000 описаний вредоносных программ для сайта www.securelist.com.
“Лаборатория Касперского” не стоит на месте и постоянно развивается. Конкурс инновационных проектов среди студентов и молодых ученых — и есть тому подтверждение.

19 сент. 2009 г.

Вебинар по заявкам

Вебинар Ментор Графикса по системному уровню проектирования, о котором шла речь три дня назад, появился в открытом доступе по заявке. Кому интересна тема С++-каким-то-магическим-образом-в-RTL — приглашаю к просмотру. Студентам специальности “компьютерная инженерия” смотреть обязательно. Такое у нас редко где услышишь.

Вебинар по заявке “Проектирование аппаратуры на С++”

18 сент. 2009 г.

Новый полезный блог

Сегодня узнал о существовании нового полезного блога “Советы по повышению персональной продуктивности с помощью программного обеспечения и онлайновых сервисов”, а короче ProductivityBlog.com.ua. Не знаю, стоит ли описывать этот блог после такого содержательного названия?

Например, среди записей есть:

Автор блога — Александр Бабич, ИТ-тренер с суровым опытом: чего стоит только подборка записей о проведенных и подготовленных тренингах в количестве 199 (сто девяносто девять) штук. Саша — известный популяризатор новых методов в образовании. Я до сих пор помню замечательную поездку весной 2006-го в Полтавский педагогический университет на семинар по образованию, который организовал Саша.

15 сент. 2009 г.

Был на вебинаре Ментор Графики

Сегодня прошел вебинар (веб + семинар) фирмы Mentor Graphics на тему «Hardware Designs Reuse Using C++ and High Level Synthesis». Лекция в тезисах:
  • поддерживается синтез ANSI C++ в RTL;
  • повышение производительности инженеров в 10—20 раз, а также сокращение времени на верификацию;
  • качество синтеза эквивалентно ручному;
  • доступны различные параметризируемые типы данных, которые хорошо синтезируются в аппаратуру;
  • объектно-ориентированная архитектура устройства, например, можно делать устройства с одним интерфейсом, но с разной реализацией;
  • можно посмотреть результаты планирования выполнения микроопераций на диаграмме Ганта: временные задержки, распределение по тактам.
В целом, ничего нового с весны не услышал. В конце была возможность задать вопросы лектору пальцем по клавиатуре, а ответ послушать ухом из динамика. Спросил следующие вопросы и получил конкретные ответы.
Вопрос: как обстоит дело с поддержкой SystemC?
Ответ*: наши пользователи в основном используют чистый С++, потому что они программисты и совсем не знают SystemC.

Вопрос: как происходит совместный программно-аппаратный синтез?
Ответ: никак. На данный момент это всего-лишь инструмент для C++ в RTL синтеза и всё.

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

* здесь и далее вольный пересказ
Есть возможность посмотреть более подробные демонстрации на сайте Ментор Графики.

Продолжаем работу над нашим транслятором. Среди ближайших задач: встраивание функций, оптимизация выражений. 

Обновление в Блоггере

Не прошло и ста лет, как в Блоггере появился более-менее вменяемый визивиг-редактор.

14 сент. 2009 г.

Патент на высокоуровневый синтез

На прошлой неделе готовил лекцию о языке SystemC и наткнулся на статью Stephen A. Edwards, «The Challenges of Synthesizing Hardware from C-Like Languages», о различных С-подобных языках, применяющихся для описания аппаратуры. Среди различных языков и инструментов была ссылка на американский патент № 6 226 776 о синтезе С в железо, который сейчас якобы принадлежит фирме Synopsys. Автор статьи описывает патент, как «претендующий на широкую поддержку языка ANSI C»: упоминается поддержка указателей, рекурсии, динамического распределения памяти.

Я заинтересовался этим патентом. Около 85 страниц из всех 108-и — это примеры на С и соответствующие им результаты синтеза на Верилоге. Ещё 14 страниц — это словесное описание всех примеров. И последние четыре страницы посвящены описанию формулы изобретения. Модели в основном представлены в виде цифровых автоматов, намного реже — data-flow модели. Как такового метода преобразования С в цифровой автомат там не было. Я обратил внимание на один пример, в котором из одной функции вызывались две другие.

int sum1 (int n)
{
    int i, sum = 0;
    for (i = 0; i < n; i++)
        sum += i;
    return sum;
}

int sum2 (int array[], int size)
{
    int i, sum = 0;
    for (i = 0; i < size; i++)
        sum += array[i];
    return sum;
}

int f1()
{
    int i;
    int array[10];
    int size = sizeof(array)/sizeof(*array);
    for (i = 0; i < size; i++)
        array[i] = i * 2;
    return sum1(size) + sum2(array, size);
}

* This source code was highlighted with Source Code Highlighter.

Перед тем, как читать дальше, подумайте: сколько состояний автомата нужно, чтобы выполнить этот алгоритм? Мне тоже сначала показалось, что должно быть немного. Но в предложенном варианте синтеза для выполнения этого алгоритма нужно 16 состояний автомата. Так как мой компилятор С++ в VHDL ещё не способен откомпилировать такой код, то решил нарисовать граф-схему алгоритма вручную.

Все функции уже встроены, и предполагается, что инициализация переменных происходит по сигналу reset. Таким образом, в этом автомате получается всего лишь семь состояний (см. Баранов С. И. Синтез цифровых автоматов).

Вот не могу понять: у них там в 2001 году не знали то, что у нас было известно ещё в 1974?

24 авг. 2009 г.

Ищем студента для магистратуры и аспирантуры в Южной Корее

Друг Рома Хван пишет из далекой Кореи и всем передает привет. А ещё он просил помочь найти студента-бакалавра, который готов на несколько лет поехать в Южную Корею (это там где Сеул, Самсунг, Старкрафт, Киберспорт, а не там где большая ядерная ракета) закончить магистратуру и аспирантуру. Оплата обучения и проживания за счет принимающей стороны. Это ромино письмо можно считать приглашением:

Привет, снова. Недавно говорил с одним профессором из Electronics Department моего универа. Он хочет пригласить умного украинского студента учиться с ним (Master + PhD). Вот некая информация о профессоре. Soung Hyon (Name) Nam (Surname) Учился в Америке. Хорошо говорит на английском. Research Area: — Speech / Audio Processing — Separation, Enchancement, Recognition (of Speech) — Multi-channel / Single-channel Требования к студенту: — Matlab (Basics), C — Signal Processing background (Fourier Transformation, Convolution, Linear Time invariant systems) — Интерес к Signals & System. — English — Желание закончить в Корее магистратуру И аспирантуру (И не зря написано с большой буквы). Оплачивается проживание (living expenses + dormitory) и обучение. Если все проедет успешно, студент сможет начать учебу уже весной следующего года. В октябре начинается процедура приема студента в универ. Если есть вопросы, пишите мне на почту. С уважением, Роман Хван.

Почта Ромы Хвана: hwang.roman@gmail.com. Можно смело писать ему на почту лично, или написать на нашей доске объявлений. Перешлите/перепостите/перетвитните дальше кому это может быть полезно.

22 авг. 2009 г.

О чем на самом деле управление временем?

В продолжение нашей беседы об управлении временем хочу поделиться интересным интервью Ерванта Зориана — одного из лидеров САПР-индустрии:

«There are clearly always many more things to do than time allows. So if you have two or three times more to do than you have the hours to do them in, the issue is about prioritizing. About deciding not which things to do first, but which things will get done at all and which things unfortunately will not get done, and that is actually what time management is about. It's not only about which hour to do which task, but which task I will do at all. Realistically, we all need to learn to choose the right tasks, and learn to drop the others.»
«Очевидно, что всегда можно сделать больше, чем позволяет время. Поэтому, если вам нужно сделать в два или в три раза больше дел, чем у вас есть времени, то весь вопрос в приоритетах. Нужно решить не какие задачи делать в первую очередь, а какие задачи будут выполнены, а какие дела, к сожалению, не будут сделаны вообще. Вот что такое управление временем на самом деле. Это не только о том, в каком часу я буду делать задачу, а буду ли я её делать вообще. Действительно, всем нам надо научиться выбирать верные задачи, и научиться бросать остальные.»
http://www.dac.com/45th/DACEzineDecember2007-PeggyArticle.html

3 июл. 2009 г.

Конкурс Интела «Объясни на пальцах 2.0»

Очередной конкурс от Интела. На этот раз ничего не нужно программировать. Конкурс называется «Объясни на пальцах 2.0». Задача конкурса — дать простые определения для различных терминов параллельного программирования. Например, что такое SIMD и MIMD? Не пытайтесь бросаться в Гугл или Википедию за определениями. Лучше представьте такую ситуацию. Вы делаете лабораторную работу по оптимизации, подходит ваша бабушка, заглядывает в окно VTune Thread Profiler и спрашивает: «Внучок, а што это»? Объясните вашей бабушке, что такое thread pool и context switching, да так, чтобы она поняла и смогла пересказать другим бабкам на лавочке перед подъездом.

Конкурс проводится во второй раз. Вот как определил термин deadlock участник dnafigator:

«заходя в ванную, Анжелла забыла взять с собой халат. обычно, она может выйти в комнату и в неодетом виде, но пока она была в ванной, в гости зашёл Антон, которому Анжелла должна отдать флэшку, которая лежит у неё в сумочке. сам Антон в сумочку лезть отказывается, и требует, чтобы флэшку отдала ему Анжелла, и без флэшки он не уйдёт. Анжелла не может выйти в комнату пока там Антон. Антон ждёт, пока ему отдадут флешку, Анжела ждёт ухода Антона, после которого она может выйти и отдать»

Сайт конкурса: http://software.intel.com/ru-ru/articles/contest-spell-it-out-2-main/

28 июн. 2009 г.

Завел статью про Алдек на Википедии

На мой взгляд русскоязычная Википедия страдает от недостатка статей в области САПР микроэлектроники. Например, нет статей о таких гигантах, как Cadence, Synopsys, Mentor Graphics. Только что сделал небольшой перевод статьи из англоязычной Википедии про Алдек. Приглашаю к просмотру: Aldec. По хорошему надо сделать ещё статьи про Active-HDL и Riviera.

Первый раз про фирму Алдек я услышал на первом курсе. После второго курса поехал на летнюю практику к ним в Катовицы. Там я впервые понял, что такое тестирование программного обеспечения, как это круто быть инженером SQA, а также приобрел навыки, которые по сей день актуальны. Благо, местные знающие люди подсказали, помогли и научили. Рабочие дни дополнялись многочисленными этнографическими экспедициями по окрестностям: Гливицы, Краков. Для меня было открытием, что концлагерь Освенцим находится в каком-то десятке километров от Катовиц.

Фирма Алдек многому научила и многое дала не только мне, но и моим друзьям. В разных офисах в Харькове, Катовицах и Хендерсоне работают мои близкие знакомые, выпускники нашего университета. Поэтому, наполнение русской Википедии начнем именно с этой EDA-фирмы.

На фотографии ниже показан офис фирмы в Жерновце, совсем рядом с Балтийским морем. Живописное место — на ближайшие километры никто не живет, лес, гидроаккумулирующая станция и недостроенная атомная электростанция. Там очень уютно.

26 июн. 2009 г.

Куда поступать учиться?

Уже подвесили правила приёма в ХНУРЭ. Многие могут задаться вопросом: «Куда поступать учиться»? Рекомендую выбрать факультет компьютерной инженерии и управления ХНУРЭ, и соответствующее направление «компьютерная инженерия». Кроме здравого смысла, необходимость этой специальности подтверждается самым большим госзаказом таких специалистов среди прочих в ХНУРЭ: 110 бюджетных мест. Для тех, кто не попадает на бюджет, остается 190 контрактных мест со стоимостью обучения всего 7 200 грн. в год.

В подтверждении того, как у нас интересно, необычно, весело да и просто кайфово учиться, можете прочитать отзыв студента, который вот только отучился первый год.

Если ты умный молодой человек и хочешь многому научиться в компьютерах — иди к нам!

23 июн. 2009 г.

Прототип параллельного компилятора

А не задумывались ли вы, что узкое место при разработке чего-либо — это программист? Как бы вы быстро не печатали на клавиатуре, всё равно современные компиляторы компилируют намного быстрее. Мало кто знает, что оптимизация программ заключается не в том, чтобы программы быстро работали на процессоре, а в том, чтобы конечному пользователю было комфортно работать за компьютером. Предлагаю вам прототип параллельного компилятора, который компилирует исходный текст в тот самый момент, когда вы его пишите.

Изначально исходный файл пуст (см. рис. ниже), точно также объектная модель тоже пуста.

По мере того, как вы набираете текст программы, в параллельных потоках компилятор анализирует введенный текст, проверяет синтаксис, создает необходимые внутренние объекты (см. рис. ниже). Например, подключение заголовочных файлов — это вполне самостоятельный фрагмент программы, и компилятор сразу подключает необходимые пространства имен, идентификаторы и прочее. Это отражается в консоли сообщением «Библиотеки успешно включены», а соответствующие строки в редакторе имеют зелененький фон — «всё ок».

В процессе написания кода компилятор делает различные подсказки. В этом примере, в момент ввода последней строки компилятор встретил неизвестный идентификатор. Сразу же пишется сообщение в консоль с предложением задекларировать этот объект локально, глобально или как параметр. Также компилятор сообщает, что определение функции f1 ещё не завершено. Соответствующие строки кода подсвечиваются красненьким. На рисунке ниже показан результат автоматического определения объекта.

В момент написания последних строк программы (см. рис. ниже), компилятор определил, что текущий исходный файл не содержит ошибок и является завершенным. В консоли сообщается, что файл не содержит ошибок, а также информация о том, что функция f1 успешно определена.

Такой компилятор не нуждается в кнопке «Компилировать», потому что синтаксический анализ, построение внутренних объектов и генерация объектного кода происходит в фоновых параллельных потоках. Раз уж сейчас так популярны 2-, 4-ядерные процессоры, то почему бы не сделать такой подарок программистам.

Ответы на некоторые вопросы.

Вопрос: а не будет ли это тормозить, не будет ли трещать постоянно винчестер?
Ответ: если грамотно спроектировать и реализовать, то не будет. Речь идет не о полной перекомпиляции всего файла при вводе очередного символа, а об инкрементальной компиляции, когда перекомпилируется (или докомпилируется) блок, строчка или даже выражение исходного файла. Эти фрагменты достаточно малы, чтобы быть обработанными за считанные миллисекунды.

Вопрос: а как же быть, если мне попался уже готовый проект?
Ответ: при открытии проекта начать его компилировать в фоне, показывая прогресс в консоли.

Вопрос: где можно скачать такой компилятор или среду разработки?
Ответ: мне такие компиляторы не известны. Это только идея, как было бы удобно со стороны пользователя. Частично такая функциональность реализована в IntelliSence в Microsoft Visual Studio, когда на лету анализируются объекты, подчеркиваются неизвестные идентификаторы.

Вопрос: а если нет программы, то где ты делал скриншоты?
Ответ: скриншоты сделаны в Визио 2007.

Если ещё будут вопросы в комментариях, то обновлю пост и допишу ответы.

21 июн. 2009 г.

Проектирование на системном уровне (доклад)

Во вторник (23.06.09) состоится мой доклад по проектированию на системном уровне. Будет представлен обзор современного состояния, некоторые результаты по моей диссертации, а также различные идеи.

В программе:

  1. Ретроспектива средств автоматизации проектирования (с 1950-х).
  2. Современные подходы к проектированию.
  3. SystemC как язык проектирования систем.
  4. Использование виртуальных прототипов.
  5. Программно-аппаратные системы.
  6. Исследование пространства проектных решений.
  7. Синтез С++.

Дата: 23 июня 2009 (вторник).
Время: 18:00—19:00+.
Место: 318 ауд. ХНУРЭ.
Добавить в календарь:

Вход свободный.

Доклад будет интересен студентам специальностей «Специализированные компьютерные системы», «Компьютерные системы и сети», «Системное программирование». В ходе доклада будут рассмотрены основы, поэтому первокурсники могут приходить смело.

20 июн. 2009 г.

Конспект лекций по оптимизации

Есть хорошие и плохие новости.

Плохая новость заключается в том, что партком моей кафедры решил, что в 2009/2010 учебном году студенты третьего курса останутся без курса по оптимизации. Это связано не с тем, что курс сложный или никому не нужный. В этом году я убедился, что если взять почитать методички, то среднему студенту под силу разобраться. Скорее всего это связано с распределением нагрузки преподавателей. Теперь этот курс можно будет услышать только на вечерних занятиях на нашей кафедре.

Хорошая новость заключается в том, что работы по развитию дисциплин по оптимизации и параллельному программированию на этом не остановятся. В прошлом году я первый раз прочитал этот курс для студентов СКС и успел сделать какие-то слайды. В этом году к слайдам добавился конспект лекций, хоть и не полный, а также методичка по лабораторным работам. Мне хотелось бы пойти дальше и написать большой конспект лекций (книгу?), который бы объединил дисциплины «Многоядерное программирование» и «Введение в оптимизацию производительности программного обеспечения».

Представляю себе, что эта книга должна состоять из нескольких частей. Первая — вводно-мотивирующая, чтобы после её прочтения не осталось сомнений в важности предмета. Также в этой части нужно будет объяснить различные понятия параллельного программирования. Вторая — архитектурная, в которой будет объяснено за счет чего программы на двуядерном процессоре работают в два раза быстрее, и почему срабатывают оптимизации последовательного кода. В третьей части рассказать о различных библиотеках для параллельного программирования: WinAPI/POSIX, OpenMP, Intel TBB. В последней части будет рассказано о последовательных оптимизациях, когда все параллельные библиотеки уже включены, а скорости работы не хватает.

У меня есть черновик такого конспекта. Вы можете легко его загрузить: optimization.pdf. Прошу учесть, что это черновик — некоторые главы не дописаны, некоторых глав нет, рисунки нарисованы криво, местами нет форматирования. Такая себе альфаверсия. Но уже сейчас из него можно узнать:

  1. Отличие различных инструментов анализа производительности.
  2. Немного об Intel TBB.
  3. Основные проблемы работы с памятью.
  4. Немного про оптимизацию ветвлений.
  5. Трансформации циклов.
  6. Автоматические оптимизации в компиляторах.
  7. Введение в OpenMP.
Таким образом, вы уже сейчас можете начать им пользоваться.

Я был бы очень благодарен, если вы напишите ваше видение, что должно быть в таком конспекте. Также, если вы сообщите об ошибках или непонятных местах в текущей версии текста. Возможно, у вас есть какие-то вопросы, на которые нет ответов. Этот блог удобен тем, что можно рассматривать часть вопросов уже сейчас, не дожидаясь финальной версии конспекта.

С удовольствием приму любые комментарии здесь или по адресу электронной почты: volodymyr.obrizan@dnt-lab.com.

19 июн. 2009 г.

Пример функции parallel_reduce

В предыдущей статье об Intel Threading Building Blocks рассказывалось о преимуществах этой библиотеки, а также был рассмотрен пример алгоритма parallel_for. Рассмотрим пример использования алгоритма parallel_reduce, который отличается от функции parallel_for тем, что позволяет объединить частичные результаты, полученные в парралельных потоках.

Прежде всего, нужно подключить необходимые заголовочные файлы:

#include <stdio.h>

#include <tbb/blocked_range.h>

#include <tbb/parallel_reduce.h>

#include <tbb/task_scheduler_init.h>

* This source code was highlighted with Source Code Highlighter.

Здесь stdio.h используется для включения функции printf (вывод на экран), blocked_range.h для использования класса blocked_range (блочный диапазон), parallel_reduce.h для включения соответствующего алгоритма, а task_scheduler_inti.h — для включения планировщика задач.

Как было сказано ранее, стандартные алгоритмы Intel TBB — parallel_for, parallel_reduce — используют концепцию класса-задачи. В примере ниже показан подобный класс для решения задачи нахождения значения константы Пи (пример навеян конкурсом Интела, а также самостоятельной работой моего студента). Суть нахождения числа заключается в вычислении площади криволинейной трапеции, которая примерно описана большим количеством прямоугольников. Чем больше прямоугольников, тем точнее значение, но тем и больше времени требуется для вычисления. Иллюстрацию к этой задаче можно посмотреть на сайте «Вольфрам-Альфа».

// Класс-задача, отвечает за подсчет значения пи на заданном диапазаоне


class PiCalculation {

private:   

// Количество шагов в интервале, влияет на точность   

long num_steps;   // Ширина шага   double step; public:   // Частичное значение пи   double pi;   // Вычислить частичное значение пи на заданном диапазоне   void operator () (const tbb::blocked_range<long> &r)   {     double sum = 0.0;     long end = r.end();     for (int i = r.begin(); i != end; i++)     {       double x = (i + 0.5) * step;       sum += 4.0/(1.0 + x * x);     }     pi += sum * step;   }   // Объеденить частичные результаты   void join(PiCalculation &p)   {     pi += p.pi;   }   // Разделяющий конструктор   PiCalculation(PiCalculation &p, tbb::split)   {     pi = 0.0;     num_steps = p.num_steps;     step = p.step;   }      // Конструктор   PiCalculation(long steps)   {     pi = 0.0;     num_steps = steps;     step = 1./(double)num_steps;   } };
* This source code was highlighted with Source Code Highlighter.

Важными в этом классе есть следующие два метода: operator () и join.

Метод void operator () (const blocked_range &r) вычисляет частичный результат в интервале [r.begin, r.end). Библиотека Intel TBB и класс blocked_range заботятся о том, чтобы рекурсивно разбить исходное пространство итераций и «скармливать» небольшими порциями методу operator (). Результат накапливается в переменной pi, которая частная для потока. Дается гарантия, что operator () для одного класса будет вызван только из одного потока, поэтому ошибки типа «гонки за данными» (data races, race conditions) исключены.

Метод void join (PiCalculation &p) суммирует частные результаты различных потоков. Здесь проявляется важное отличие библиотеки Intel TBB от библиотек OpenMP и MPI, в которых количество операций для объединения частичных результатов (reduction, редуцирование) ограничено. Intel TBB позволяет реализовать произвольные функции объединения результатов в теле метода join.

Рассмотрим запуск алгоритма parallel_reduce.

int main() {   // Инициализация библиотеки Intel TBB   tbb::task_scheduler_init init;   // Количество итераций   const long steps = 100000000;   // Создание объекта-задачи по вычислению пи   // Передается параметр: количество итераций   PiCalculation pi(steps);   // Запуск алгоритма parallel_reduce над диапазоном [0, steps)   tbb::parallel_reduce(tbb::blocked_range<long>(0, steps, 1000000), pi);   printf ("Pi is %3.20f\n", pi.pi);   return 0; } * This source code was highlighted with Source Code Highlighter.

Для этого необходимо выполнить следующие шаги: создать объект планировщика задач Intel TBB, создать объект задачи PiCalculation, и вызвать функцию parallel_reduce. Здесь функция принимает два параметра. Первый — это класс диапазона. В нашем случае мы указывает количество итераций [0, steps), т. е. при вычислении интеграла от 0 до 1 будет использовано steps = 100 000 000 шагов. Второй параметр — это ссылка на объект задачи, в котором после возвращения из функции parallel_reduce будет содержаться значение пи.

17 июн. 2009 г.

Обратимся к первоисточникам

На вводных занятиях к курсу по оптимизации обсуждаем со студентами такой вопрос, как «Когда начинать оптимизировать»? Часто можно услышать ответ, приписываемый Дональду Кнуту: «Преждевременная оптимизация — корень всех зол».

Обычно, эту фразу (на самом деле вырванную из контекста) трактуют таким образом: нельзя начинать оптимизировать программу, пока она не написана и не протестирована. Мотивация здесь следующая: а) до завершения разработки невозможно оценить производительность всей системы в целом; б) оптимизации могут привести к нечитаемому коду, который также очень трудно отлаживать. Эти утверждения принимаются как догма, несмотря на то, что автора к этой фразе привели определенные рассуждения, без которых сама цитата лишена смысла.

Обратимся к первоисточникам. Упомянутую цитату можно найти в статье: Knuth, D. E. 1974. Structured Programming with go to Statements. ACM Comput. Surv. 6, 4 (Dec. 1974), 261-301.

В оригинальной публикации Кнут рассказывал о том, что программисты тратят очень много времени размышляя о производительности некритичных фрагментов кода, попытки оптимизировать которые негативно отражаются на программе в целом. С его точки зрения, не следует обращать внимания на мелочи, а нужно сосредоточиться именно на критических местах, и только после того, как эти места будут точно определены. Здесь я полностью согласен с автором.

Я отстаиваю точку зрения, что оптимизация программы — это спланированные действия, которым уделяется достойное внимание в процессе разработки всей системы. Тестирование производительности должно осуществляется наравне с функциональным тестированием, относительно требований к производительности системы. Очевидно, что обнаруженная проблема производительности имеет более высокий приоритет, чем основные задачи по разработке, для широкого класса приложений: компьютерные игры, аудио/видео кодеки, системы управления критическими объектами. Исправление проблемы производительности — это и есть оптимизация, которая выполнена своевременно, задолго до окончания разработки программы. Своевременное исправление таких проблем ведет к снижению рисков проекта. И наоборот: оставленные проблемы на «потом» приводят лишь к срыву сроков проекта и к невыполнению требований по производительности.

Можно сформулировать следующие рекомендации:

  • определить требования к производительности (например, сколько кадров в секунду должна показывать игра или сколько времени должна занимать обработка файла);
  • разработать тесты производительности относительно поставленных требований (их можно сделать в рамках unit-тестирования);
  • тестировать производительность наравне с функциональным тестированием;
  • при обнаружении проблем сосредоточиться лишь на тех фрагментах кода, которые дадут максимальный выигрыш.

А вообще, судя по аннотации, статья посвящена тому, как избавиться от оператора go to. Разумеется, студенты специальности СКС могут свободно ознакомиться с этой статьей, связавшись со мной по электронной почте. :)

1 июн. 2009 г.

Немного о суффиксах

Одна из традиционных рубрик в журнале «Спектрум» — о новых технических терминах в английском языке. Каждый месяц автор приводит 20-30 неологизмов, которые вошли в обиход англоязычного мира, да и русскоязычного тоже. Приведу некоторые из них, которые опубликованы в июньском выпуске этого журнала.

-ware — один из самых употребляемых суффиксов. Изначально употреблялся в таких словах, как software — программное обеспечение и hardware — аппаратное обеспечение. Также стали классическими следующие термины: freeware — бесплатное ПО, shareware — условно-бесплатное ПО (можете попробовать, как оно работает, перед тем, как купить), и vaporware — аннонсированное ПО, которое ещё не успело выйти на рынок. С этим суффиксом образовано много новых слов. Например, abandonware — компания, которая написала код, обанкротилась, beerware — программа стоимостью банки пива для программиста, который её разработал, careware — программист просит каждого пользователя такой программы сделать что-то полезное или пожертвовать что-нибудь в благотворительный фонд, coasterware — диски с такими программами обычно используются как подставка для чашки, crimeware — программы, крадущие персональную информацию, фишинговые или другие, нарушающие закон, heroinware — компьютерные игры, на которые очень легко подсесть, ransomware — программа шифрует файлы и вымогает деньги за расшифровку, retroware — программа на две или три версии старше, чем самая свежая версия, slideware — анонсированная программа, которая существует только в виде слайдов из PowerPoint, terrorware — программы, используемые террористами.

Суффикс -free используется для того, чтобы обозначить отсутствие или недостаток чего-либо. Например, fat-free — что-то обезжиренное, также известны calorie-free, cholesterol-free, salt-free и даже peanut-free. Из нового: content-free — много слов, а смысла нет, fact-free — научная работа, которая не опирается на данные из реального мира, office-free сотрудник, который работает дома и для связи с офисом использует интернет.

Для обозначения какой-либо сильной привычки мы используем суффикс -aholic (-holic, -oholic). Термин alcoholic породил workaholic, foodaholic, chocoholic. В современном мире используется webaholic, twitterholic (кстати, меня можно зафолоувить здесь http://www.twitter.com/obrizan), gameaholics и даже Warcraft-aholic.

Разные другие суффиксы, а также их использование можно прочесть в июньском номере журнала «Спектрум», издаваемый обществом IEEE. А с какими неологизмами сталкиваетесь вы?

Update: подсказали ещё один важный термин: peopleware — кадровое обеспечение, т. е. сотрудники. Есть одноименная книга: Peopleware: Productive Projects and Teams.

29 мая 2009 г.

Шлакоблоки параллельного программирования

Существует несколько способов, как добиться от программистов большой скорости решения поставленных задач с минимальным количеством ошибок. Первый способ — использование языков высокого уровня, например, С++. Объектно-ориентированное программирование позволяет создать в коде сущности различной природы, а также определять операции над ними. В результате мы получаем в распоряжение набор каких-либо объектов, которые соответствуют объектам из предметной области решаемой задачи, с высокоуровневыми свойствами и методами. Детали реализации скрываются за этими высокоуровневыми методами, что позволяет программисту сосредоточиться на решении задачи. Второй способ — использование современных инструментальных средств: компиляторов, генераторов тестов, формальных верификаторов, профайлеров. Компиляторы используют внутренние оптимизации для получения лучших временных характеристик и минимальных затрат памяти. Примером таких оптимизаций может служить автоматическая конвейеризация, развертки (свёртки) или распараллеливание циклов, при котором получается более быстрая реализация программы. В этом случае решением рутинных задач программирования занимается компилятор, который, как известно, работает намного быстрее и ошибается реже, чем программист. Третий способ — использование методического обеспечения. Разработано множество методов проектирования и т. н. паттернов — подходов к решению той или иной задачи в определенном контексте. Издано множество книг и пособий, посвященных как программированию самому по себе, решению абстрактных задач, а также по применению в конкретных задачах народного хозяйства. Четвертый способ — использование библиотек, которые содержат готовые протестированные решения: алгоритмы и структуры данных. Используя библиотечные компоненты, во-первых, сокращается время на разработку, а, во-вторых, сокращается время на тестирование проекта, потому что библиотечные компоненты протестированы заранее и неоднократно были внедрены в промышленные проектах. Таким образом, объем библиотечного кода может существенно превышать объем кода, написанного программистом. Сделаем краткий обзор технологий, которые повышают производительность программистов, разрабатывающих параллельные приложения. Многие годы самым доступным способом многопоточного программирования было использование библиотеки Windows API или POSIX Threads. Программисту приходилось решать поставленные задачи на очень низком уровне. Например, программисту необходимо:
  • самостоятельно создавать и удалять потоки;
  • определять те функции, которые должны выполняться в потоке;
  • передавать в поток нужные параметры;
  • использовать различные функции для синхронизации потоков;
  • обеспечить равномерную загрузку потоков вычислениями;
  • позаботиться о масштабируемости полученного решения.
Очевидно, что недостаток такого подхода заключается в том, что преобразование последовательной программы в параллельную может занять много времени. Также полученное решение будет подвержено множеству ошибок. Часть этих проблем была успешно решена в библиотеке OpenMP. Эта библиотека реализована в виде набора функций и директив — специальных расширений к компилятору. Программист в требуемом месте применяет ту или иную директиву, а компилятор в указанном месте подставляет вызовы системных функций. Например, распараллеливание цикла осуществляется единственной директивой компилятору. При этом компилятор позаботится о создании и синхронизации потоков, разделении итераций между потоками, а также хорошим балансом загрузки. Такой подход позволяет решить ограниченный класс задач практически без ошибок и в краткий срок. Но библиотека OpenMP имеет ряд ограничений и недостатков. Укажем лишь некоторые из них.
  1. Циклы с неизвестным количеством итераций не могут быть распараллелены.
  2. Существенные ограничения на параметры цикла.
  3. Ограниченные возможности по распределению работы между потоками.
  4. Операция reduction ограничена восемью элементарными операциями.
  5. Отсутствие более сложных шаблонов, чем параллельный цикл или параллельная секция.
Intel Threading Building Blocks (далее ТББ) — новая библиотека для многопоточного программирования, разработанная фирмой Интел. Библиотека имеет ряд функций и классов для решения распространенных задач параллельного программирования:
  • функция parallel_for для организации параллельного цикла;
  • функция parallel_reduce для параллельного цикла с последующей комбинацией частичных результатов;
  • класс parallel_while для создания параллельного цикла с неизвестным количеством итераций;
  • класс pipeline для организации конвейерных вычислений;
  • контейнеры с возможностью параллельного доступа: concurrent_vector, concurrent_queue, concurrent_hash_map.
В ТББ введена концепция объекта-задачи — класс С++, в котором определен оператор (), который выполняет поставленную задачу (см. листинг ниже). В зависимости от алгоритма, в котором используется объект-задача, этот оператор, например, может принимать в качестве параметра диапазон итераций (parallel_for, parallel_reduce) или очередной элемент для обработки (parallel_while, pipeline).
// Класс-задача
class Body
{
public:
    // Оператор-обработчик
    void operator() ()
    {
        // Здесь расположены вычисления
    }
};


* This source code was highlighted with Source Code Highlighter.
Здесь видно отличие от программирования обычных потоков: программист создает задачи, а не потоки. Библиотека ТББ при инициализации создает необходимое количество потоков, а встроенный планировщик назначает задачи на эти потоки во время работы программы. Функции-шаблоны parallel_for и parallel_reduce работают с диапазонами (пространствами итераций). Библиотека ТББ предоставляет для этого два класса: blocked_range и bloced_range2d, одномерное и многомерное пространство соответственно. ТББ рекурсивно делит исходный диапазон на множество блоков, которые передаются в качестве параметров для оператора-обработчика. Таким образом, каждый объект-задача делает вычисления над собственной порцией итераций. Приведем пример использования одномерного диапазона.
blocked_range<int>(begin, end, grainsize)
Здесь параметр шаблона — это тип элементов диапазона, begin — начальная точка, end — конечная точка. Пара begin и end описывает полуоткрытый интервал [begin, end), например, цикл for (int i = 2; i < 5; i++) соответствует интервалу [2; 5) и включает в себя итерации 2, 3, 4. Параметр grainsize определяет размер неделимого блока итераций. В том случае, если на очередном этапе разделения исходного диапазона встретится блок, меньший, чем grainsize, то он будет считаться неделимым. На рисунке ниже показан пример рекурсивного разделения диапазона blocked_range(0, 10, 3).
В завершении статьи приведем пример распараллеливания цикла for.
#include "tbb/blocked_range.h"
#include "tbb/parallel_for.h"
#include "tbb/task_scheduler_init.h"

using namespace tbb;

///////////////////////////////////////////////////////////////////////////////

// Класс-задача
class MyTask
{
public:
    // Метод-обработчик выполняет функцию Calculate для каждого элемента
    // блока итераций.
    void operator() (const blocked_range<int>& r) const
    {
        for (int i = r.begin(); i != r.end(); i++)
            Calculate(i);
    }
};

///////////////////////////////////////////////////////////////////////////////

int main()
{
    // Инициализация библиотеки ТББ
    task_scheduler_init init;

    // Запуск шаблона parallel_for, который принимает два параметра:
    // * объект диапазона итераций [0, 1000000)
    // * объект-задачу
    parallel_for(blocked_range<int>(0, 1000000, 10000), MyTask);

    return 0;
}

///////////////////////////////////////////////////////////////////////////////


* This source code was highlighted with Source Code Highlighter.

Новости отечественного образования

Качество образования в ХНУРЭ было оценено делегацией из Кувейта. После чего было принято решение на уровне правительства этой страны о том, чтобы не направлять студентов к нам на обучение из-за низкого его уровня.
Кувейт не буде направляти спеціалістів для навчання в аспірантурі в українських вузах і відмовляється від навчання студентів у п'яти українських вищих навчальних закладах. Відповідну рекомендацію міністерства вищої освіти країни вже схвалив уряд Кувейту, пише "Аль-Кабас". Видання подає список вузів, які потрапили під заборону. Серед них: Сумський державний університет, Українська медична стоматологічна академія Полтави, Харківський національний медичний університет, Українська державна академія залізничного транспорту Харкова та Харківський національний університет радіоелектроніки. http://life.pravda.com.ua/problem/4a1fec1ba9693/
Устрою-ка я четвертому курсу экзамен по параллельному программированию.

25 мая 2009 г.

Лекция Сергея Михтонюка по компьютерной графике

В среду (27.05.09) состоится лекция Сергея Михтонюка по компьютерной графике. В программе:
  1. Graphic primitives
  2. Transformations: Projection / World / View
  3. Matrices
  4. Z-Buffer & Stencil buffer
  5. Lightning: Flat (Gouraud / Phong shading), Directional (point / spot lights)
  6. Textures: Texture coordinates, Mip-mapping, Sampling, Cubic textures
  7. Lighting models: Diffuse / Ambient / Specular
  8. Shaders: Vertex / Pixel, Effects
  9. Effect, postprocessing tutorial
Дата: 27 мая 2009 (среда). Время: 11:30—14:30 (три часа). Место: 318 ауд. ХНУРЭ Вход свободный. От участников лекции ожидается хорошее знание языка С++, основ компьютерной графики, базовых терминов и принципов. Для участия необходимо заранее выслать ФИО, контактный телефон и номер группы на адрес volodymyr.obrizan@dnt-lab.com.

14 мая 2009 г.

C++ придумали в СССР

Найдены доказательства тому, что язык С++ был придуман в СССР. На рисунке ниже показан фрагмент секретной документации к системе управления стратегическим ядерным инкубатором.
Спасибо Роме Приходченко за находку. :)

8 мая 2009 г.

Завел статью по ТББ на Википедии

Создал статью о Intel Threading Building Blocks на Википедии: ТББ. Ещё нужно дописать базовых вещей, историю и пример использования. У кого что есть сказать по теме — присоединяйтесь! Обычно я пишу статью в личной песочнице, а потом публикую. Но вчера что-то где-то ошибся, и статья попала в общее пространство статей, где её сразу же выставили на удаление, из-за неэнциклопедичности (там было два предложения). Сейчас в панике дописал ещё пару абзацев. Скоро напишу здесь несколько статей по ТББ и по использованию. P. S. А ещё я давно завел статьи о SystemC и о Сергее Щелкановцеве.

6 мая 2009 г.

Вычисление π — конкурс русского сообщества Интела

Вчера стартовал очередной конкурс Интела по параллельному программированию и оптимизации: «Параллельные гонки: формула ‘π’». Суть конкурса: разработать масштабируемую реализацию генератора знаков числа π. Нужно найти как можно больше знаков после запятой за 60 секунд. Отличие этого кокурса от Intel Threading Challenge 2009 в том, что дается только одна задача и что все комментарии можно писать на русском. Конкурс продлится до 5 июня 2009. Это, тем не менее, не отменяет возможность участия в двух конкурсах сразу. P. S. А ещё мне непонятно, почему они запускают конкурсы как раз на сессию.

5 мая 2009 г.

Завершился курс «Многоядерное программирование»

Сегодня была последняя лекция по «Многоядерному программированию», курс, который я читаю для студентов нашего клуба. Хотелось бы поблагодарить ребят, которые, несмотря на то, что курс не рассчитан на первокурсников, несмотря на позднее время проведение занятий, всё равно продолжали ходить до самого конца. Мне могут позавидовать многие преподаватели, что у студентов такая высокая внутренняя мотивация. За эти 22 лекции и практические работы успели многое: программировали под библиотеки OpenMP, WinAPI, MPI, Intel Threading Building Blocks, испытали программы Intel VTune Performance Analyzer, Thread Checker, Thread Profiler, даже хватило времени отвлечься и попробовать оптимизацию последовательных программ под особенности микроархитетуры Intel Core2 Duo. Хотелось бы получить обратную связь от вас: что понравилось в курсе, а что не понравилось? Что можно улучшить, что можно ухудшить? В частности, у меня есть такие вопросы:
  • нужно ли изучать WinAPI или необходимо начать с OpenMP и больше сосредоточиться на Intel TBB?
  • нужно ли больше внимания уделить устройству микроархитектуры?
  • что было тяжелее всего для понимания, а на каких темах вы «зевали»?
  • что можно рассмотреть подробнее, а что можно выкинуть?
  • какие примеры нужно рассматривать на лабораторных?
  • что нужно сделать, чтобы курс стал интереснее, веселее, полезнее?
Отвечать можно в комментариях, писать на volodymyr.obrizan@dnt-lab.com или говорить при личной встрече. Любая помощь будет кстати. Спасибо! Желающие прослушать этот курс должны подождать осени. Скорее всего, я его прочитаю ещё раз в рамках наших клубных занятий.

4 мая 2009 г.

О девятипальцевом слепом наборе текста

Студентам приходится очень часто набирать тексты на клавиатуре. Это и подготовка рефератов, курсовых работ, лабораторных, набор исходных текстов программ, а также использование электронной почты, общение в блогах, форумах, чатах. Из личного общения с контингентом знаю, что набрать хоть сколько-нибудь сложный текст для них — это пытка. В информационной эре, в которой нам с вами посчастливилось жить, возможность очень быстро набирать текст на клавиатуре — очень важный навык. Разработан метод девятипальцевого слепого набора текста, который существенно сократит время ввода информации в компьютер. А теперь перейдем к делу. Для того, чтобы добиться успеха в девятипальцевом слепом наборе, нужно соблюдать одно единственное правило: всегда при работе за компьютером соблюдать правильную позицию рук на клавиатуре. Заключается она в следующем. Займите начальную позицию: пальцы левой руки должны занять клавиши ASDF, пальцы правой руки должны занять клавиши JKL; (в русской раскладке ФЫВА и ОЛДЖ соответственно). Чтобы находить эту позицию не глядя на клавиатуру или без света, клавиши, которые располагаются под указательными пальцами: F и J, имеют специальные возвышения (точечки или черточки). При наборе текста нужно следить за тем, чтобы нажимать клавиши только определенным пальцем, как показано на рисунке ниже. Здесь все зеленые клавиши нажимаются указательными пальцами, желтые клавиши нажимаются средними пальцами, оранжевые клавиши нажимаются безымянными пальцами, розовые клавиши нажимаются мизинцами, а «Пробел» нажимается большим пальцем любой руки.
Всё очень просто. Никаких других правил или ограничений нет. Можно даже продолжать смотреть на клавиатуру. От вас требуется только дисциплина и терпение. Изначально, скорость вашего набора упадет в несколько раз. Вам придется подымать руки, чтобы искать нужные клавиши. Со временем, вы перестанете это делать, потому что запомните, где какая клавиша находится, и — самое важное — пальцы сами запомнят, какую клавишу когда нажимать. Здесь произойдет важный момент: вы поймете, что смотреть вниз нужды больше нет, и сможете перевести взгляд на монитор. Это играет очень важную роль, потому что кроме количественных изменений, которые заключаются в скорости набора символов, у вас произойдут ещё и качественные: теперь у вас появится возможность смотреть, что вы пишете, и исправлять ошибки в тексте сразу в момент возникновения. Повторюсь: от вас требуется только дисциплина и терпение. За приобретение этого навыка вы заплатите двумя-тремя месяцами неудобств, но он останется с вами на всю жизнь.

2 мая 2009 г.

Основы управления временем для первокурсника

Первокурсники иногда интересуются: «Как успевать в университете? Необходимо ходить на все занятия, делать лабораторные, писать рефераты, выполнять домашние задания»... Действительно, первый курс университета — это большая ступенька, вступить на которую дано далеко не всем выпускникам школ.

Рассмотрим основные отличия обучения в школе и в университете. За 10-11 лет школы мы привыкаем к заботе и повышенному вниманию со стороны родителей и учителей. Разработаны и практикуются определенные меры контроля: регулярные родительские собрания, письменная сертификация успехов ребенка за неделю в дневнике, а также ежеквартальная в табеле, тет-а-тет встречи родителей с учителями на улице или в общественном транспорте, благо все живут рядом. Навряд ли какой-нибудь даже маленький факт вашего обучения ускользнет от родителей.

В университете такого контроля нет. По большому счету, до студентов никому никакого дела нет. Например, считается западло позвонить родителям даже после месячного отсутствия студента на занятиях. Вот то, о чем мы мечтали все последние школьные годы: «Скорей бы отсюда свалить на волю». Здесь многие студенты совершают самую большую ошибку. Они путают «свободу от» со «свободой для». В том случае, когда учеба в университете становится свободой от чрезмерного контроля в школе, мы можем наблюдать, как отличники скатываются до посредственностей, они больше не могут показать ту производительность, которую показывали в школе. Возможно, им кажется, что им хватит того багажа знаний, который они накопили в школе, но это заблуждение, т. к. университетские требования намного выше. Но контроля нет, и нет того человека рядом, который скажет: «Тормози»! С другой стороны, я знаю много случаев, когда обучение в университете становится свободой для самореализации в требуемом направлении. Здесь даже школьные троечники и шалопаи могут раскрыть свой талант и стать хорошими специалистами.

Часто студенты недооценивают сложность обучения в университете. Некоторые рассматривают университет, как клуб по интересам: утром покурить на клумбе, днём потусить на расширителе, вечером попить пивка на стадионе. Моё отношение к обучению в университете — как к полноценной работе, с 40-часовой рабочей неделей. Например, если в течение недели у студента было 12 пар (18 астрономических часов), то он должен отработать дома ещё 22 часа.

Рассмотрим несколько простых практически ориентированных советов, которые смогут принести пользу уже сразу после их применения.

Планирование времени

В жизни мы не можем увеличить количество часов в сутках. Мы можем только расходовать те 24 часа, которые у нас есть. Расходовать можно эффективно, а можно как попало. Можно провести аналогию с деньгами. Если вы не запланируете траты до похода в магазин, то можете остаться без какой-нибудь нужной вещи, ведь деньги уже будут потрачены на что-то пустое и ненужное. Проверенный способ — завести себе ежедневник, в который наперед выписать все университетские занятия, самостоятельную работу, личные встречи с друзьями, помощь родителям, походы в кино, занятия спортом, другое. Те, которые говорят, что планирование само по себе занимает много времени, вероятно, никогда не пробовали этого делать в действительности. Я не могу сказать, что планирование занимает у меня больше пяти минут в неделю. Студенты с ноутбуками или смартфонами могут воспользоваться многочисленными программами, которые автоматизируют планирование личного времени.

Если вы дадите себе труд расписать своё время на неделю или больше, то будете приятно удивлены тем, что, оказывается, можно успеть сделать далеко не всё. Точно так же и в жизни — сделать получится не всё. Значит, чтобы не промахнуться мимо поставленных целей в жизни, нужно правильно расставить приоритеты.

Простой способ расставить приоритеты в задачах

Есть задачи срочные, а есть несрочные. Есть важные задачи, а есть неважные. Раз уж вы студент, то важные задачи у вас — это ходить на пары и делать домашние задания. Обычно, это ставится приоритетом номер один. Не менее важными задачами являются занятия спортом и различная работа дома, такая как помощь родителям и близким. По срочности можно ранжировать задачи: «на сегодня», «на завтра», «на неделе», «в этом месяце» и так далее. Очень удобно выписать все задачи в таблице, как показано ниже. Левый верхний угол — это важные и срочные задачи, на них нужно сосредоточиться и делать в первую очередь. Правый нижний угол — неважные и несрочные занятия. Их можно не делать вообще.

У вас нет денег, но у вас есть время

Скорее всего, ни ваши родители, ни уж тем более ваши преподаватели, не будут интересоваться вашей судьбой. Поэтому, отчитываться вам придется перед самим собой. Может быть, у вас нет денег, но у вас есть время. Оказывается, время тоже можно инвестировать. Инвестируйте его в себя. Это значит, что если вы посвятите несколько лет изучению и практике программирования, то дивидендами станет успех в профессии. Если вы тратите время на тупые тусовки возле института, если вы не слушаете на лекциях профессора, если вы играете в пасьянс на лабах, то это потраченное время уже никак к вам не вернется. Вы можете обмануть своих родителей и друзей, но обмануть самого себя навряд ли удастся.

1 мая 2009 г.

Работающие студенты

Если студент зарабатывает деньги, но при этом не появляется в университете, то высшее образование ему не нужно. Он может смело переводиться на заочное или вообще забирать документы. Таким пощады на сессии со стороны преподавателя быть не может. Если студент зарабатывает деньги, при этом успевает на занятия и всё сдает сам, то он нуждается в высшем образовании, возможно для того, чтобы поднять свою квалификацию и зарабатывать ещё больше денег. Такие студенты вызывают уважение. Если студент работает за 100 долларов США, да ещё и не по профилю, при этом пропускает занятия в вузе, то он просто дурак, потому что мог бы получать повышенную стипендию, а с ней и необходимые знания, чтобы зарабатывать много денег. Знаю, что есть процент студентов, у которых нет родителей, или у которых родители не в состоянии оказывать существенную материальную помощь. Здесь навряд ли мы можем что-то поделать, потому что им не помогут наши оценки, которые мы поставим на шару. Таким студентам нужно помочь себе самим.

25 апр. 2009 г.

Конкурс Интела по параллельному программированию

С апреля месяца проводится очередной конкурс Интела по параллельному программированию. В этом году участникам предлагается решить 12 задач в два этапа. Первый этап начался 6 апреля и закончится 3 июля, а второй этап начнется 17 августа и закончится 13 ноября. Каждая решенная задача оценивается отдельно следующим образом:
  • 0—100 баллов за решенную задачу (учитывается корректность и скорость выполнения)
  • 0—50 баллов за пояснительную записку (до 10 баллов за описание последовательного алгоритма, до 30 баллов за описание параллельного алгоритма и использованных технологий, до 10 баллов за производительность)
  • 5 баллов за каждое сообщение на форуме, посвященному решению конкретной задачи (но не больше 25 баллов)
Участнику, набравшему больше всего баллов за решение одной задачи, дается сертификат на 100 $. В конце каждого этапа вручается гранпри за максимальную сумму баллов: нетбук. Среди открытых на сегодняшний день задач известны две: поразрядная сортировка и решение булевых уравнений. Скорее всего, в будущем нас ожидают задачи на графы, массивы, списки.

24 апр. 2009 г.

Простое статическое распределение работы в многопоточной программе

Этой статьей мы начинаем цикл публикаций «Параллельное программирование для самых маленьких». Ожидаемая аудитория проекта: школьники, а также студенты, начинающие изучать параллельное программирование. Преимущество многопоточного приложения перед последовательным заключается в том, что несколько потоков делают тот же самый объем работы в несколько раз быстрее. Единицей работы в частном случае может служить одна итерация цикла. Студенты допускают типичную ошибку при параллельном программировании: создают несколько потоков, каждый из которых делает тот же объем работы, что и последовательная программа. Это не приводит к желаемому ускорению, а даже иногда замедляет работу приложения. Здесь работает очень простое правило: каждый поток в параллельном приложении должен делать в N раз меньше работы, чем последовательная программа, где N — количество запущенных потоков. Рассмотрим простой способ статического разделения итераций одномерного цикла между несколькими потоками. На рисунке показан простой цикл, состоящий из 10 итераций. Пространство итераций описывается интервалом [0; 10). В последовательной программе начальное значение счетчика итераций равно нулю, инкремент цикла равен единице, т. е. тело цикла выполняется для каждой итерации.
Как было сказано выше, ошибочным является запуск двух и более потоков, которые бы выполняли тот же самый код, показанный на рисунке. В этом случае объем работы для одного потока останется таким же, а для целой программы вырастет в несколько раз. Необходимо разделить работу — итерации цикла — между потоками. На рисунке ниже схематически показано статическое поочередное распределение для двух потоков.
Нетрудно заметить, что поток номер 0 начинает свою работу с нулевой итерации и выполняет только четные итерации (инкремент равен 2): 0, 2, 4, 6, 8, а поток номер 1 начинает с итерации 1 и делает нечетные: 1, 3, 5, 7, 9. Таким образом, каждый поток делает в два раза меньше работы, чем последовательная программа. Теоретическое ускорение равно двум. Рассмотрим вариант разделения работы на три потока (см. рис. ниже).
Здесь поток номер 0 также начинает с нулевой итерации, но обрабатывает каждую третью итерацию: 0, 3, 6, 9. Поток номер 1 начинает с итерации 1, а поток номер два начинает с итерации 2. У всех потоков инкремент счетчика цикла равен трём. Теоретическое ускорение равно 3. В конкретном случае баланс загрузки нарушен и фактическое ускорение равно 10/4 = 2,5. Следует отметить, что с ростом количества итераций дисбаланс будет нивелироваться, и будет приближаться к теоретическому ускорению. Можно проследить закономерность, что каждый поток начинает выполнять итерацию, номер которой совпадает с номером потока, а инкремент равен количеству потоков. Таким образом, можно записать общий случай для произвольного количества потоков (см. рис. ниже).
Достоинства статического поочередного распределения итераций заключаются в: а) простоте программной реализации; б) отсутствии накладных расходов на планирование итераций; в) хорошем балансе загрузки при большом количестве итераций и одинаковом времени выполнения тела цикла для разных итераций. Недостаток подхода заключается в отсутствии возможности балансировать нагрузку, если для различных итераций тело цикла выполняется различное время. Этот недостаток был исправлен в библиотеке OpenMP. Для статического поочередного разделения итераций цикла может быть использована директива, показанная на рисунке ниже.
Для плохо сбалансированных объемов работы, когда тело цикла выполняется различное время для разных итераций, может быть использован динамический алгоритм балансирования нагрузкой.
К недостаткам OpenMP можно отнести ограничение на тип переменной итерации цикла. Библиотека OpenMP версии 2.5 поддерживает только signed int.

12 апр. 2009 г.

Смешные ситуации

Первого апреля начал читать курс "Введение в оптимизацию производительности ПО" для третьего курса СКС. Для вводной лекции решил не использовать слайды и проектор, а просто распечатал себе небольшой конспект лекции. На занятии поинтересовался у студентов: удобнее ли им с проектором или без. Обсудили достоинства и недостатки обоих способов, но решили проводить лекции со слайдами. На следующее занятия я принес ноутбук, проектор и удлиннитель. А в ауд. 314и нет розеток. И в коридоре рядом с аудиторией розеток нет тоже. Сейчас вспоминаю, что со мной случаются разные забавные ситуации. Приведу несколько примеров. Зимой 2008 года с друзьями поехали в Карпаты кататься на лыжах. Я всем хвастался тем, как я компактно всё сложил в один рюкзачок, а вот другие едут с большими сумками. Когда приехали на место, оказалось, что я забыл положить в мой компактный рюкзачок лыжный костюм. В первый же съезд с горы, после нескольких падений, мои джинсы были очень сильно разорваны. Договорился о покупке бэушных лыжных брюк с хозяином домика, в котором мы жили. Брюки оказались на один размер меньше, чем было нужно. К концу отдыха они тоже порвались. Перед поездкой в горы заказал себе две новые пластиковые карточки: одну для зарплаты, другую — Master Card — для оплаты в интернет-магазинах. Вскрыл конверты с секретными пин-кодами и подумал: "О! Какие хорошие пин-коды, так легко запоминаются"! Затем скомкал конверты и выбросил. После возвращения из Карпат я даже примерно не смог вспомнить, какие цифры входили в комбинации. Интервал между заказом и перезаказом двух карт составил всего лишь две недели.

Темы

2012 (2) амазон (1) анпакинг (1) артемий лебедев (4) атн (1) аудио (1) аэропорт (1) безопасность (3) бизнес (1) билайн (1) блог (2) будущее (2) видео (11) википедия (5) вымысел (16) гагарин (1) герман (1) гитхаб (1) гугл (3) дед мороз (1) декабрь (1) демотиватор (2) дети (2) дизайн (13) диссертация (2) документация (1) друзья (5) евпатория (1) евро-2012 (1) жадность (1) заяц (1) идея (1) имейл (1) инстаграм (1) интервью (5) интересное (20) интерфейс (13) история (7) как_выжить (4) календарь (1) капитализм (1) картина (1) кмб (6) книга (6) коллекция (4) компилятор (2) конкурс (5) космос (1) лаборатория (1) либералы (1) лингво (1) лузер (6) макаренко (2) макдональдс (2) математика (1) медиапорт (1) ментор (1) металлика (1) металлист (2) метро (7) микрософт (6) миргород (1) москва (2) музыка (3) наркомания (1) новости (17) образование (3) оптимизация (5) основы (14) открытки (3) ошибка (11) памятник (1) патриотизм (3) плагиат (1) плата (1) погода (3) поиск (1) политика (2) полтава (2) праздник (1) программирование (15) прошлое (2) путешествия (8) рейтинг (1) рендер (1) рисунок (2) русские (1) русский язык (1) сайт (4) санкт-петербург (1) сапр (7) сеть (1) си++ (1) синтез (1) системси (1) скриншот (40) социализм (1) соцопрос (3) спектрум (2) спорт (2) срач (2) статистика (1) такси (1) тбб (3) твитер (9) тимошенко (1) украина (5) униан (1) фан (30) фокус (1) фото (39) фотошоп (1) фурсенко (1) футбол (2) хабр (1) харьков (21) хнурэ (19) хобби (4) цитата (2) чехия (1) школа (1) эпл (1) эхостар (1) юмор (1) яндекс (1) clang (2) doxygen (1) english (3) ios (1) llvm (1) msdn (1) outlook (1) PHP (1) stackoverflow (1)

Поиск

Архив

Читатели