Скачать курс Python разработчик от Яндекс Практикум (с ответами)

По ссылкам ниже можно скачать курс Python-разработчик (8 частей). Основные разделы:

  • Основы Python
  • Возможности бэкенда
  • Работа с внешними API
  • Алгоритмы и структуры данных
  • Инфраструктура бэкенд-разработки

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

Содержимое папки спринта

Уроки представлены в виде полных HTML-страниц

Ответы будут публиковаться в виде отдельных txt-файлов

1 месяц - https://drive.google.com/file/d/19tpfUtVhElAaP6_qTHuf0EzxciTA9O9Y/view?usp=sharing

2 месяц - https://drive.google.com/file/d/15xkESiJ6RyZXJRjPfotHulsEcsVhRpEX/view?usp=sharing

3 месяц - https://drive.google.com/file/d/1TsWjIYARU_oYixoMMujBUAdt-Xcg6Y2A/view?usp=sharing

4 месяц - https://drive.google.com/file/d/1FdMIEWplX-V6YyraRRuQpDzJ9xoV8hTB/view?usp=sharing

5 месяц - https://drive.google.com/file/d/1gMPTpmnPAY-Cuq7nHJzPDyK56Ig1ezUG/view?usp=sharing

6 месяц - https://drive.google.com/file/d/13j7yNUH-R8Mt1Ako7DBgieXFaOXqulTw/view?usp=sharing

7 месяц - https://drive.google.com/file/d/17r-ZtDE35zqXMe8yJZeSxd2Lk2UrI3NA/view?usp=sharing

8 месяц - https://disk.yandex.ru/d/nqbtCUoC4vYBBA

.

Ответы:

Тема "Расширенные возможности в SQL":

Проблемы с производительностью ПК

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

Специалисты области информационных технологий говорят, что удачный запуск работы компьютера (читай – загрузка BIOS) – это залог исправности  процессора на 99.9 %. И практика показывает, что это действительно так. Другой вопрос – это стабильность его работы под нагрузкой. Чем выше нагрузка, тем выше рабочая температура процессора, а следовательно – усиленная потребность в эффективном охлаждении. Поэтому для начала обратим внимание на температуру работы процессора. Посмотреть значение температуры можно в BIOS, но при этом процессор будет находиться фактически в пассивном режиме, то есть – без нагрузки. Проконтролировать температуру при «повышенных оборотах» можно как с помощью специализированных утилит, поставляемых производителями (например, Asus PC Probe для материнских плат компании Asus), так и с помощью универсальных (Speed Fan, Hot CPU Tester и т. д.). Рассмотрим пример мониторинга температур с помощью универсального тестировочного пакета Lavalys Everest Ultimate Edition. Запустив пакет (файл everest. exe в соответствующей рабочей папке), слегка изменяем настройки для удобства:

Preferences

Подтверждаем изменение настроек нажатием кнопки ОН диалогового окна Preferences – Everest.

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

Пункт Alerting

Указываем критерии максимальных температур. В соответствующей таблице нажимаем кнопку New. Выбираем интересующее нас устройство (CPU). В подменю Alert When указываем минимальную температуру центрального процессора – Value is below и максимальную – Value is above. Рабочие значения температуры можно узнать на сайте производителя. Как правило, минимум: +30...+40°С, а максимум: +60...+65°С

После внесенных изменений сворачиваем (именно сворачиваем, а не закрываем!) главное окно Everest и запускаем «нагрузку» в виде игры или видео. В случае возникновения ошибок в виде предупредительных окон убеждаемся, что проблемы с температурами имеют место быть. Недостаточная температура может свидетельствовать о недостаточном напряжении, подаваемом на процессор. Удостовериться в этом можно, обратив внимание на индикатор напряжения питания. Проблемы с подачей напряжения могут быть связаны с электросетью (конечно, если не установлен ИБП), блоком питания или же материнской платой. Первая диагностируется проверкой напряжения в электросети, вторая – проверкой блока питания, а третья – проверкой материнской платы. Осуществить проверку на наличие аппаратных неисправностей материнской платы в домашних условиях фактически невозможно (требуется специализированный стенд), но в них ли дело? Вполне вероятно, что пониженный вольтаж может быть выставлен в настройках BIOS – это решается, как правило, сбросом и установкой параметров по умолчанию в соответствующем разделе либо простым изъятием и установкой батарейки (тогда сбрасываются и устанавливаются по умолчанию абсолютно все настройки!). Аналогично поступаем и при повышенном напряжении. Если же с подаваемым питанием все нормально, а ситуация с температурой неприемлема, то обращаем внимание на систему охлаждения. Очевидно, что при пониженной температуре (впрочем, такая ситуация очень маловероятна) интенсивность охлаждения нужно понизить, а при повышенной – повысить. Как мы знаем. СО бывают двух типов: пассивные и активные. Первые представляют собой лишь радиатор, а вторые – вентилятор+радиатор. Для начала займемся профилактикой. Типичный случай – ребра радиаторов имеют свойство засоряться пылью, поэтому чистим их. Кроме того желательно снять радиатор с процессора, очистить его и процессор от термопасты мягкой ветошью, смоченной в спирте, равномерно нанести на радиатор тонкий слой свежей пасты размером с площадь прижимаемой поверхности процессора.

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

