Кэш — это некая особенная разновидность памяти, которая является своего рода «буфером» между контроллером памяти и процессором. Служит для увеличения скорости работы с ОЗУ. Любая считываемая из памяти информация попадает не только в процессор, но и в кэш. И если эта же информация (тот же адрес в памяти) нужна снова, сначала процессор проверяет: а нет ли её в кэше? Если есть — информация берётся оттуда, и обращения к памяти не происходит вовсе. Аналогично с записью: информация, если её объём влезает в кэш — пишется именно туда, и только потом, когда процессор закончил операцию записи, и занялся выполнением других команд, данные, записанные в кэш, параллельно с работой процессорного ядра «потихоньку выгружаются» в ОЗУ. Чтобы в кэш могли поместиться новые, более актуальные, проводится отслеживание времени последнего обращения к данным, находящимся в кэше.

Скорость обмена данными процессора Pentium 4 со своим кэшам более чем в 10 раз (!) превосходит скорость его работы с памятью. Фактически, в полную силу современные процессоры способны работать только с кэшем. Систему кэширования приходится делать многоуровневой. Кэш первого уровня (самый «близкий» к ядру) традиционно разделяется на две половины, кэш инструкций (L1I) и кэш данных (L1D). Это разделение предусматривается «гарвардской архитектурой» процессора, которая является самой популярной теоретической разработкой для построения современных CPU. Кэш второго и третьего уровня — L2, L3 . Он больше по объёму, и является уже «смешанным» — там располагаются и команды, и данные. Если ни на одном уровне кэша информация не найдена — идёт обращение к основной памяти (ОЗУ). Все уровни кэша работают на той же частоте, что и процессорное ядро.
Trace cache – идея сохранять в кэше инструкций первого уровня (L1I) не те команды, которые считаны из памяти, а уже декодированные последовательности.
Латентность памяти — время, которое требуется для того, чтобы начать считывать информацию с определённого адреса. C момента, когда процессор посылает контроллеру памяти команду на считывание (запись), и до момента, когда эта операция осуществляется, проходит определённое количество времени. Если данные в программе расположены «хаотично» и «небольшими кусками», скорость их считывания становится намного менее важной, чем скорость доступа к «началу куска». Латентность подсистемы памяти зависит не только от неё самой, но и от контроллера памяти и места его расположения. Понятия «скорость чтения / записи» и «латентность», применимы к любому типу памяти —к классической DRAM (SDR, Rambus, DDR, DDR2) и к Кэшу.
В качестве элементов оперативной памяти используют ячейки, представляющие собой конденсаторы. Заряженный конденсатор хранит «1», разряженный — «0». Во время считывания информации конденсаторы разряжаются. Кроме того, заряд в конденсаторе из-за утечки хранится ограниченное время (несколько миллисекунд). Поэтому необходима подзарядка, которая выполняется в процессе регенерации информации. Это обстоятельство обусловило название памяти подобного типа — динамическая память или DRAM (Dynamic RAM).

Малые размеры и простота элементов DRAM позволяют получить довольно большую емкость памяти, но из-за затрат времени на регенерацию снижается быстродействие.
С целью повышения быстродействия DRAM разработано несколько модификаций этого типа памяти. Синхронная память типа SDRAM (Synchronous DRAM) отличается от асинхронной памяти типа DRAM тем, что такты работы памяти засинхронизированы с тактами работы процессора. Это позволяет исключить циклы ожидания, имеющие место в DRAM.
По сравнению с обычной SDRAM в памяти типа DDR SDRAM (Double Date Rate SDRAM) при одной и той же частоте шины памяти быстродействие удалось увеличить вдвое за счет того, что обращения к памяти происходят дважды за такт — как по переднему, так и по заднему фронту тактовых сигналов.

В памяти типа DDR2 в отличие от DDR возможна работа на больших тактовых частотах. Например, в памяти DDR2-1066 при частоте шины 266 обеспечивается частота обращений к памяти 1066 МГц.

Память типа DDR3 имеет меньшее потребление энергии по сравнению с DDR2.
В современных настольных компьютерах используется оперативная память двух типов — DDR и DDR2. Старые типы памяти вроде SDRAM сегодня практически не применяются, за исключением устаревших машин и некоторых встраиваемых систем. Поддержка того или иного типа оперативной памяти осуществляется на уровне набора системной логики, как в случае с платформой Intel, либо на уровне самого процессора, как в случае с чипами AMD Athlon 64.

 

