При каком виде программирования можно наиболее эффективно использовать многоядерные процессоры

Обновлено: 07.07.2024

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

Подход многоядерного программирования может помочь когда:

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

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

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

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

Чтобы смоделировать одновременно выполняющуюся систему, см. Инструкции по Разделению.

Типы параллелизма

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

Параллелизм данных

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



Временем, потраченным на цикл процессора, известный как время цикла, является t = tF .

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

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

Параллелизм задачи

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

Рассмотрите систему, которая включает четыре функции. Функции, которые F2a () и F2b () параллельно, то есть, они могут запуститься одновременно. В параллелизме задачи можно разделить расчет на две задачи. Функциональный F2b () работает на отдельном процессорном узле после того, как это получает данные Out1 от Задачи 1, и это выводит назад к F3 () в Задаче 1.


Рисунок показывает схему синхронизации для этого параллелизма. Задача 2 не запускается, пока это не получает данные Out1 от Задачи 1. Следовательно, эти задачи не запускаются полностью параллельно. Время, потраченное на цикл процессора, известный как время цикла,

t = tF1 + макс. (tF2a, tF2b) + tF3.


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

Выполнение трубопровода модели (конвейеризация)

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

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


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

t = макс. (Task1, Task2, Task3) = макс. (tF1, tF2a, tF2b, tF3).


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

Системное разделение для параллелизма

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

Рассмотрите эту систему. F1–F6 являются функциями системы, которая может быть выполнена независимо. Стрелка между двумя функциями указывает на зависимость по данным. Например, выполнение F5 имеет зависимость по данным от F3.

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


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

Проблемы в многоядерном программировании

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

Планирование задач, которые выполняются на встроенном многоядерном процессоре системы обработки

Передачи данных к и от различных процессорных узлов

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

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

Мобильность: развертывание на различных архитектурах

Аппаратная конфигурация, которая запускает развертываемое приложение, известна как архитектуру. Это может содержать многоядерные процессоры, многопроцессорные системы, FPGAs или комбинацию их. Развертывание того же приложения к различным архитектурам может потребовать усилия из-за:

Различный номер и типы узлов процессора на архитектуре

Коммуникация и стандарты передачи данных для архитектуры

Стандарты для определенных событий, синхронизации и защиты данных в каждой архитектуре

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

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

КПД развертывания

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

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

Циклическая зависимость по данным

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

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

При переходе с одноядерных процессоров на многоядерные системы приходится принимать во внимание проблему последовательного выполнения. В многоядерной системе выполнение считается последовательным, когда одно или более ядер в какой-то момент не могут выполнять код параллельно с другими ядрами. Эта ситуация может возникнуть по разным причинам: ситуации блокировки при доступе к ресурсам, необходимость синхронизации процессов или потоков на различных ядрах, поддержание когерентности кэш-памяти и неравномерность загрузки [90].

Блокировки возникают из-за невозможности одновременного доступа приложений на разных ядрах к таким ресурсам, как жесткий диск , некоторые устройства ввода/вывода, прикладные данные в определенных ситуациях (например, в момент "сборки мусора").

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

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

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

При переходе на многоядерную архитектуру возникает необходимость поддержания когерентности (согласованности) кэш-памяти для всех ядер при использовании так называемой разделяемой памяти ( shared memory ). Для ускорения доступа к разделяемой памяти может применяться кэш- память . Теперь в дополнение к поддержанию когерентности между основной памятью и кэш-памятью каждого отдельного ядра (с помощью методов write through, write back и других) необходимо в каждый момент времени поддерживать когерентность основной памяти и кэш­памяти всех ядер, использующих эту разделяемую память при любых операциях чтения-записи. Как правило, эта проблема решается на аппаратном уровне.

Параллельная обработка имеет две разновидности: конвейерность и собственно параллельность. В том и другом случаях предполагается архитектурное вычленение из системы отдельных физических компонентов.

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

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

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

  • специализация (применение внутри процессоров блоков, оптимизированных под определенный вид вычислений, например математических сопроцессоров );
  • кэширование;
  • спекулятивные вычисления.

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

Архитектурные усовершенствования привели относительно однородную ИТ-индустрию к грани разделения на более мелкие области. Это вызвано тем, что физическое распараллеливание не работает в произвольном классе задач: увеличение разрядности процессора, применение гиперпотоковости ( Hyper-Threading ) и многоядерности могут дать эффект, противоположный ожидаемому, т. е. после распараллеливания время исполнения программы даже увеличится.

Не всякая задача допускает физическое распараллеливание [6]. Целые классы задач (например, быстрое Фурье-преобразование, обработка запроса к базе данных, быстрые алгоритмы сортировок и т. п.) не получают заметного выигрыша от распараллеливания либо не распараллеливаются в принципе. У разработчиков появляется альтернатива — вместо изменения структуры программы уделять больше внимания локальной оптимизации кода. До некоторого предела это окажется рабочим вариантом, причем будет поддержано ростом интереса к средствам разработки, ориентированным на высокоскоростное исполнение в рамках однопроцессорной архитектуры [89, 90].

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

