Отладка программ заключается в проверке правильности работы программы и аппаратуры. Программа, не содержащая синтаксических ошибок, тем не менее, может содержать логические ошибки, не позволяющие программе выполнять заложенные в ней функции. Логические ошибки могут быть связаны с алгоритмом программы или с неправильным пониманием работы аппаратуры, подключенной к портам микроконтроллера.
Встроенный в состав интегрированной среды программирования отладчик позволяет отладить те участки кода программы, которые не зависят от работы аппаратуры, не входящей в состав микросхемы микроконтроллера. Обычно это относится к вычислению математических выражений или преобразованию форматов представления данных.
Для отладки программ обычно применяют три способа:
- Пошаговая отладка программ с заходом в подпрограммы;
- Пошаговая отладка программ с выполнением подпрограммы как одного оператора;
- Выполнение программы до точки останова.
Пошаговая отладка программ заключается в том, что выполняется один оператор программы и, затем контролируются те переменные, на которые должен был воздействовать данный оператор.
Методы отладки программ в Wolfram Mathematica
Если в программе имеются уже отлаженные подпрограммы, то подпрограмму можно рассматривать, как один оператор программы и воспользоваться вторым способом отладки программ.
Если в программе существует достаточно большой участок программы, уже отлаженный ранее, то его можно выполнить, не контролируя переменные, на которые он воздействует. Использование точек останова позволяет пропускать уже отлаженную часть программы. Точка останова устанавливается в местах, где необходимо проверить содержимое переменных или просто проконтролировать, передается ли управление данному оператору.
Практически во всех отладчиках поддерживается это свойство (а также выполнение программы до курсора и выход из подпрограммы). Затем отладка программы продолжается в пошаговом режиме с контролем локальных и глобальных переменных, а также внутренних регистров микроконтроллера и напряжений на выводах этой микросхемы.
Программируемые логические матрицы, программируемая матричная логика, базовые матричные кристаллы
В цифровые системы входят какк стандартные части, так и некоторые нестандартные, специфичные для данной системы. К стандартным относятся, например, микроконтроллер и память, которые не изготавливаются для конкретной системы по специальному заказу. Микроконтроллер решает требуемую задачу, исполняя программу, в виде последовательности команд.
Стандартные БИС/СБИС лидируют по уровню интеграции, т. к. высокая стоимость проектирования оптимизированных по плотности кристаллов, достигающая сотен миллионов доларов, оказывается в данном случае приемлемой, поскольку такие микросхемы выпускаются массово.
Нестандартные схемы используются для управления блоками системы, обеспечения сопряжения и т. п., где требуется высокое быстродействие. Реализация нестандартной части систем исторически была связана с использованием микросхем малого и среднего уровней интеграции. При этом резко увеличиваются габариты устройства, усложняется монтаж, снижается надежность и повышается стоимость. В то же время проектирование и изготовление заказных БИС/СИС связано с большими экономическими и временными затратами.
Скрытые возможности, освобождаемые сборки, правила отладки
Возникшие проблемы привели к появлению БИС/СБИС с программируемой и ре программируемой структурой.
Первыми представителями указанного направления явились программируемые логические матрицы ПЛМ (Programmable Logic Array PLA), программируемая матричная логика ПМЛ (Programmable Array Logic PAL) и базовые матричные кристаллы БМК, называемые также вентильными матрицами ВМ (Gate Array GA). Микросхемы PLA и PAL за рубежом объединяются термином SPLD (Simple Programmable Logic Devices) или PLD(Programmable Logic Devices).
Появление ПЛМ, ПМЛ, и БМК ознаменовало собою начало важнейшего направления развития цифровой элементной базы. Разработка БИС/СБИС с программируемой и репрограмируемой структурой оказалась чрезвычайно перспективным направлением и привела к созданию нового типа цифровых микросхем, таких как CPLD (Complex Programmable Logic Devices), FPGA (Field Programmable Gate Array), SOPC (System On Programmable Chip).
Источник: studfile.net
Модели программ, компиляция и отладка
На практике различают несколько моделей, используемых при написании программ. Существенное отличие моделей состоит в том, что каждая из них предполагает наличие различного числа сегментов и способов группирования программных сегментов и сегментов данных. Ниже перечислены используемые модели и даны их краткие характеристики (код – означает программный сегмент):
TINY — код и данные в одной группе (com — файлы );
SMALL — код – один сегмент, данные в одной группе;
MEDIUM — код – несколько сегментов, данные в одной группе;
COMPACT — код один сегмент, ссылка на данные – типа far;
LARGE — код – несколько сегментов, данные — типа far;
FLAT — код и данные в одном сегменте (плоская модель).
Для получения исполняемого файла программы составленной на ассемблере надо реализовать, по крайней мере, два этапа – осуществить трансляцию программы и получить объектный модуль с расширением obj, а затем скомпоновать объектные модули в исполняемую программу, с расширением exe (или com). Реализация первого этапа осуществляется с помощью программы MASM (или TASM), а второго – с помощью LINK (или TLINK). В ряде случаев, особенно при разработке сложных программ, состоящих из большого числа модулей, бывает не обойтись без специальных средств отладки, типа турбодебагера td.
Пусть текст исходной программы хранится в файле с именем SIMPLE.ASM. Трансляцию можно осуществить вызовом турбо ассемблера TASM.EXE с помощью, например, следующей команды DOS:
tasm /z/zi/n simple,simple,simple
Ключ /z разрешает вывод на экран строк исходного текста программы, в которых ассемблер обнаружил ошибки (без этого ключа поиск ошибок пришлось бы проводить по листингу трансляции).
Ключ /zi управляет включением в объектный файл информации, не требуемой при выполнении программы, но используемой отладчиком.
Ключ /n подавляет вывод в листинг перечня символических обозначений в программе, от чего несколько уменьшается информативность листинга, но сокращается его размер.
Стоящие далее параметры определяют имена файлов: исходного (SIMPLE.ASM), объектного (SIMPLE.OBJ) и листинга (SIMPLE.LST). При желании можно в строке вызова транслятора указать полные имена файлов с их расширениями, однако необходимости в этом нет, так как по умолчанию транслятор использует именно указанные выше расширения.
Важную роль при отладке программы на стадии трансляции играют ключи, которые управляют как процессом ассемблирования, так и полнотой листинга – файла с расширением LST, существенно облегчающего отладку программы.
Контрольные вопросы
1. Может ли регистр использоваться в фактическом параметре макровызова?
2. Чем отличается команда от директивы?
3. Придумайте, как программисты на ассемблере могут определить синонимы для мнемокодов команд. Как это можно реализовать?
4. Перечислите модели ассемблерных программ и укажите их особенности и основные отличия.
5. Перечислите все директивы определения данных и дайте примеры их использования.
6. Объясните назначение вспомогательной директивы DUP и приведите пример ее использования.
7. Какая директива определения данных используется под вещественные числа в формате ДВФ?
8. Приведите примеры использования директивы EQU.
9. Укажите все возможные способы передачи параметров процедуре.
10. Как расширились возможности регистров данных в процессоре Pentium, для целей адресации?
11. Расширилось ли число способов адресации в процессоре Pentium по отношению к Intel 8086 и на сколько?
12. Для чего используются директивы определения данных?
13. Какие директивы используются для определения данных в формате ВВФ?
14. Как осуществляется передача параметров в макросах?
15. В чем отличие в использовании макросов и процедур?
16. Приведите пример использования макросов – блоков повторения.
17. Для чего используются директивы условного ассемблирования?
18. Дайте сравнительную характеристику моделей программ.
19. Как можно узнать о том, выполняет ли ЦП команды ММХ и SSE?
20. В каких случаях используется директива PURGE?
21. Назовите отладчики, которые Вы знаете? Чем они отличаются?
22. Зачем нужен файл с расширением LST (листинг)?
23. Какую модель программы Вы использовали при выполнении лабораторных работ и почему?
24. Для чего служит программа debug.exe?
25. На каком этапе осуществляется «вставка» библиотечных процедур?
26. Существуют ли, какие-либо особенности использования команд ММХ и SSE в программах на ассемблере?
Дата добавления: 2018-11-26 ; просмотров: 531 ; ЗАКАЗАТЬ НАПИСАНИЕ РАБОТЫ
Источник: poznayka.org
Русские Блоги
В традиционной разработке программного обеспечения ошибка обычно приводит к сбою программы. Это очень раздражает пользователей, поэтому разработчикам важно решить эти проблемы — в случае сбоя программы разработчик может проверить ошибку, чтобы понять причину.
В моделях машинного обучения разработчики иногда сталкиваются с ошибками, но часто вызывают сбой программы без явной причины. Хотя эти проблемы можно отладить вручную, модели машинного обучения часто терпят неудачу из-за плохих прогнозов результатов. Что еще хуже, когда модель терпит неудачу, обычно нет сигнала, чтобы показать причину или когда модель вышла из строя. Ситуацию усложняет то, что это может быть связано с рядом факторов, включая плохие данные обучения, ошибки с большими потерями или недостаточную скорость сходимости.
В этом сообщении блога мы обсудим, как отлаживать эти скрытые ошибки, чтобы они не влияли на производительность наших алгоритмов машинного обучения. Вот краткий обзор того, что мы представим:
- Как найти дефекты во входных данных.
- Как заставить модель учиться большему на меньшем количестве данных.
- Как подготовить данные для обучения и избежать распространенных ошибок.
- Как найти оптимальные гиперпараметры модели.
- Как организовать скорость обучения, чтобы уменьшить переобучение.
- Как отслеживать прогресс тренировок с отягощениями и отклонениями.
Стоит отметить, что как специалист по науке о данных / машинному обучению вы должны понимать, что есть много причин, по которым проекты машинного обучения терпят неудачу. Большинство из них не имеют ничего общего с навыками инженеров и специалистов по обработке данных (то, что это не работает, не означает, что вы неисправны). Наш вывод состоит в том, что если мы сможем как можно раньше обнаружить распространенные ошибки или лазейки, мы сможем сэкономить время и деньги. Это будет иметь решающее значение для приложений с высоким уровнем риска, таких как финансы, правительство и здравоохранение.
Когда вы задаетесь вопросом, способны ли наши данные обучать хорошую модель, можно рассмотреть два аспекта:
- Могут ли данные предсказать результат, который мы хотим предсказать?
- Достаточно ли данных?
Чтобы выяснить, содержит ли наша модель прогнозную информацию, мы можем спросить себя: Могут ли люди делать прогнозы на основании этих данных?
Если человек не может понять изображение или абзац текста, наша модель не будет предсказывать значимые результаты. Если прогнозной информации недостаточно, добавление дополнительных входных данных в нашу модель не улучшит ее; Напротив, модель переобучится и станет менее точной.
Как только в наших данных будет достаточно прогнозной информации, нам нужно выяснить, достаточно ли у нас данных для обучения модели извлечению сигнала. Следует соблюдать несколько практических правил:
- Для классификации у нас должно быть не менее 30 независимых выборок на класс.
- Для любой функции, особенно проблем со структурированными данными, у нас должно быть не менее 10 образцов.
- Размер набора данных прямо пропорционален количеству параметров в модели. Эти правила, возможно, потребуется изменить для вашего конкретного приложения. Если вы можете воспользоваться преимуществами трансферного обучения, вы можете значительно уменьшить количество требуемых образцов.
Во многих случаях у нас просто недостаточно данных. В этом случае один из лучших вариантов — расширить данные. Кроме того, мы можем использовать генеративные модели, такие как автоэнкодеры и генеративные состязательные сети, для генерации наших собственных данных.
Точно так же мы можем найти внешние общедоступные данные, которые можно найти в Интернете. Даже если данные изначально не собирались для наших целей, мы потенциально можем изменить их метку или использовать для передачи обучения. Мы можем обучить модель для различных задач на большом наборе данных, а затем использовать модель в качестве основы для задачи. Точно так же мы можем найти модель, которую другие обучили для различных задач, и повторно использовать ее для наших задач.
Важно помнить, что в большинстве случаев качество данных превышает объем данных. Наличие небольшого высококачественного набора данных и обучение простой модели — лучший способ найти проблемы в данных на ранних этапах процесса обучения. Одна ошибка, которую допускают многие специалисты по данным, заключается в том, что они тратят время и деньги на получение большого набора данных, но затем обнаруживают, что их проект имеет неправильный тип данных.
Существует три распространенных метода предварительной обработки данных характеристик тренировочного процесса:
- стандартизация: Убедитесь, что среднее значение всех данных равно 0, а стандартное отклонение равно 1. Это наиболее распространенный способ уменьшить количество функций. Если вы подозреваете, что данные содержат выбросы, это еще более полезно.
- Мин-макс изменение масштаба:Масштабируйте все значения данных от 0 до 1, вычтя минимальное значение и разделив его на диапазон значений.
- Средняя нормализация: Убедитесь, что значение данных находится между (-1) и 1, со средним значением 0. Мы вычитаем среднее значение и делим на диапазон данных.
Однако, когда мы готовим функции, важно измерять только метрику, среднее значение и стандартное отклонение в наборе тестов. Если мы измеряем эти факторы на всем наборе данных из-за раскрытия информации, производительность алгоритма на тестовом наборе может быть лучше, чем в реальном производстве.
Настройка гиперпараметров модели нейронной сети вручную может быть очень утомительной. Это связано с тем, что когда дело доходит до корректировки гиперпараметров, научных правил нет. Вот почему многие специалисты по данным обратились к автоматическому поиску гиперпараметров, используя какой-то алгоритм оптимизации, не основанный на градиенте.
Чтобы понять, как найти оптимальные гиперпараметры модели с весами и смещениями, давайте посмотрим на этот пример модели компьютерного зрения mask r-cnn (https://www.wandb.com/articles/mask-r- cnn -hyperparameter-experts-with-weights-and-biases). Чтобы реализовать маску r-cnn задачи семантической сегментации, Коннор и Трент настроили различные гиперпараметры, которые управляют работой модели (https://github.com/connorhough/Mask_RCNN/blob/master/mrcnn/config.py ): Скорость обучения, нормализация градиентного редактирования, уменьшение веса, соотношение, вес различных функций потерь . Они хотят знать, как выполняется семантическая сегментация изображений. Поскольку модель использует разные гиперпараметры для обучения, они интегрировали класс imagecallback () (https://github.com/connorhough/Mask_RCNN/blob/master/samples/coco/coco.py) для синхронизации с wandb. Кроме того, они также написали скрипт (https://github.com/connorhough/Mask_RCNN/blob/master/samples/coco/inspect_weights.ipynb) для запуска сканирования параметров, который можно адаптировать к различным гиперпараметрам или одинаковым значениям. Гиперпараметров.
Их результаты можно найти на странице Wandb Run (https://app.wandb.ai/trentwatson1/mask-rcnn/runs). Набор с высоким градиентом обрезки и высокая скорость обучения могут повысить точность модели.По мере увеличения количества итераций оценка потерь при проверке будет быстро падать.
Одним из наиболее важных гиперпараметров является скорость обучения, которую сложно оптимизировать. Малая скорость обучения ведет к низкой скорости обучения, а большая скорость обучения приводит к переобучению модели.
С точки зрения определения скорости обучения стандартные методы поиска по гиперпараметрам — не лучший выбор. Что касается скорости обучения, лучше всего выполнить поиск по строке и визуализировать потерю различных скоростей обучения, так как это даст вам представление о том, как ведет себя функция потерь. При выполнении поиска по прямой линии лучше всего увеличивать скорость обучения экспоненциально. Скорее всего, вас будут интересовать области, в которых скорость обучения невелика.
Вначале наша модель может быть далека от оптимального решения, поэтому мы хотим двигаться как можно быстрее. Однако по мере приближения к минимальным потерям нам нужно двигаться медленнее, чтобы избежать перерегулирования. Следовательно, мы должны определить таблицу скорости обучения, чтобы обновлять скорость в соответствии с указанными правилами во время обучения.
Важная часть отладки модели — это выяснить, когда что-то пойдет не так, прежде чем тратить много времени на обучение модели. wandb обеспечивает удобный способ визуализации и отслеживания экспериментов с машинным обучением. Вы можете искать / сравнивать / визуализировать тренировочные прогоны, анализировать показатели использования системы во время выполнения, копировать исторические результаты и многое другое.
После установки wandb все, что нам нужно сделать, это включить этот код в наш обучающий сценарий:
import wandb # Your custom arguments defined here args = … wandb.init(config=args, project=”my-project”) wandb.config[“more”] = “custom” def training_loop(): while True: # Do some machine learning epoch, loss, val_loss = … # Framework agnostic / custom metrics wandb.log()
Или мы можем интегрировать Tensorboard в одну строку (https://docs.wandb.com/integrations/tensorboard):
wandb.init(sync_tensorboard=True)
TensorBoard — это расширение TensorFlow, которое позволяет нам легко отслеживать модель в браузере. Чтобы предоставить интерфейс, из которого мы можем наблюдать за развитием модели, tensorboard также предоставляет несколько полезных опций для отладки. Например, мы можем наблюдать за распределением весов и градиентов модели во время обучения.
Если мы действительно хотим изучить эту модель глубоко, в tensorboard есть визуальный отладчик. В этом отладчике мы можем пройти по модели тензорного потока и проверить каждое значение в ней. Это особенно полезно, если мы изучаем сложные модели, такие как вариационные автокодеры, и пытаемся понять, почему сложные вещи разрушаются.
Теперь у нас есть большое количество инструментов, которые могут помочь нам в реализации реальных проектов машинного обучения. Крайне важно убедиться, что модель работает должным образом перед развертыванием. Если мы этого не сделаем, мы потеряем много денег. Я надеюсь, что этот пост в блоге может предоставить вам практические приемы, которые сделают модель универсальной и простой для отладки.
Источник: russianblogs.com