Аналого-цифровые преобразователи (АЦП) – функциональные устройства, выходной цифровой код которых пропорционален амплитуде входного сигнала.
Т.к. большинство физических сигналов, амплитуда которых преобразуется в цифровой код, представляют непрерывные функции времени, а цифровые устройства – устройства дискретного действия, то входные аналоговые сигналы предварительно дискретизируют. Процесс дискретизации заключается в фиксации (запоминании) мгновенного значения входного сигнала в определенные моменты времени и сохранение зафиксированного значения до следующей выборки из входного сигнала. Интервал дискретизации или частота дискретизации fд (временного квантования) должны удовлетворять теореме Котельникова:

— высшая частота в спектре преобразуемого сигнала. При невыполнении условия теоремы однозначное восстановление исходного сигнала из дискретизированного (обратная операция) невозможно. Практически fд превышает 2fв в 1,5..3 раза, т.е.fд ~ 3..6 fв, что значительно упрощает последующее восстановление аналогового сигнала после цифровой обработки.
Основными параметрами АЦП являются:

  • относительная разрешающая способность ;δ=1/(2^n)-1

  • абсолютная разрешающая способность h =Umax*δ , где Umax — максимальное входное напряжение;

  • относительная нелинейность преобразования ;Снимок экрана от 2013-11-17 13:51:17

где входное напряжение, соответствующее коду k ;

  • время преобразования — интервал времени от подачи аналогового напряжения на вход АЦП до получения цифрового кода на выходе;

  • максимальная частота преобразования — наибольшая частота запуска, при которой параметры АЦП соответствуют заданным значениям.

Максимальная частота и время установления определяют быстродействие АЦП.

Существует множество способов аналого-цифрового преобразования. Наиболее распространенные из них:

  • АЦП последовательного действия;

  • АЦП поразрядного приближения;

  • АЦП параллельного действия;

  • Сигма-дельта АЦП.

На торрент трекере раздают всем Orcad, в котором пошаговая readme  не верна, нет нескольких шагов

«1. Устанавливаем менеджер лицензий (License Manager) и программу (Cadence SPB 16.5).

Окно с запросом файла лицензии оставляем пустым.

2. Содержимое папки Cadence из папки Aspirin копируем в такую-же с инсталлированной
программой (если не меняли название папки по умолчанию на первом шаге).

3. Переходим в папку \Cadence\LicenseManager.
Находим и запускаем в ней скрипт LicenseManager.cmd

4. Переходим в папку \Cadence\SPB_16.5\tools\.
Находим и запускаем в ней скрипт Tools.cmd. Скрипт работает от 1 до 5 минут
в зависимости от производительности компьютера.

5. Переходим в папку \Cadence\LicGen. Изменяем любым текстовым редактором в первой
стороке файла src.lic имя this-host на реальное имя Вашего компьютера. Сохраняем файл.

6. Находим и запускаем там-же скрипт LicGen.cmd.
Будет сгенерирован файл лицензии license.lic.

6а. Необходимо сделать следующий шаг «Компьютер -> Свойства -> Дополнительные параметры системы -> Переменные среды -> Создать» 

Создаем по имени — CDS_LIC_FILE и по значению переменной вводим путь до license.dat, у меня это «C:\Cadence\LicenseManager\license.dat»

7. Запускаем программу конфигурации сервера лицензий:
Start -> Programs -> Cadence -> License Manager -> License Server Configuration Utility
В качестве файла лицензии указываем сгенерированный на предыдущем шаге файл.
Дважды жмем Next — должно появиться диагностическое сообщение об успешном
запуске сервера лицензий.

8. ВСЕ! Пользуемся :).»

Видео, для тех, кто все-таки нуждается в помощи!

 

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

Распараллеливание на уровне задач нам демонстрирует операционная система на примере «Диспетчера задач» Windows. Если первая программа показывает нам фильм, а вторая является файлообменным клиентом, то операционная система спокойно сможет организовать их параллельную работу. Другими примерами распараллеливания на этом уровне абстракции является параллельная компиляция файлов в Visual Studio 2008, обработка данных в пакетных режимах, например, в сети.  .NET Framework4 дополнен множеством средств, которые значительно облегчают выражение параллелизма в приложениях и обеспечивают его эффективность. Например, новое подпространством имен включает новый тип — Parallel, который предоставляет ряд статических методов для реализации параллельных циклов.

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

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