И, конечно же требуется следить за количеством оборотов, то есть при повышенной температуре – повысить, а при пониженной – понизить. Регулировка может осуществляться с помощью специального регулятора, предусмотренного производителем, либо в некоторых версиях BIOS.

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

Сбои оперативной памяти в повседневной работе выявить достаточно сложно. Если признаки неисправности многих компонентов являются более-менее явными (артефакты изображения – видеоадаптер, отсутствие звука – звуковой адаптер и т. д.), то об оперативной памяти система способна сигнализировать разве что в случае заполненности системной памяти. В остальных же случаях могут неожиданно появляться так называемые «синие окна смерти» – сообщения о критических ошибках операционной системы (BSOD), имеющие общий характер информации (например, ошибка работы аппаратной части компьютера). Никто не утверждает, что все они напрямую связаны с оперативной памятью, но проверить ее лишним не будет. Наиболее признанным и эффективным средством диагностики оперативной памяти уже многие годы является утилита Memtest 86+. На ее примере мы и рассмотрим проверку оперативной памяти на наличие дефектов. Memtest 86+ работает независимо от ОС, поэтому для ее запуска требуется создать отдельный загрузочный диск. Им может стать дискета, CD или же флеш-накопитель.

Для начала нужно скачать ISO-файл с официального сайта и записать этот образ на пустой компакт-диск. Выключаем системный блок. Чтобы определить, какой именно модуль неисправен, выдергиваем все остальные модули, оставив лишь один. Включаем компьютер и указываем в BIOS оптический привод в качестве основного загрузочного диска – тестирование автоматически запустится после загрузки с компакт-диска. Проверка должна пройти полностью (значение индикатора должно дойти до 100 %). В случае обнаружения ошибок или же «зависания» теста (как правило, он должен длиться не более 5 часов) модуль памяти подлежит замене.

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

Проблемы с запуском ПК

Проблемой включения ПК считается отсутствие какой-либо реакции та нажатие кнопки включения, то есть системный блок абсолютно «мертв» – не подает никаких признаков функционирования устройств.

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

Если этого не происходит, то где-то существует разрыв провода

Во время проверки для большей уверенности кабель лучше немного пошевелить – повреждение кабеля может быть неявным. Кроме того, кабель питания может «коротить» (способствовать возникновению короткого замыкания). Этот случай проверяется с помощью той же «прозвонки», только щупы подсоединяются к штекерам вилки, сопротивление возникать не должно. Если возникает сопротивление, кабель нужно немедленно заменить. Искать повреждения и пытаться их исправить – дело неблагодарное, проще заменить провод целиком.

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

Блоки питания делятся на АТЕ и АТХ.

Основная разница между ними состоит в том, что первый тип (АТЕ) требует принудительного включения/выключения, а второй (АТХ) способен на автоматическое отключение и включение (в отдельных случаях). Основной характеристикой является мощность БП, величина зависит от минимальной потребляемой энергии комплектующими системного блока. В принципе, то, что системный блок не будет работать с маломощным блоком питания, не является обязательном правилом, но никто не гарантирует, что работа эта будет стабильной и мало того, ввиду больших нагрузок БП может попросту выйти со строя. Но причиной выхода со строя может стать не только этот фактор – это могут быть проблемы с электросетью, нарушение охлаждения блока питания (выход со строя или неэффективное функционирование вентилятора). Перейдем к практике. Прежде всего, для обнаружения поломки нужно отсоединить БП от системного блока.

Перед тем как разбирать блок, следует «прозвонить» провода, идущие к материнской плате. Часто производитель ставит пломбы на угол корпуса блока питания, поэтому рекомендуется сначала проверить, не на гарантии ли он (редко, но случается так, что срок гарантии БП, данный производителем, дольше данного продавцом). Если да, то не стоит утруждать себя манипуляциями, а обратиться в авторизованный сервисный центр производителя. В противном случае можно смело приступать к разборке БП. Для начала следует снять верхнюю крышку и осмотреть состояние деталей блока.

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