Не вполне ясен вопрос объектно-ориентированного программирования: нет исследований по совместимости объектно-ориентированного программирования с многоядерной архитектурой процессора. Текущий стандарт ISO на Си ++ обходит стороной физический параллелизм (Intel пишет специализированные библиотеки на "чистом" Си ).

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

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

Главной тенденцией программирования в ближайшее время станет создание новых языков и техник, совмещающих удобство разработки и физический параллелизм исполнения. Этого удастся добиться только за счет решения вопросов, связанных с физическим параллелизмом. Существующие решения типа pthread и OpenMP можно расценивать лишь как паллиатив. Ручное управление физическим параллелизмом ( explicit parallelism ) отбрасывает программирование назад, в эпоху машинных кодов и ассемблеров, реанимируя привязанность структуры программы к физической архитектуре вычислительной платформы. Следует сказать, что для встраиваемых систем, особенно связанных с обработкой сигналов, мультимедийной информации, так называемых " software radio " систем и для других подобных задач ручное распараллеливание дает неплохие результаты. Это возможно благодаря использованию конфигурируемых программных модулей, привязанных к определенному ядру или группе ядер, благодаря связке компиляторов для многоядерных процессоров со средами визуального программирования и средствами визуального представления процессов (например, Lab View, Ratitional Rapsody).

Автоматическое распараллеливание ( implicit parallelism ) для многоядерных архитектур в большинстве случаев обеспечивает ускорение лишь с некоторой вероятностью. Промежуточным решением могут быть реконфигурируемые библиотеки (Integrated Performance Primitives , Math Kernel Library ).

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

Другая возможность — попытаться адаптировать к многоядерным ар­хитектурам существующие техники и языки многопоточной организации программ. Опыт применения языка Рефлекс в многопроцессорных системах показывает, что такое вполне допустимо. Правда, появляющиеся при этом сущности означают достаточно радикальное изменение программ на уровне машинных команд. Например, происходит очевидный отказ от использования стека при организации структуры программы. При создании программ меняется и восприятие процесса программирования: классические функции дополнены процессами, которые при их запуске порождают отдельный независимый поток команд и данных [90, 91].

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

При программировании многоядерных процессоров могут применяться следующие модели или их комбинации [89-90-91-92-93-94]:

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

Модель выгрузки функций (function offload model)

Модель выгрузки функций является наиболее простой в реализации.

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

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

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

Физический параллелизм предназначен для получения результата по входным данным за кратчайшее время.

При каком виде программирования можно наиболее эффективно использовать многоядерные процессоры?

1) Параллельном ; 2) Логическом ; 3) Динамическом ; 4) Объектно - ориентированном.


Правельный ответ Динамическом


Динамическое программирование 1) + 1 2) + 10 Получение из числа 35 - 57, какое колличество команд?

Динамическое программирование 1) + 1 2) + 10 Получение из числа 35 - 57, какое колличество команд?


Anya170198 18 авг. 2019 г., 04:59:11 | 10 - 11 классы

1. Базовым понятием объектно - ориентированного программирования является 1) метод 2) поле 3) ориентация 4) объект 2?

1. Базовым понятием объектно - ориентированного программирования является 1) метод 2) поле 3) ориентация 4) объект 2.

Объектно - ориентированное программирование - это : 1) программирование объектов 2) метод программирования, суть которого состоит в разработке программы в виде взаимодействующих объектов 3) программирование на объектно - ориентрованных языках программирования 3.

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

Укажите типы числовых переменных, принимающих только целые значения : 1) string ; 2) Long ; 3) Double ; 4) Single ; 5.

Укажите тип переменной которой соответствует логическое значение True или False : 1) Integer 2) Byte 3) Boolean 4) string 6.

Что изменяет операция присваивания?

1) значение переменной 2) имя переменной 3) тип алгоритма 4) тип переменной 5) не изменяет ничего 7.

Среди приведенных записей укажите те, которые могут быть именами переменных : 1) sngSum 2) Dim 3) intX124 4) B& ; 5) inta * a 6) EK.

Каково будет значение переменной после выполнения операций присваивания : intX = 5 intX = intX + intX 1) 5 2) 15 3) 25 4) 10 9.

Значение переменных в оперативной памяти Имя переменной Значение переменной Тип переменной A 255 B - 32768 C 3.

14 D “информатика” G True 10.

Объявите переменную А и присвойте значение 155 :


Процессор обрабатывает информацию : a?

Процессор обрабатывает информацию : a.

В десятичной системе счисления b.

