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.

Темы

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)

Поиск

Читатели