Распараллеливание

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

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

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

Open Multi-Processing — это набор директив компилятора, библиотечных процедур и переменных окружения, которые предназначены для программирования многопоточных приложений на многопроцессорных системах. В основу положена идея использования специальных компиляторов («знающих» про параллельное программирование), для которых в коде программы расставляются специальные пометки-примечания, указывающие, что и где следует делать параллельно, а что — последовательно.
Компилятоp  — системная программа, выполняющая преобразование программы, написанной на одном алгоритмическом языке, в программу на языке, близком к машинному. Некоторые компиляторы (например, Java) переводят программу не в машинный код, а в программу на некотором специально созданном низкоуровневом языке. Такой язык, байт-код, также можно считать языком машинных команд, поскольку он подлежит интерпретации виртуальной машиной. Для каждой целевой машины (IBM, Apple и т.д.) и каждой операционной системы или семейства операционных систем, работающих на целевой машине, требуется написание своего компилятора.  Компилятор содержит две части — транслятор и компоновщик, именно последний помогает решать задачи распараллеливания.
Например, компилятор GCC содержит следующие инструментальные программные компоненты: препроцессор, транслятор, ассемблер, компоновщик (редактор связей — линковщик), которые реализуют выполнение одноименных фаз компиляции. Препроцессор вставляет в исходный текст программы заголовочные файлы, указанные директивой # include stdlib;, # define Macros( ) подставляет значения макросов, заданные директивой . Транслятор выполняет грамматический разбор программы на данном языке (С, С++) для проверки синтаксических ошибок. Ассемблер конвертирует текст программы на языке ассемблера в объектный код из машинных инструкций. Основной задачей компоновки является настройка внешних ссылок объектных модулей на точки входа функций переменных, которые определены в других объектных модулях программы и стандартных библиотеках системы программирования.
OpenMP позволяет работать на нескольких уровнях — либо задавать низкоуровневые объекты вручную, либо указывать, какие переменные являются «общими» и требуют синхронизации, передоверяя собственно синхронизацию компилятору.
В OpenMP используется модель параллельного выполнения «ветвление-слияние». Программа OpenMP начинается как единственный начальный поток выполнения. Когда поток встречает параллельную конструкцию, он создает новую группу потоков, состоящую из себя и некоторого числа дополнительных потоков, и становится главным в новой группе. Все члены новой группы (включая главный поток) выполняют код внутри параллельной конструкции. В конце параллельной конструкции имеется неявный барьер. После параллельной конструкции выполнение пользовательского кода продолжает только главный поток. Разработчик не создает новую параллельную программу, а просто последовательно добавляет в текст последовательной программы OpenMP-директивы.

Недостатков у OpenMP два. Первый — относительно жесткая модель программирования, навязываемая программисту — не очевидно, как заставить OpenMP-программу работать в режиме «системы массового обслуживания», когда некий «главный» поток принимает поступающие извне задания (скажем, запрос к веб-серверу) по отдельным потокам. А вручную подобная система делается элементарно. Второй — только сейчас появляющаяся поддержка сообщества Open Source.
Первая спецификация компилятора OpenMP (Open specifications for Multi-Processing) появилась в 1997 году и предназначалась для одного из древнейших языков программирования Fortran, на котором некогда было написано большинство «серьезных» вычислительных приложений. В 1998 году появились варианты OpenMP для языков C/C++; стандарт прижился, получил распространение и к настоящему моменту дорос до версии 2.5. Поддержка спецификации есть во всех компиляторах Intel, в компиляторе Microsoft C/C++, стандартизованно OpenMP — расширении для GCC (GNU-систем типа Linux).
Наиболее низкий уровень параллелизма осуществляется на уровне параллельной обработки процессором нескольких инструкций (команд). Можно изменить порядок этих инструкций, распределить их по группам, которые будут выполняться параллельно, без изменения результата работы всей программы (технологии MMX, SSE, SSE2 ит.д.). Это называется параллелизмом на уровне инструкций. Для реализации данного вида параллелизма в микропроцессорах используется несколько конвейеров команд, технологии предсказание команд, переименование регистров. Программист редко заглядывает на этот уровень. Работу по расположению команд в наиболее удобной последовательности для процессора выполняет компилятор. Интерес этот уровень распараллеливания может представлять только для узкой группы специалистов.