Если изоляция обмотки трансформатора обгорела из-за перегрева, то его следует заменить (перепаять) аналогичным.

При перегрузке конденсатор (один или несколько) может выйти из строя. Визуально это определяется следующим образом: верх исправного конденсатора должен быть ровным или даже немного вогнутым, а неисправного – «вспучен».

Внимание! При перепайке деталей в обязательном порядке следует соблюдать полярность («+» и «-»).

Ввиду того, что материнская плата является, по большому счету, основой компьютера, то и множество неисправностей и сбоев, в том числе и включение ПК, может быть связанно именно с ней. Аппаратные неисправности на материнской плате в домашних условиях можно устранить лишь на том уровне, что и у блока питания – перепайкой неисправных радиодеталей – конденсаторов, плюс еще заменой батареи питания, вот, пожалуй, и все. Правда, существует один феномен: если материнская плата прикручена к корпусу винтами, а не пластиковыми креплениями, то вполне возможно, что по причине сильного прижатия к корпусу она может сбоить, даже в том случае, если до того она работала нормально, поэтому можно немного открутить винты (буквально вполоборота) и «материнка» будет снова работать нормально. Почему феномен? Потому что ни один специалист не может дать вразумительный ответ по поводу происхождения этого явления.

Роль процессора в нашем случае может заключаться лишь в одном – он «сгорел» или же вышел со строя по иным причинам, которыми могут быть проблемы с охлаждением (особенно если процессором не поддерживается автоматическая блокировка при перегреве), превышение подаваемого напряжения (может быть вызвано неисправностью материнской платы или блока питания).

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

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

Рассмотрим следующую ситуацию: после нажатия кнопки питания индикатор работы системного блока светится, но дальше дело не идет – на экране ничего не появляется, и индикатор работы жесткого диска не горит, следовательно, операционная система тоже не грузится

Чаще всего происходит так что материнская плата сама «подсказывает», почему дальнейшая загрузка невозможна. Делает она это посредством звуковых сигналов, издаваемых высокочастотным динамиком системного блока («пищалкой»). Так как причинами отсутствия загрузки могут быть неполадки разных устройств, то и звуковые сигналы, соответственно, разные.

Длинный звуковой сигнал единоразово – ошибка питания. Требуется проверить подаваемое блоком напряжение. Сделать эго можно с помощью тестера – на мультиметре выставляется необходимая цена деления шкалы, щупы вставляются в соответствующие гнезда одного из разъемов. Таким образом, напряжение должно составлять 5 В и 12 В. Если напряжение не соответствует, блок следует отремонтировать, если ремонт не удался – заменить.

Один длинный (Д) и один короткий (К) или несколько коротких сигналов. Это ОЗУ, или как его еще называют, оперативная память. Если на материнской плате установлено несколько модулей оперативной памяти, то можно попробовать осуществить запуск, отсоединяя модули по одному. Если после этого загрузка прошла нормально, без сигналов, то это еще не означает, что отсоединенный модуль неисправен – попробуйте заменить отсоединенный на оставшийся в слоте. Успешная дальнейшая загрузка будет говорить о том, что «виноват» не модуль, а слот, в котором он находился ранее – вполне возможно, что он попросту засорился и его следует аккуратно пропылесосить. Единственное же, что можно сделать с модулем в домашних условиях – аккуратно протереть контакты модуля ветошью, смоченной в спирте, дождаться высыхания (1–2 мин) и поставить модуль обратно. Хуже не станет, даже если вы выполните эти две операции в профилактических целях. Сигнал Д-К-К – Видеокарта. Сначала видеоадаптер следует передернуть (вынуть и вставить в слот), очистив при этом контакты и слот аналогичным способом, если не помогло – попробовав отремонтировать.

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

Построение интерфейса на языке Java методом «жесткого кодирования»

Большинство современных языков программирования предоставляет пользователю богатый инструментарий для построения пользовательского интерфейса. Стандартизация основных его компонентов под общим названием WIMP (Windows, Icons, Menus. Pointers) дала возможность создать визуальные средства проектирования, которые позволяют конструировать интерфейс при помощи мыши и минимального вмешательства в код. Это ускоряет разработку программных средств, сводя этап создания интерфейса к чисто визуальным приемам. Именно этот метод завоевал себе наибольшую популярность среди разработчиков и ныне применяется в подавляющем большинстве сред разработки на различных языках программирования.

