- •Средства разработки параллельных и распределенных
- •План
- •Литература
- •Средства разработки
- •Поддержка параллелизма в языках программирования
- •Языки без поддержки параллелизма
- •Языки с явной поддержкой параллелизма
- •Языки с неявной поддержкой параллелизма
- •Компиляторы с автораспараллеливанием
- •Языки для создания распределнных программ
- •Средства отладки
- •Средства оптимизации
- •Параллельные математические библиотеки
- •Интерфейс операционных систем
- •Работа с процессами
- •Пример fork
- •Пример fork.c
- •Пример Exec
- •Пример exec
- •Наследование открытых файлов
- •Файловые операции
- •Файловые операции
- •Переназначение файлового дескриптора
- •Пример перенаправления ввода вывода
- •Пример выполнения
- •Взаимодействие между процессами
- •Конвейеры
- •Пример
- •Пример выполнения
- •Общая память
- •Функции работы с общей памятью
- •Пример работы с общей памятью
- •Пример выполнения
- •Семафоры
- •Функции работы с семафорами
- •Операции с семафорами
- •Пример программы работы c общей памятью и семафором
- •Вопросы ?
Средства отладки
Отладчики кода
Gdb, idb,
Почти все поддерживают многопоточность
Для распределенных программ необходимо запускать на нескольких машинах
Проверка кода
Позволяют установить возможные проблемы
Deadlock
Race
Intel thread checker
Средства оптимизации
Профилировщики
Сбор информации о процессе выполнения программы
Время выполнения каждой функции
Частота обращения к данным
Определение самых проблемных участков
Gprof
Net wampir – профилировщик для MPI программ
Оптимизаторы кода
Компиляторы с оптимизацией исполняемого кода
Оптимизаторы исходного кода
adaptor
Параллельные математические библиотеки
BLAS – basic linear algebra software
ATLAS – auto-tuning linear algebra software
SCALAPACK – параллельные библиотеки линейной алгебры
MKL – оптимизированные библиотеки для intel
Интерфейс операционных систем
Стандарт POSIX – portable operation system interface
Функции создания и работы с процессами
Функции работы с потоками
Функции работы с файлами
Функции работы с общей памятью
Функции взаимодействия по сети
Функции включены в стандартную библиотеку функций libc
Работа с процессами
Создание процессов
int fork() – создание копии программы
Для родительского процесса возвращается номер порожденного процесса
Для порожденного процесса возвращается 0
Выполнение программ
int execlp(const char *file, const char *arg, ...)
выполнение другой программы в контексте текущего процесса
Функция не возвращается, если не произошло ошибки
Пример fork
// fork.c
#include <unistd.h>
#include <stdio.h>
int main() {
int child = 0;
//до этого места была одна программа switch ( child = fork() ){
// две копии одной программы
case 0: //порожденный процесс попадает сюда printf("I am child\n");
break;
default: //родительскийпроцесс попадает сюда printf("I am parent, child pid=%d\n",child); break;
}
//здесь работают обе программы return 0;
}
Пример fork.c
[saa@cluster processes]$ gcc ./fork.c [saa@cluster processes]$ ./a.out
I am parent, child pid=26083 I am child
[saa@cluster processes]$
Пример Exec
// exec.c
#include <unistd.h>
#include <stdio.h>
int main() {
int child = 0;
//до этого места была одна программа switch ( child = fork() ){
// две копии одной программы
case 0: //порожденный процесс попадает сюда printf("I am child , executing ps\n"); execlp("ps","ps", NULL);
break;
default: //родительскийпроцесс попадает сюда printf("I am parent, child pid=%d\n",child); break;
}
//здесь работают обе программы return 0;
}
Пример exec
[saa@cluster processes]$ gcc ./exec.c [saa@cluster processes]$ ./a.out
I am parent, child pid=26206 I am child, executing ps [saa@cluster processes]$
PID TTY |
TIME CMD |
20979 pts/9 |
00:00:00 bash |
26118 pts/9 |
00:00:00 vim |
26206 pts/9 |
00:00:00 ps |
Наследование открытых файлов
После вызова fork() порожденный процесс по умолчанию наследует открытые родителем файлы
После вызова exec() новая программа наследует открытые файлы
Возможность перенаправления ввода/вывода