Объекты на уровне 0 называются вентилями. Вентили состоят из аналоговых компонентов (транзисторы) и смоделированы как цифровые средства, на входе у которых цифровые сигналы (или набор 0 и 1), а на выходе – результат простых функций («И» или «ИЛИ»). Каждый вентиль формируется из нескольких транзисторов. Несколько вентилей формируют 1 бит памяти, который может содержать 0 или 1. Биты памяти,объединенные в группы, например, по 16,32 или 64, формируют регистры. Каждый регистр может содержать одно двоичное число до определенного
предела.
Уровень 1. Микроархитектурный уровень, представляет собой локальную память ( совокупность регистров) и схему, называемую АЛУ (арифметико-логическое устройство). АЛУ выполняет простые арифметические операции. Регистры вместе с АЛУ формируют тракт данных, по которому поступают данные. Основная операция тракта данных состоит в следующем. Выбирается один или два регистра, АЛУ производит над ними какую-либо операцию, например сложения, а результат помещается в один из этих регистров.
Уровень 2. Уровень архитектуры команд. Этот уровень включает набор машинных команд, которые выполняются микропрограммой-интерпретатором или аппаратным обеспечением.

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

Другое различие между уровнями 1,2,3 и уровнями 4,5 и выше — особенность языка. Машинные языки уровней 1,2 и 3 — цифровые. Программы, написанные на этих языках, состоят из длинных рядов цифр, которые удобны для компьютеров, но совершенно неудобны для людей. Начиная с четвертого уровня, языки содержат слова и сокращения, понятные человеку.
Уровень 4. Уровень языка ассемблера. Представляет собой символическую форму одного из языков более низкого уровня. На этом уровне можно
писать программы в приемлемой для человека форме. Эти программы сначала транслируются на язык уровня 1, 2 или 3, а затем интерпретируются
соответствующей виртуальной или фактически существующей машиной. Программа, которая выполняет трансляцию, называется ассемблером.
Уровень 5. Язык высокого уровня. Обычно состоит из языков, разработанных для прикладных программистов. Такие языки называются языками высокого уровня. Существуют сотни языков высокого уровня. Наиболее известные среди них — BASIC, С, C++, Java, LISP и Prolog. Программы, написанные на этих языках, обычно транслируются на уровень 3 или 4. Трансляторы, которые обрабатывают эти программы, называются
компиляторами или иногда используется метод интерпретации. Например, программы на языке Java обычно интерпретируются.
Интерпретатор берёт очередной оператор языка из текста программы, анализирует его структуру и затем сразу исполняет. Только после того как
текущий оператор успешно выполнен, интерпретатор перейдёт к следующему. Если один и тот же оператор будет выполняться в программе
многократно, интерпретатор будет выполнять его так как, как будто встретил впервые. Вследствие этого программы, в которых требуется
осуществить большой объём вычислений, будут выполняться медленно.
Компиляторы полностью обрабатывают весь текст программы. Они просматривают его в поиске синтаксических ошибок (иногда несколько раз),
производят определенный смысловой анализ, а затем автоматически переводят (транслируют) на машинный язык — генерируют машинный код.
Понятие «архитектуры» применительно к процессорам несколько двойственно: под ним может пониматься как совместимость с неким единым набором команд, так и совокупность аппаратных решений, присущих определённой достаточно широкой группе процессоров.
Известны процессоры с расширенной и укороченной системой команд, именуемые соответственно CISC (Complex Instruction Set Computing)
и RISC (Reduced Instruction Set Computing). Для CISC-процессоров характерны большое число машинных команд различных форматов, по командам
выполняются довольно объемные вычисления, эквивалентные операторам языков программирования. Такие команды занимают много тактов.
Архитектура CISC используется в микропроцессорах компаний Intel и AMD.
В процессорах архитектуры RISC, появившейся в 1980 г., длинные команды заменяются совокупностями коротких команд, выполнение каждой из
которых происходит за малое число тактов компьютера, чаще всего за один такт. Упрощение обработки команд достигается также за счет их
фиксированного размера и формата. Состав системы команд должен быть «удобен» для компиляции операторов языков высокого уровня.
Архитектуру RISC имеют многие микропроцессоры, разработанные для рабочих станций, например, микропроцессоры SPARC компании Sun
Microsystems, микропроцессоры Power6 компаний IBM и Apple.
«Процессорное ядро» — это конкретное воплощение микроархитектуры (т.е. «архитектуры в аппаратном смысле этого слова»), являющееся
стандартом для целой серии процессоров. Например, NetBurst — это микроархитектура, которая лежала в основе процессоров Intel: Celeron,Pentium 4. Она задает общие принципы: длинный конвейер, использование определенной разновидности кэша кода первого уровня, расширенная 64-битная технология работы с памятью. Последнее принесло три усовершенствования: появление команд для работы с 64-битными целыми
числами, увеличение количества и/или разрядности регистров, и увеличение максимального объёма адресуемой памяти. Частота работы ядра только
в первом приближении определяет быстродействие, так как совершенно не обязательно все составляющие CPU функционируют на той же частоте,
могут на 1⁄2, 1/3. Скорости работы с памятью: За такт передаётся 64 бита, то есть 8 байт. Соответственно, если рабочая частота шины равна 100 МГц (100’000’000 тактов в секунду) — то скорость передачи данных будет равна 8 байт * 100’000’000 герц ~= « в десятичных мегабайтах» 800 мегабайт в
секунду. DDR-шина способна передавать за один такт удвоенный объём данных, а (Quad Data Rate) шина — то она и вовсе «400-мегагерцевая», так
как за один такт передаёт четыре пакета данных. Хотя реальная частота работы у всех трёх вышеописанных шин одинаковая — 100 мегагерц.
Суперскалярность и внеочередное исполнение команд — современные процессоры способны запускать на исполнение не только ту команду,
которую (согласно коду программы) следует исполнить в данный момент времени, но и другие, следующие после неё.
Пусть нам следует исполнить следующую последовательность команд:
1) A = B + C
2) Z = X + Y
3) K = A + Z
Легко заметить, что команды (1) и (2) совершенно независимы друг от друга — они не пересекаются ни по исходным данным (переменные B и C в
первом случае, X и Y во втором), ни по месту размещения результата (переменная A в первом случае и Z во втором). Стало быть, если на данный
момент у нас есть свободные исполняющие блоки в количестве более одного, данные команды можно распределить по ним, и выполнить
одновременно, а не последовательно. В классическом случае исполнение всей последовательности заняло бы N*3 тактов, а в случае с параллельным
исполнением — всего N*2 тактов.
Процессор, который умеет сам определять независимые и непротиворечащие друг другу инструкции и параллельно их выполнять, называется суперскалярным.
Внеочередное исполнение — инструкции поступают в исполнительные модули не в порядке их следования, как было в концепции выполнения
инструкций по порядку, а по готовности к выполнению. Процессор с внеочередным выполнением кода выполняет те инструкции, которые готовы, вне зависимости от их порядка следования в коде программы. Внеочередное выполнение тем эффективнее, чем длиннее конвейер процессора, и чем больше разница в скорости между памятью (оперативной или кэшем) и процессором. Процессоры работают намного быстрее памяти, поэтому во время ожидания поступления данных процессор может выполнить множество инструкций, операнды которых доступны.
В настоящее время для дальнейшего повышения производительности используют несколько подходов. Во-первых, реализация двух или более
процессоров в одной СБИС («мультипроцессирование на уровне микросхем»). Благодаря малым расстояниям между основными регистрами и кэш-памятью удается заметно снизить задержки при параллельном выполнении операций в процессорах. Во-вторых, архитектура сверхбольшого командного слова EPIC, выполняющая параллельно несколько команд. В-третьих, многопотоковоая обработка информации на основе параллелизма на уровне нитей. Суть заключается в загрузке конвейера более чем одним заданием. Если в обычном конвейере одно задание (нить)не в состоянии загрузить конвейер и ряд функциональных блоков в течение некоторых тактов остаются свободными, то в технологии TLP эти блоки загружаются операциями из других нитей.