Между тем проектирование – не единственный способ построения интерфейса. Существует более сложный, но в то же время и более гибкий подход, который позволяет программисту создавать интерфейсы любой сложности. Впервые этот подход был применен еще в классических языках программирования – например, для среды Borland Pascal существовал пакет Turbo Vision, а для Borland C++ – Object Windows Library. Все эти библиотеки предоставляли пользователю возможность конструировать интерфейс на уровне кода, полностью отказываясь от визуального проектирования. Этот подход называется «жестким кодированием» (hard-coded user interface), поскольку пользовательский интерфейс описывается сугубо средствами языка программирования.

Каждый из этих подходов имеет свои недостатки и преимущества. Так, например, все компоненты визуально спроектированного окна по умолчанию имеют фиксированные геометрические пропорции и привязаны к координатной сетке. Это означает, что, например, при изменении пропорций этого окна либо появятся огромные «пустые» поля, либо все компоненты разъедутся в разные стороны. Другим существенным недостатком является статичность по умолчанию всех компонентов окна. Их нельзя перемещать, или изменять их пропорции во время работы программы – такой функционал программисту нужно реализовать отдельно, обрабатывая соответствующие события. Это усложняет задачу и приводит к трате существенной части времени на рутинную работу. Или же – к обеднению интерфейса, а следовательно – к снижению привлекательности и удобства использования программного обеспечения пользователем.

Кроме того, визуальное проектирование усложняет программисту задачу создания новых компонентов интерфейса или комбинирования существующих. Для некоторых сред разработки ПО этот недостаток можно устранить при помощи специальных инструментов – как, например, это сделано в Adobe Flash Catalyst. Однако для большинства языков программирования этот подход малоприменим, особенно если речь идет о создании стационарных (standalone) приложений.

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

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

В наше время подобный подход поощряет также библиотека графических компонентов QT компании TrollTech, которая является основой для такого известного пакета, как KDE. В Java средства для создания интерфейса по такому принципу включены в стандартную поставку и являются неотъемлемой частью графических библиотек AWT и Swing. В данной статье мы рассмотрим построение интерфейса методом жесткого кодирования на примере Swing.

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

Любой интерфейс состоит из отдельных компонентов, которые называются «элементами управления». Они не могут содержать в себе другие компоненты и применяются исключительно для отображения и ввода данных. В Swing элементами управления считаются следующие компоненты (в скобках указаны соответствующие им имена классов):

• Текстовая метка (JLabel):

• Кнопка (JBufton):

• Радиокнопка (JRadioButton):

• Флажок (JCheckBox);

• Комбобокс (JComboBox):

• Список (JList);

• Таблица (JTable);

• Дерево (JTree).

Строго говоря, три последних компонента одновременно являются и элементами управления, и контейнерами – то есть, компонентами, которые содержат в себе другие элементы управления. Объясняется это тем, что они являются так называемыми составными элементами управления, которые получены путем комбинирования других.

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

• Фрейм, или независимое окно (JFrame);

• Диалоговое окно (J Dialog):

• Панель (JPanel).

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

• схема «стороны света»:

• табличная схема:

• схема «ряд»

• схема «ось»

• схема «стек».

Опишем их основных характеристики и на примере кнопочной панели покажем, как можно размещать различные компоненты таким образом.

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

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

При помощи этой схемы оптимально конструировать главное диалоговое окно. Северный компонент в этом случае будет содержать, например, линейку меню и панель быстрого доступа, южный – строку статуса, а центральный – рабочее пространство.

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

Обратите внимание, что в данном случае специализированные константы не используются, вместо этого применяется так называемый «натуральный порядок размещения», в котором строки содержат колонки, а те – компоненты.

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

Третьей схемой является ряд. Это самая простая, и в то же время самая редкоиспользуемая схема. Она попросту выстраивает все компоненты в длинную отцентрированную ленту. В качестве параметра можно передать указание, как именно следует выровнять компоненты – по левому краю, правому и отцентрировать.

Вместо этой схемы разметки рекомендуется использовать другую схему, похожую, однако более универсальную. Она носит название ось, поскольку выстраивает компоненты по одной из двух осей – либо по вертикали, либо по горизонтали.

Обратите внимание, что указание схемы разметки отличается от всех предыдущих. Это связано с необходимостью установить двойную связь между менеджером разметки и самим компонентом. А это, в свою очередь, позволяет легко исключать или добавлять компоненты «на лету», а затем обновлять панель при помощи специальной функции invalidateLayout(). То же самое, кстати, позволяют и остальные панели, но там необходимо обновить не только панель, но и само главное окно – поэтому такой функции там нет.