В двоичных кодах c.

На языке программирования d.

В текстовом виде.


К какому виду программного обеспечения относится текстовый процессор?

К какому виду программного обеспечения относится текстовый процессор.


К какому виду программного обеспечения относиться текставой процессор?

К какому виду программного обеспечения относиться текставой процессор.


Помогите плиз Почему современные пользовательские интерфейсы можно считать объектно - ориентированными?

Помогите плиз Почему современные пользовательские интерфейсы можно считать объектно - ориентированными?


Sofkaero1512 27 мая 2019 г., 12:12:49 | 5 - 9 классы

Какое наиболее эффективное средство для защиты от сетевых атак?

Какое наиболее эффективное средство для защиты от сетевых атак?


Виды логических схем?

Виды логических схем.


Leshaagapov 13 авг. 2019 г., 16:24:21 | 5 - 9 классы

Чему равносильно логическое выражение А& ; А(с чертой)?

Чему равносильно логическое выражение А& ; А(с чертой).

Чему равносильно логическое выражение А(с чертой).

Чему равносильно логическое выражение АVА(с чертой).

Какое устройство пк предназначена для вывода информаций?

(процессор или монитор)

Характеристиками этого устройства является тактовая частота , разрядность , производительность?


Bratchenyadima 12 апр. 2019 г., 05:19:23 | 5 - 9 классы

Чем будет отличаться упрощенная логическая схема двухъядерного процессора от упрощённой логической схемы одноядерного процессора?

Чем будет отличаться упрощенная логическая схема двухъядерного процессора от упрощённой логической схемы одноядерного процессора?

Информатика, 10 класс.


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


Ответ : 51362Объяснение : Почтовый адрес состоит из имени, "@" и сервера на котором он расположен. Сначала указывается имя - teacher, потом ставим символ "@" и указываем сервер на котором находится почта - shkola1. Mos. ruПолный адрес будет иметь в..


Для длительного запоминания вещей.


1 БАЙТ РАВЕН 8 БИТ, А ДАЛЬШЕ САМ)))).



Всем привет. Я хочу поделиться с вами некоторые мыслии мои))) . Я думаю что , в будущем будут очень классные компьютеры! Мне кажется будут компьютеры без клавиатуры. Например ты скажешь напиши слово "Информатика" и на компьютере будет написано Ин..


При умножении на 2 произойдёт сдвиг в сторону старших разрядов. 10101010 – 00000001 ________ 01010101 Умножаем на 2 и получаем исходное число : 10101010 Вычитание единицы осуществляется прибавлением числа 11111111. Итого : 170.


Решения на фото. Записывай остатки с конца и получишь в двоичной системе числа.


PDF (аббревиатура от англ. Portable Document Format, произносится пи - ди - эф) — кроссплатформенный формат электронных документов, созданный фирмой Adobe Systems с использованием ряда возможностей языка PostScript.

image001.jpg

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

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

image002.jpg

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

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

Программирование на LabVIEW подразумевает создание графического кода (G) в виде диаграммы, что является существенным отличием от традиционных текстовых языков. Подобный подход называется потоковым программированием. Вместо последовательности выполняющихся друг за другом команд, код на LabVIEW представляет данные и операции, которые соединяются между собой, а компилятор LabVIEW автоматически определяет последовательность выполнения команд. Это также означает, что два параллельных участка кода (ветви диаграммы) независимы и могут быть выполнены на разных ядрах процессора.

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

image003.jpg

Рис. 2. Независимые участки кода могу выполняться одновременно

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


Ручное создание потоков

Способность LabVIEW автоматически создавать и управлять потоками, используя преимущества многоядерных систем, не означает, что у разработчика не остается контроля над потоками. К примеру, вам может потребоваться изолировать в отдельном высокоприоритетном потоке задачу мониторинга аварийного состояния. Структура Timed Loop, осуществляющая хронометраж выполняемого в ее теле кода, создает один поток для содержащегося в ней кода и позволяет указать конкретное ядро для выполнения кода в процессе разработки или выполнения программы. Таким образом LabVIEW позволяет сконцентрировать усилия на предметной области задачи, беря на себя заботу об организации кода для многоядерной системы и в то же время оставляя возможность низкоуровневого управления в случае необходимости.


Интуитивно понятное представление параллельных участков кода

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

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

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


Параллелизм задач

Параллелизм задач подразумевает, что несколько операций могут быть выполнены независимо друг от друга. На рис. 3 приведен пример подобных задач: операции фильтрации сигнала и БПФ независимы, а следовательно могут быть выполнены на многоядерных процессорах одновременно.

image004.jpg

Параллелизм данных

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

image005.jpg

Конвейеризация задач

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

image006.jpg

Рис. 5. Пример конвейеризации задач

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


Мощные графические инструменты отладки

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

Читайте также: