Вы находитесь на странице: 1из 12

МИНИСТЕРСТВО ПО РАЗВИТИЮ ИНФОРМАЦИОННЫХ

И КОММУНИКАЦИОННЫХ ТЕХНОЛОГИИ РЕСПУБЛИКИ


УЗБЕКИСТАН
ТАШКЕНТСКИЙ УНИВЕРСИТЕТ ИНФОРМАЦИОННЫХ
ТЕХНОЛОГИИ ИМЕНИ МУХАММАДА АЛ-ХОРЕЗМИ

Практическая работа № 9-12

Выполнила: Арепбаева Асемай


Принял: Яхшибоев Рустам

Ташкент – 2022г.

Алгоритмы работы нейрокомпьютеров


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

Нейросетевая тематика является междисциплинарной, что обусловило


значительные разночтения в общих терминологических подходах.
Нейросетевой тематикой занимаются как разработчики вычислительных
систем и программисты, так и специалисты в области медицины, финансово-
экономические работники, химики, физики и т.п. (т.е. все кому не лень). То,
что понятно физику, совершенно не принимается медиком и наоборот – все
это породило многочисленные споры и целые терминологические войны по
различным направлениям применения всего где есть приставка нейро.

Нейрокомпьютеры отличаются от ЭВМ предыдущих и поколений не


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

Вычисления в нейронных сетях существенно отличаются от


традиционных, в силу высокой параллельности их можно рассматривать как
коллективное явление. В нейронной сети нет локальных областей, в которых
запоминается конкретная информация. Вся информация запоминается во
всей сети.
Толчком к развитию нейрокомпьютинга послужили биологические
исследования. По данным нейробиологии нервная система человека и
животных состоит из отдельных клеток - нейронов. В мозге человека их
число достигает 1.0e10 - 1.0e12. Каждый нейрон связан с 1.0e3 - 1.0e4
другими нейронами и выполняет сравнительно простые действия. Время
срабатывания нейрона - 2-5 мс. Совокупная работа всех нейронов
обуславливает сложную работу мозга, который в реальном времени решает
сложнейшие задачи. Отличия нейрокомпьютеров от вычислительных
устройств предыдущих поколений:

 параллельная работа очень большого числа простых вычислительных


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

Нейронные сети находят свое применение в системах распознавания


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

В настоящее время наиболее массовым направлением


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

В основу искусственных нейронных сетей положены следующие черты


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

 простой обрабатывающий элемент - нейрон;


 очень большое число нейронов участвует в обработке информации;
 один нейрон связан с большим числом других нейронов (глобальные
связи);
 изменяющиеся веса связей между нейронами;
 массированная параллельность обработки информации.

Поведение искусственной нейронной сети зависит как от значения


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

Для сигмоидальных элементов в зависимости от входного сигнала, выход


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

Нейрокомпьютеры являются перспективным направлением развития


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

Изучение структуры и работы пакета OpenMP

Интерфейс OpenMP задуман как стандарт для программирования на


масштабируемых SMP-системах (SSMP,ccNUMA, etc.) в модели общей
памяти (shared memory model). В стандарт OpenMP входят спецификации
набора директив компилятора, процедур и переменных среды.

Примерами систем с общей памятью, масштабируемых до большого


числа процессоров, могут служить суперкомпьютеры Cray Origin2000 (до 128
процессоров), HP 9000 V-class (до 32 процессоров в одном узле, а в
конфигурации из 4 узлов - до 128 процессоров), Sun Starfire (до 64
процессоров).

Разработкой стандарта занимается организация OpenMP ARB


(ARchitecture Board), в которую вошли представители крупнейших компаний
- разработчиков SMP-архитектур и программного обеспечения.
Спецификации для языков Fortran и C/C++ появились соответственно в
октябре 1997 года и октябре 1998 года.

До появления OpenMP не было подходящего стандарта для эффективного


программирования на SMP-системах.
Наиболее гибким, переносимым и общепринятым интерфейсом
параллельного программирования является MPI (интерфейс передачи
сообщений). Однако модель передачи сообщений 1) недостаточно
эффективна на SMP-системах; 2) относительно сложна в освоении, так как
требует мышления в "невычислительных" терминах.

Проект стандарта X3H5 провалился, так как был предложен во время


всеобщего интереса к MPP-системам, а также из-за того, что в нем
поддерживается только параллелизм на уровне циклов. OpenMP развивает
многие идеи X3H5.

POSIX-интерфейс для организации нитей (Pthreads) поддерживается


широко (практически на всех UNIX-системах), однако по многим причинам
не подходит для практического параллельного программирования:

1. нет поддержки Fortran-а,