Для того чтобы горизонтально разместить компоненты, достаточно поменять ось выравнивания.

Последней схемой разметки, рассмотренной в данной статье, является схема «стек» или схема перекрывающихся панелей. Смысл этой схемы состоит в размещении нескольких панелей на одном и том же месте, при этом видимой будет только «верхняя». Смена видимости в такой схеме связана со сделанным пользователем выбором в каком-нибудь элементе управления, например, комбобоксе.

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

а) перенасытить диалоговое окно компонентами;

б) создать три перекрывающиеся панели и организовать их в стек

Описанные выше схемы можно комбинировать и более простыми способами, чем в предыдущем примере. Так, например, на верхнем уровне можно разделить окно на центральную и восточную панели (схема «стороны света»). Центральную панель можно занять полем ввода текста, а восточную – отвести под кнопочную панель. В свою очередь восточную панель разрешается при помощи той же схемы разделить на «север» и «центр». Последний позволительно оставить пустым, а в северной панели можно разместить вложенную панель. Эта вложенная панель будет содержать три кнопки, размещенные по табличной схеме.

А самое главное - пропорции, определенные по вышеописанным схемам, будут сохраняться при масштабировании окна, и дополнительного кода для этого писать не нужно.

Конечно, задачами и способами их решения, рассмотренными в данной статье, методы жесткого кодирования не ограничиваются. Кроме описанных схем разметки, например, существует еще так называемая «свободная табличная» разметка (GridBagLayout) – которая, увы, является настолько комплексной, что для ее изучения понадобилась бы отдельная статья. Однако ее комплексность оборачивается совершенно невероятной гибкостью, позволяющей сохранить все преимущества привязки к табличной сетке, и при этом свободно обращаться с геометрическими размерами компонентов. И на ней тема схем разметок не ограничиваются – есть схемы «групповая разметка» и «форма ввода», облегчающие создание диалоговых окон в режиме «жесткого кодирования». А можно и самому изобрести собственную схему, со своими законами изменения геометрии компонентов. Существуют специальные методы, позволяющие на лету изменять компонентный состав окон, и даже динамически конструировать диалоговые окна, основываясь на действиях пользователя в предыдущих. Можно окружать компоненты бордюрами, даже менять их внешний вид. И даже это тоже не конец, а только начало. «Жесткое кодирование» при всей своей кажущейся сложности дает программисту неограниченную свободу действий в создании пользовательского интерфейса.

Сравнение двух поколений процессора Opteron

Процессор AMD Opteron X4 (Barcelona), имеющий четыре ядра, является последователем процессора Opteron Х2, у которого два ядра. Чтобы упростить конструкцию материнской платы, они используют одно и то же гнездо. Следовательно, у них одинаковые DRAM-каналы и, соответственно, одинаковая пиковая пропускная способность. Кроме удвоенного количества ядер, у Opteron X4 также имеется удвоенная пиковая производительность работы с числами с плавающей точкой на одно ядро: ядра Opteron Х4 могут запускать две SSЕ2-инструкции с плавающей точкой в одном тактовом цикле, а ядра Opteron Х2 запускают не больше одной. Поскольку обе сравниваемые системы имеют похожие тактовые частоты – 2.2 ГГц у Opteron X2 и 2,3 ГГц у Opteron Х4 – процессор Opteron Х4 обладает более чем в четыре раза лучшей пиковой производительностью при работе с числами с плавающей точкой, чем процессор Opteron Х2 при одинаковых показателях пропускной способности DRAM. У Opteron X4 также имеется 2 Мбайт кэш-памяти уровня L3, которой нет у Opteron Х2.

Оптимизация вычислений

Для сокращения количества узких мест в вычислениях почти любому базовому компоненту могут помочь следующие две оптимизации:

1. Смешивание операций с плавающей точкой. Достижение пиковой производительности работы компьютера с числами с плавающей точкой обычно требует одинакового количества практически одновременно производимых сложений и умножений. Этот баланс необходим либо потому, что компьютер поддерживает совмещенную операцию умножения-сложения, либо потому, что блок арифметики с плавающей точкой имеет одинаковое количество сумматоров чисел с плавающей точкой и мультипликаторов чисел с плавающей точкой. Более высокая производительность также требует, чтобы существенная доля смеси инструкций была представлена операциями с плавающей точкой, а не целочисленным и операциями.

