Обзор компании Intel в рамках параллельного программирования

Информация - Компьютеры, программирование

Другие материалы по предмету Компьютеры, программирование

?ной памяти* pStr = (char*) malloc(20);c = pStr[0]; // Ошибка!

// Функция освобождения памяти не соответствует функции выделения

char *s = (char*)malloc(5);s;// Ошибка!

// Выход за пределы стекаstackUnderrun()

{array[10];(array, "my string");len = strlen(array);(array[len] != "Z") // Ошибка!-;

}

 

Ошибки многопоточности

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

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

 

// Поток A захватывает критическую секцию L1, затем ожидает критическую секцию L2

DWORD WINAPI threadA(LPVOID arg)

{(&L1);(&L2);(data1, data2);(&L2);(&L1);

return(0);

}

// Поток В захватывает критическую секцию L2, затем ожидает секцию L1

DWORD WINAPI threadB(LPVOID arg)

{(&L2);(&L1);(data2, data1) ;(&L1);(&L2);(0);

}

 

Intel Parallel Amplifier

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

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

Concurrency-анализ. Почему моя программа плохо параллелится? Бывает, что независимо от того, насколько продвинута параллельная инфраструктура приложения, ожидаемый прирост производительности при переходе например от 4-ядерной системе к 8-ядерной так и не достигается. Поэтому тут нужна оценка эффективности параллельного кода, которая дала бы представление о том, на сколько полно используются ресурсы микропроцессора.

Lock & Wait - анализ. Где моя программа простаивает в ожидании синхронизации или операции ввода-вывода? Поняв, что наша программа плохо масштабируется, мы хотим найти, где именно и какие именно объекты синхронизации стали на пути к хорошей параллельности.

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

 

Обзор Cilk и Intel Cilk Plus

- язык параллельного программирования.

Разрабатывался с 1994 года в лаборатории Информатики MIT. Основан на языке ANSI C, с добавлением небольшого количества ключевых слов Cilk. Позже был расширен на Си++, в виде Cilk++ - коммерческого продукта, разрабатываемого компанией Cilk Arts.

В 2009 году компанией Cilk Arts было объявлено о том, что все её продукты и сама команда разработчиков становятся частью корпорации Интел.

Intel Cilk Plus является расширением языка С++, которое упрощает разработку приложений, параллельных по задачам и данным в системах с общей памятью. Задачи могут быть реализованы в виде отдельных функций или итераций цикла. При этом система исполнения автоматически распределяет их по доступным ядрам.Plus включает четыре основные компоненты:

Ключевые слова (cilk_for, cilk_spawn, cilk_sync). Эти конструкции предоставляют мощный инструмент для организации параллелизма по задачам.

Гипер-объекты или преобразователи (reducers). Устраняют конкуренцию за переменные, разделяемые между задачами, автоматически создавая представление этих переменных для каждой задачи и собирая их обратно в разделяемое значение по завершении всех задач.

Специальное представление массивов (C/C++ Extensions for Array Notation (CEAN)). Данный компонент обеспечивает параллелизм по данным (векторизацию) для всего массива или его частей при выполнении однотипной операции со всеми его элементами.

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

Таким образом, разработчики Cilk Plus предоставляют средства для организации циклического и рекурсивного (разделяй и властвуй) параллелизма.

 

GNU Compiler Collection (GCC)

Compiler Collection (обычно используется сокращение GCC) - набор компиляторов для различных языков программирования, разработанный в рамках проекта GNU. GCC является свободным программным обеспечением, распространяется фондом свободного программного обеспечения (FSF) на условиях GNU GPL и GNU LGPL и является ключевым компонентом GNU toolchain. Он используется как стандартный компилятор для свободных UNIX-подобных операционных систем.

Изначально названный GNU C Compiler, он поддерживал только язык Си. Позднее, GCC был расширен для компиляции исходных кодов на таких языках программирования как C++, Objective-C, Java, Фортран и Ada.

Языки:

В версии 4.1.1 (выпущенной 24 мая 2006), стандартный компилятор включал в себя front-endы для:(GCC для Ada, или GNAT)

Си++ (C++ для GCC, или G++)

Фортран (GCC для Fortran, или gfortran)(GCC для Java, или GCJ)

Objective-C (GCC для Objective-C, или gobjc)C++ (GCC для Objective-C++, или gobjc++)

Go (GCC для Go, или gccgo) (с версии 4.6[4])end для CHILL был добавлен ранее, но из-за недостаточной поддержки был исключён из набора. До релиза версии 4.0 front-endом д