2. слишком низкий уровень,
3. нет поддержки параллелизма по данным,
4. механизм нитей изначально разрабатывался не для целей организации
параллелизма.

OpenMP можно рассматривать как высокоуровневую надстройку над


Pthreads (или аналогичными библиотеками нитей).

Многие поставщики SMP-архитектур (Sun,HP,SGI) в своих компиляторах


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

1. За счет идеи "инкрементального распараллеливания" OpenMP


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

2. При этом, OpenMP - достаточно гибкий механизм, предоставляющий


разработчику большие возможности контроля над поведением параллельного
приложения.

3. Предполагается, что OpenMP-программа на однопроцессорной платформе


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

4. Одним из достоинств OpenMP его разработчики считают поддержку так


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

Выполнение алгоритмов на базе пакета


OpenMP

Модель выполнения OpenMP


Функции OpenMP носят скорее вспомогательный характер, так как
реализация параллельности осуществляется за счет использования директив.
Однако в ряде случаев они весьма полезны и даже необходимы. – Функции
исполняющей среды – Функции блокировки/синхронизации – Функции
работы с таймерами. Все эти функции имеют имена, начинающиеся с omp_, и
определены в заголовочном файле omp.h.

Директивы. 1.Конструкция #pragma в языке Си/Си++ используется для


задания дополнительных указаний компилятору. 2. С помощью этих
конструкций можно указать как осуществлять выравнивание данных в
структурах, запретить выдавать определенные предупреждения и так далее.
3. Форма записи: #pragma директивы.

Видимость данных

● Все данные имеют "метки": – Метка "Private" видима только одному


потоку ⇨

● Изменения в переменной локальны и не видны другим потокам


● Пример — локальная переменная в функции, которая исполняется
параллельно – Метка "Shared" видима всем потокам ⇨

● Изменения в переменной видны всем потокам

● Пример — глобальные данные

Области видимости переменных


● Переменные, объявленные вне параллельного блока, определяются
параметрами директив OpenMP:

– private
– firstprivate
– lastprivate
– shared
– default
– reduction
– threadprivate
– copying

Реализация примеров с использованием Open

Терминология
● OpenMP Team := Master + Workers
● Параллельный регион — блок кода, который всеми потоками исполняется
одновременно
● Поток мастер (master thread) имеет ID 0
● Все потоки синхронизируются при выходе из параллельного региона
● Параллельные регионы могут быть вложены, но поведение зависит от
реализации
● Работа в параллельном регионе распределяется между всеми потоками

Директива parallel
● Создает параллельный регион для следующего за ней структурированного
блока, например: #pragma omp parallel [другие директивы]
структурированный блок

● Директива parallel указывает, что структурный блок кода должен быть


выполнен параллельно в несколько потоков (нитей, threads). Каждый из
созданных потоков выполнит одинаковый код содержащийся в блоке, но не
одинаковый набор команд. В разных потоках могут выполняться различные
ветви или обрабатываться различные данные, что зависит от таких
операторов как if-else или использования директив распределения работы.
#pragma omp parallel

Клаузы
● if (условие) – выполнение параллельной области по условию. Вхождение в
параллельную область осуществляется только при выполнении некоторого
условия. Если условие не выполнено, то директива не срабатывает и
продолжается обработка программы в прежнем режиме;

● num_threads (целочисленное выражение) – явное задание количества нитей,


которые будут выполнять параллельную область; по умолчанию выбирается
последнее значение, установленное с помощью функции
omp_set_num_threads(), или значение переменной OMP_NUM_THREADS;

● default(shared|none) – всем переменным в параллельной области, которым явно


не назначен класс, будет назначен класс shared; none означает, что всем
переменным в параллельной области класс должен быть назначен явно;

● private (список) – задаёт список переменных, для которых порождается


локальная копия в каждой нити; начальное значение локальных копий
переменных из списка не определено;

● firstprivate (список) – задаёт список переменных, для которых порождается


локальная копия в каждой нити; локальные копии переменных
инициализируются значениями этих переменных в нити-мастере; #pragma
omp parallel

Клаузы

● shared (список) – задаёт список переменных, общих для всех нитей;

● copyin (список) – задаёт список переменных, объявленных как threadprivate,


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

● reduction (оператор:список) – задаёт оператор и список общих


переменных; для каждой переменной создаются локальные копии в каждой
нити; локальные копии инициализируются соответственно типу оператора
(для аддитивных операций – 0 или его аналоги, для мультипликативных
операций – 1 или её аналоги); над локальными копиями переменных после
выполнения всех операторов параллельной области выполняется заданный
оператор; оператор это: +, *, -, &, |, ^, &&, ||; порядок выполнения
операторов не определён, поэтому результат может отличаться от запуска к
запуску.

Вам также может понравиться