2. Повышение параллелизма на уровне инструкций (ILP) и применение SIMD. Для суперскалярных архитектур наивысшая производительность достигается при извлечении, выполнении и завершении выполнения от трех до четырех инструкций за каждый тактовый цикл. Цель состоит в улучшении кода компилятора для повышения параллелизма на уровне инструкций. Один из способов достижения этого заключается в развертывании циклов. Для архитектур х86 отдельная SIMD-инструкция может работать с парами операндов двойной точности, поэтому они должны использоваться везде, где это возможно. Для сокращения количества узких мест в работе памяти могут помочь следующие две оптимизации:

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

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

Модель roofline может помочь принять решение, какую из этих оптимизаций предпринять и в каком порядке. Каждую из этих оптимизаций можно рассматривать как некий «потолок» ниже соответствующей линии крыши, означающий, что пробить потолок без осуществления связанной с ним оптимизации невозможно.

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

Для вычислительной производительности – на верхнем графике, а для пропускной способности памяти – на нижнем. Хотя более высокие потолки для обеих оптимизаций не помечены, но на данном рисунке они подразумеваются. Чтобы пробиться через самый высокий потолок, нужно пробиться через все потолки, расположенные ниже.

Толщина промежутка между потолком и следующим более высоким пределом будет наградой за попытку проведения этой оптимизации. Оптимизация 2, улучшающая ILP, приносит большую пользу для улучшения вычислительной производительности на данном компьютере, а оптимизация 4, улучшающая близость памяти, приносит на нем большую пользу для повышения пропускной способности памяти.

Арифметическая интенсивность базового компонента определяет область оптимизации, которая в свою очередь подсказывает, какие именно оптимизации проводить. Учтите, что для большинства показателей арифметической интенсивности вычислительные оптимизации и оптимизации пропускной способности памяти накладываются друг на друга. Например, Базовый компонент 2 попадает в более светлую трапецию справа, предлагающую поработать только над вычислительными оптимизациями. Базовый компонент 1 попадает в более темный параллелограмм в средней части графика, предлагающий попробовать оба типа оптимизаций. Кроме того, он предлагает начать с оптимизаций 2 и 4. Обратите внимание на то, что вертикальные линии базового компонента 1 попадают ниже оптимизации дисбаланса операций с плавающей точкой, поэтому необходимости в оптимизации 1 может и не быть. Если базовый компонент попадает в серый треугольник в нижней левой части графика, это станет предложением на проведения оптимизаций, касающихся только памяти.

До сих пор мы предполагали, что арифметическая интенсивность имела фиксированное значение, но на самом деле так не бывает. Во-первых, есть базовые компоненты, где арифметическая интенсивность растет по мере увеличения объема задачи, например как для задачи плотной матрицы или задачи N-тел. Разумеется, могут быть причины того, что программисты более успешно решают свою задачу при нестрогом масштабировании, чем при строгом. Во-вторых, на количество обращений к памяти влияют устройства кэш-памяти, поэтому оптимизация, улучшающая производительность кэш-памяти, также повышает арифметическую интенсивность. Один из примеров состоит в улучшении локальности, связанной со временем, за счет развертывания циклов с последующей группировкой вместе инструкций с похожими адресами. У многих компьютеров имеются специальные инструкции для работы с кэш-памятью, которые распределяют данные по кэш-памяти, но сначала они не заполняют данный адрес данными из памяти, поскольку вскоре они будут переписаны. Обе эти оптимизации сокращают трафик памяти, перемещая тем самым столбец арифметической интенсивности вправо, скажем, на полтора порядка. Это смещение вправо может поместить базовый компонент в другую область оптимизации.

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

Уточнение. Потолки, которые расположены ниже, проще пробить с помощью оптимизации. Понятно, что программист может проводить оптимизацию в любом порядке, но использование данной последовательности снижает затраты на оптимизацию, не дающую преимуществ из-за ограничений другого рода. Как и в модели трех «C», поскольку roofline -модель дает возможность проникновения в суть вопроса, у нее могут быть свои странности. Например, она предполагает, что программа загрузила все процессоры поровну.

Базовые компоненты, чья арифметическая интенсивность приходится на более светлую трапецию справа, должны сосредоточиться на вычислительных оптимизациях, а базовые компоненты, чья арифметическая интенсивность попадает в серый треугольник в левой нижней части графика, должны сосредоточиться на оптимизациях пропускной способности памяти. А те базовые компоненты, чья арифметическая интенсивность попадает в темно-серый параллелограмм, расположенный в средней части, должны позаботиться о проведении обеих типов оптимизации. Поскольку столбец базового компонента 1 попадает в параллелограмм, расположенный в средней части, нужно попробовать провести оптимизации, касающиеся ILP и SIMD, близости памяти и программной предвыборки. Столбец базового компонента 2 попадает в трапецию в правой части, поэтому нужно попробовать провести оптимизации, касающиеся ILP и SIMD, а также сбалансированности операций с плавающей точкой.

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

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

