Паралельная обработка информации. Классификация вычислительных систем с параллельной обработкой информации.
Общий метод увеличения производительности – организация параллельной обработки информации, т. е. одновременное решение задач или совмещение во времени этапов решения одной задачи.
Способы организации. Во всем многообразии способов организации параллельной обработки можно выделить три основных направления:
• совмещение во времени различных этапов разных задач;
• одновременное решение различных задач или частей одной задачи;
• конвейерная обработка информации.
Первый путь – совмещение во времени этапов решения разных задач – это мультипрограммная обработка информации. Мультипрограммная обработка возможна даже в однопроцессорной ЭВМ и широко используется в современных СОД. Второй путь – одновременное решение различных задач или частей одной задачи – возможен только при наличии нескольких обрабатывающих устройств. При этом используются те или иные особенности задач или потоков задач, что позволяет осуществить тот или иной параллелизм. Идея конвейерной обработки заключается в выделении отдельных этапов выполнения общей операции, причем каждый этап, выполнив свою работу, передавал бы результат следующему, одновременно принимая новую порцию входных данных. Получаем очевидный выигрыш в скорости обработки за счет совмещения прежде разнесенных во времени операций.
Классификация систем параллельной обработки данных
Параллельные ЭВМ часто подразделяются по классификации Флинна на машины типа SIMD (Single Instruction Multiple Data - с одним потоком команд при множественном потоке данных) и MIMD (Multiple Instruction Multiple Data- с множественным потоком команд при множественном потоке данных).Можно выделить четыре основных типа архитектуры систем параллельной обработки:
1) Конвейерная и векторная обработка.
Основу конвейерной обработки составляет раздельное выполнение некоторой операции в несколько этапов (за несколько ступеней) с передачей данных одного этапа следующему. Производительность при этом возрастает благодаря тому, что одновременно на различных ступенях конвейера выполняются несколько операций. Конвейеризация эффективна только тогда, когда загрузка конвейера близка к полной, а скорость подачи новых операндов соответствует максимальной производительности конвейера. Если происходит задержка, то параллельно будет выполняться меньше операций и суммарная производительность снизится. Векторные операции обеспечивают идеальную возможность полной загрузки вычислительного конвейера.
При выполнении векторной команды одна и та же операция применяется ко всем элементам вектора (или чаще всего к соответствующим элементам пары векторов).
2) Машины типа SIMD.
SIMD компьютер имеет N идентичных процессоров, N потоков данных и один поток команд. Каждый процессор обладает собственной локальной памятью. Процессоры интерпретируют адреса данных либо как локальные адреса собственной памяти, либо как глобальные адреса, возможно, модифицированные добавлением локального базового адреса. Процессоры получают команды от одного центрального контроллера команд и работают синхронно, то есть на каждом шаге все процессоры выполняют одну и ту же команду над данными из собственной локальной памяти.
Машины типа SIMD состоят из большого числа идентичных процессорных элементов, имеющих собственную память. Все процессорные элементы в такой машине выполняют одну и ту же программу.
3) Машины типа MIMD.
MIMD компьютер имеет N процессоров, независимо исполняющих N потоков команд и обрабатывающих N потоков данных. Каждый процессор функционирует под управлением собственного потока команд, то есть MIMD компьютер может параллельно выполнять совершенно разные программы.
4) Многопроцессорные машины с SIMD-процессорами.
Многие современные супер-ЭВМ представляют собой многопроцессорные системы, в которых в качестве процессоров используются векторные процессоры или процессоры типа SIMD. Такие машины относятся к машинам класса MSIMD.
Одной из отличительных особенностей многопроцессорной вычислительной системы является сеть обмена, с помощью которой процессоры соединяются друг с другом или с памятью.
Процессоры с сокращенным набором команд (RISC) и с полным набором команд (CISC). Примеры.
RISC - Это концепция проектирования процессоров, которая во главу ставит следующий принцип: более компактные и простые инструкции выполняются быстрее.
Первые RISC-процессоры были разработаны в начале 1980-х годов в Стэнфордском и Калифорнийском университетах США. Они выполняли небольшой (50−100) набор команд, тогда как обычные CISC (Complex Instruction Set computer) выполняли 100—200.
Характерные особенности RISC-процессоров:
1 Фиксированная длина машинных инструкций (например, 32 бита) и простой формат команды.
2 Специализированные команды для операций с памятью — чтения или записи. Операции вида «прочитать-изменить-записать» отсутствуют. Любые операции "изменить" выполняются только над содержимым регистров (т.н. load-and-store архитектура).
3 Большое количество регистров общего назначения (32 и более).
4 Отсутствие микропрограмм внутри самого процессора. То, что в CISC процессоре исполняется микропрограммами, в RISC процессоре исполняется как обыкновенный (хотя и помещенный в специальное хранилище) машинный код, не отличающийся принципиально от кода ядра ОС и приложений.
5 Для обращения имеется во внешней памяти несколько команд
6 Аппаратное исполнение многих операций.
7 Суперскалярные архитектуры (Распараллеливание исполнения команд между несколькими устройствами исполнения, причем решение о параллельном исполнении двух или более команд принимается аппаратурой процессора на этапе исполнения)
8 конвейерный порядок выполнения команд
Недостатки:
1) не дает желаемого эффекта, если выполняемая программа содержит много ветвлений
2) при организации прерываний работа конвейеров становится менее эффективной.
В настоящее время многие архитектуры процессоров являются RISC-подобными, к примеру, ARM, DEC Alpha, SPARC, AVR, MIPS, POWER и PowerPC. Наиболее широко используемые в настольных компьютерах процессоры архитектуры x86 ранее являлись CISC-процессорами, однако новые процессоры, начиная с Intel486DX, являются CISC-процессорами с RISC-ядром. Они непосредственно перед исполнением преобразуют CISC-инструкции процессоров x86 в более простой набор внутренних инструкций RISC.
CISC (англ. Complex Instruction Set Computing) — концепция проектирования процессоров, которая характеризуется следующим набором свойств:
Нефиксированным значением длины команды.
Арифметические действия, кодируется в одной инструкции.
Небольшим числом регистров, каждый из которых выполняет строго определённую функцию.
большое количество методов адресации;
большое количество форматов команд различной разрядности;
преобладание двухадресного формата команд; наличие команд обработки типа регистр-память.
Лидером в разработке микропроцессоров c полным набором команд (CISC - Complete Instruction Set Computer) считается компания Intel со своей серией x86 и Pentium. Эта архитектура является практическим стандартом для рынка микрокомпьютеров.
(исключая современные Intel Pentium 4, Pentium D, Core, AMD Athlon, Phenom, которые являются гибридными) и процессоры Motorola MC680x0.
Синтаксис языка Си
стал основой для многих других языков. Для языка Си характерны лаконичность, современный набор конструкций управления потоком выполнения, структур данных и обширный набор операций.
Основные синтаксические правила записи программы на С:
- Прописные и строчные буквы считаются разными символами. Поэтому, переменные A1 и a1 будут совершенно разными. При записи можно использовать латинские буквы, цифры, символ подчеркивания. Нельзя начинать идентификатор с цифры и внутри не может содержатся пробел. Длина идентификатора неограничен.
- Многострочные комментарии в тексте заключаются в скобки вида /*текст комментария*/. Комментарий на одну строку начинается с символов “//” и знак действует только до конца текущей строки.
- Каждое предложение языка заканчивается символом “;”
- В строке может размещаться несколько операторов;
- Группу операторов можно объединять в один оператор заключая их в фигурные скобки { }.
- Все используемые типы, константы, переменные, функции должны быть объявлены или описаны до их первого использования. Объявление моно выполнить в любом месте текста программы.
Программа на С состоит из объявлений (переменных, типов, классов, функций) и описаний функций. Среди функций всегда имеется главная main для консольных приложений или WinMain для приложений Windows. Именно эта главная функция выполняется в начале работы программы. Программы строятся по модульному принципу и состоят из множества модулей Для каждой формы создается отдельный модуль. Именно в модулях и решаются программные задачи. В заголовочный файл с расширением .h размещаются объявление классов, функций, переменных и т.д. В файле реализации с расширением .cpp содержатся описания функций. После того как программа написана на ее основе формируется исполняемый модуль – файл с расширением .exe. Его можно загружать на выполнение.
Директивы препроцессора, такие как #define и #ifdef, обычно используются для того, чтобы облегчить изменение исходного кода программ и их компиляцию в разных средах выполнения. Директивы в файле исходного кода позволяют препроцессору выполнять определенные действия. Например, препроцессор может заменять токены в тексте, вставлять содержимое других файлов в файл исходного кода или отключать компиляцию части файла путем удаления разделов текста. Строки препроцессора распознаются и выполняются до расширения макросов. Поэтому если макрос разворачивается в нечто, похожее на команду препроцессора, эта команда не распознается препроцессором.
В операторах препроцессора используется тот же набор символов, что и в операторах файла исходного кода, но escape-последовательности не поддерживаются. Набор символов в операторах препроцессора совпадает с кодировкой выполнения. Препроцессор также распознает отрицательные значения символов.
Препроцессор распознает следующие директивы:
Знак решетки (#) должен быть первым непробельным символом в строке, содержащей директиву; между знаком решетки и первой буквой директивы пробельные символы допускаются. Некоторые директивы содержат аргументы или значения. Любой текст, следующий после директивы (за исключением аргумента или значения, представляющих собой часть директивы), должен предваряться разделителем однострочного комментария (//) или заключаться в разделители комментариев (/* */). Строки, содержащие директивы препроцессора, можно продолжать, ставя непосредственно перед маркером конца строки обратную косую черту (\).