Модель Roofline

Предлагаемая простая модель связывает производительность работы с числами с плавающей точкой, арифметическую интенсивность и производительность памяти (Williams, Patterson, 2008). Пиковая производительность работы с числами с плавающей точкой может быть определена с использованием вышеупомянутых спецификаций оборудования. Рассматриваемый здесь рабочий набор базовых компонентов не помещается в кэш-память, имеющуюся на кристалле, поэтому пиковая производительность памяти может быть определена в отношении системы памяти с отставанием от устройств кэш-памяти. Один из способов определения пиковой производительности памяти – использование контрольной задачи Stream.

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

Модель Roofline Williams, Patterson, 2008). У данного примера пиковая производительность работы с числами с плавающей точкой равна 16 Гфлоп/с, а пиковая пропускная способность памяти, полученная по результатам выполнения контрольной задачи Stream, равна 16 Гбайт/с. (поскольку при ее выполнении делается четыре измерения, эта линия является их средним показателем). Выделенная другим оттенком точечная вертикальная линия слева представляет Базовый компонент 1 (Kernel 1), имеющий арифметическую интенсивность 0,5 флоп/байт. Его производительность ограничена пропускной способностью (bandwidth – BW) памяти и на данном процессоре Opteron X2 не может превышать в Гфлоп/с. Вертикальная точечная линия справа представляет Базовый компонент 2 (Kernel 2), с арифметической интенсивностью 4 флоп/байт. Производительность ограничена только вычислительными возможностями, равными 16 Гфлоп/с.

Как изобразить графически пиковую производительность памяти? Поскольку по оси X откладываются значения в флоп/байт, а по оси Y откладываются значения в флоп/с, то на этом рисунке байт/с – это просто диагональная линия под углом 45 градусов. Следовательно, можно нарисовать еще одну линию, показывающую максимальную производительность работы с числами с плавающей точкой, поддерживаемую системой памяти данного компьютера для заданной арифметической интенсивности.

Достижимый показатель Гфлоп/с = Min (пиковая пропускная способность памяти, Арифметическая интенсивность, пиковая производительность работы с числами с плавающей точкой).

Горизонтальные и диагональные линии дали этой простой модели имя и показывают ее значение. «Линия крыши» («roofline») устанавливает верхнюю границу производительности базового компонента в зависимости от его арифметической интенсивности. Если арифметическая интенсивность представляется в виде столба, упирающегося в крышу, то этот столб упирается либо в ее плоскую часть – ограничение производительности вычислительными возможностями, либо упирается в наклонную часть крыши – производительность ограничена пропускной способностью памяти. Базовый компонент 2 является примером первого ограничения, а базовый компонент 1 – примером второго ограничения. При заданной для компьютера линии крыши ее можно использовать не один раз, поскольку она не зависит от базового компонента.

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

Roofline: простая модель производительности

Этот раздел основан на статье Уильямса и Паттерсона (Williams, Patterson, 2008). В недавнем прошлом обычный здравый смысл в компьютерной архитектуре привел к сходным конструкциям микропроцессоров. Почти каждый настольный и серверный компьютер использует устройства кэш-памяти, конвейеризацию, выдачу суперскалярных инструкций, прогнозирование условных переходов и выполнение инструкций с изменением последовательности. Наборы инструкций варьируются, но все микропроцессоры принадлежат к одной и той же школе конструирования.

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

Учитывая растущее разнообразие, было бы весьма полезно иметь простую модель, предлагающую способ проникновения в суть производительности различных конструкций. Она не должна быть идеальной, достаточно, чтобы с ее помощью можно было постичь суть конструкции.

Аналогией может послужить модель трех «C», рассмотренная ранее. Эта модель неидеальна, поскольку в ней игнорируются потенциально важные факторы, такие как размер блока, политика распределения блоков и политика замены блоков. Кроме того, у нее есть свои особенности. Например, промах при обращении к кэш-памяти в одной конструкции может быть отнесен на счет ее объема, а в другой – на счет конфликта при кэш-памяти того же объема. Тем не менее, модель трех «С» была популярной в течение 20 лет, поскольку она предлагала проникновение в суть поведения программ, помогая как разработчикам архитектур, так и программистам, повышая их творческий потенциал, основанный на понимании сути происходящего благодаря этой модели.

Чтобы найти нужную нам модель, давайте начнем с 13 шаблонов конструирования, определенных в Университете Беркли. Идея шаблонов конструирования состоит в том, что производительность заданных приложений на самом деле является взвешенной суммой нескольких базовых компонентов, реализующих эти шаблоны конструирования. Здесь будет дана оценка отдельным базовым компонентам, но следует иметь в виду, что реальные приложения являются комбинацией множества базовых компонентов.

Хотя есть версии с различными типами данных, в ряде реализаций популярны числа с плавающей точкой. Следовательно, пиковая производительность при работе с числами с плавающей точкой выражается пределом скорости выполнения таких базовых компонентов на отдельно взятом компьютере. Для многоядерных кристаллов пиковая производительность при работе с числами с плавающей точкой является совокупностью пиковых производительностей всех ядер. Если в системе имеется несколько микропроцессоров, пиковая производительность, приходящаяся на один кристалл, должна быть умножена на общее количество кристаллов.

Требования к системе памяти могут быть оценены путем деления этой пиковой производительности при работе с числами с плавающей точкой на среднее количество операций с плавающей точкой.

Соотношение количества операций с плавающей точкой на байт обращений к памяти называется арифметической интенсивностью. Этот показатель может быть вычислен путем деления общего количества операций с плавающей точкой, имеющегося в программе, на общее количество байтов данных, переданных оперативной памяти в процессе выполнения программы. Арифметическая интенсивность, определенная как количество операций с плавающей точкой в выполняемой программе, деленное на количество байтов оперативной памяти, к которым было обращение (Williams, Patterson, 2006). Некоторые базовые компоненты имеют арифметическую интенсивность, которая масштабируется параллельно объему задачи, например Плотная матрица, но существует множество базовых компонентов, где арифметическая интенсивность не зависит от объема задачи. Для базовых компонентов из этой последней категории нестрогое масштабирование может привести к различным результатам, из-за того, что к системе памяти предъявляется меньше требований.

Параллельные задачи для процессора

Краткая сводка ряда параллельных контрольных задач, описание которых приводится ниже:

- Unpack это коллекция подпрограмм линейной алгебры и подпрограмм для составления Гауссовых исключений, известная как Unpack benchmark. Подпрограмма DAXPY в упражнении представляет небольшой фрагмент исходного кода Unpack benchmark. В данной коллекции разрешено нестрогое масштабирование, позволяющее пользователю выбирать задачу любого размера. Кроме того, коллекция позволяет пользователю переписывать Unpack в любой форме и на любом языке, пока он будет вычислять приемлемые результаты. Дважды в год на сайте www.top500.org публикуется список из 500 самых быстрых компьютеров, показавших наивысшую производительность при решении контрольных задач Unpack. Первый в этом списке, по мнению прессы, является самым быстрым компьютером в мире.

- SPECrate является средством оценки пропускной способности, основанным на таких контрольных задачах SPEC CPU, как SPEC CPU 2006. Вместо выдачи отчета о производительности отдельных программ SPECrate одновременно выполняет множество копий программы. Таким образом, этот пакет дает оценку параллелизма на уровне заданий, поскольку обмен данными между заданиями отсутствует. Можно запустить любое желаемое количество копий программ, что опять-таки является формой нестрогого масштабирования.

- SPLASH и SPLASH2 (Stanford Parallel Applications for Shared Memory – Стэнфордские параллельные приложения для совместно используемой памяти) были результатом усилий исследователей, предпринятых в 1990-х годах и направленных на подготовку комплекта контрольных задач для параллельных вычислений, сходных по назначению с комплектом контрольных задач SPEC CPU. Он включает как базовые компоненты (kernels), так и приложения, многие из которых получены от сообщества высокопроизводительных вычислений. Этот комплект контрольных задач требует строгого масштабирования, хотя и поставляется с двумя наборами данных.

Один из последних подходов был поддержан исследованиями Калифорнийского университета в Беркли. Были определены 13 шаблонов конструирования, заявленные частью будущих приложений. Эти шаблоны конструирования реализованы с помощью структур, или ядер. В качестве примеров можно привести разреженные матрицы, структурированные решетки, конечные автоматы, функции тар и reduce и обход графа. Позиционируя определения на высоком уровне, специалисты надеются стимулировать новшества на любом уровне системы. Таким образом, система, способная быстрее всех выдавать решение разреженной матрицы, наряду с самыми новыми архитектурами и компиляторами должна поддерживать использование любой структуры данных, алгоритма и языка программирования.

Введение в топологию мультипроцессорных сетей

Для соединения ядер в единую систему многоядерным микросхемам нужна сеть на кристалле. В этом разделе рассматриваются все за и против различных мультипроцессорных сетей.

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

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