Параллельные аппаратные архитектуры и модели программирования Традиционная архитектура фон Неймана Расширение традиционной архитектуры Сопроцессоры Многоядерные процессоры Мультипроцессоры Мультикомпьютеры Параллелизм данных Параллелизм задач Распараллеливание на уровне процессов Распараллеливание на уровне потоков
ЦП ОЗУ Системная шина АЛУ УУ A2A2 ………………….. 35 ………………….. E7 ………………… XY A0A0 A1 FF К1 К2 К3 К4 КnКn CD/DVD дисковод HDD Модем Монитор Контроллеры Внешние устройства Традиционная архитектура фон Неймана
Расширение традиционной архитектуры Кэш 1-го, 2-го и 3-го уровней DRAM, шины, контроллеры (северный и южный мосты), тактовая частота шины памяти, пропускная способность, латентность. SRAM на плате процессора. Кэш данных и кэш команд. Конвейер Суперскалярная архитектура Сопроцессоры – операции с плавающей точкой, MMX. Видеокарта.
Устройство управления ПЭ … Соединительная сеть Разделяемая память SIMD (Single Instruction Stream – Multiple Data Stream) - один поток команд и несколько потоков данных А) Разделяемая память (Shared memory)
Устройство управления … Соединительная сеть ПЭ ЛП ПЭ ЛП ПЭ ЛП Б) Распределенная память (Distributed memory)
УУ АЛУ ЦПУ Потоки команд УУ АЛУ ЦПУ УУ АЛУ ЦПУ … Соединительная сеть Разделяемая память Потоки данных MIMD (Multiple Instruction Stream – Multiple Data Stream) - несколько потоков команд и несколько потоков данных А) Разделяемая память (Shared memory)
УУ АЛУ ЦПУ Потоки команд УУ АЛУ ЦПУ УУ АЛУ ЦПУ … Соединительная сеть ЛП Потоки данных Б) Распределенная память (Distributed memory)
Модель передачи сообщений – программа порождает несколько задач, каждой задаче присваивается уникальный идентификатор, обмен данными осуществляется посредством сообщений. Модель параллелизма данных – одна операция применяется к множеству элементов некоторой структуры данных. Модель разделяемой памяти – задачи имеют общее адресное пространство, в программе не описываются сообщения, важное место занимает синхронизация. Закон Амдала: где K – коэффициент ускорения (оценка эффективности), S - доля последовательной части программы, P – доля параллельной части программы, N – количество процессоров, необходимых для идеального распараллеливания. Некоторые модели параллельного программирования:
Интерфейс параллельного программирования MPI ( Message Passing Interface ). Пример программы: #include #define BUF_LEN 256 int main(int argc, char* argv[]){ int my_rank; int np; int src; int dest; int tag=0; char message[BUF_LEN]; MPI_Status status; test.c
MPI_Init(&argc,&argv); MPI_Comm_rank(MPI_COMM_WORLD,&my_rank); MPI_Comm_size(MPI_COMM_WORLD,&np); if(my_rank!=0){ sprintf(message, "A message from process %i.", my_rank); dest=0; MPI_Send(message, strlen(message)+1, MPI_CHAR,dest, tag, MPI_COMM_WORLD); } else{ for(src=1;src
Некоторые вызовы MPI: int MPI_Init(int* argc, char*** argv); //инициализация библиотеки MPI int MPI_Finalize(void); //освобождение ресурсов, необходимых MPI Коммуникатор – это идентификатор (объект типа MPI_Comm) группы порожденных программой параллельных процессов, которые могут обмениваться сообщениями. MPI_COMM_WORLD – идентификатор группы всех порожденных программой параллельных процессов. int MPI_Comm_size(MPI_Comm comm, int* size); - определяет число процессов в группе (коммуникаторе). int MPI_Comm_rank(MPI_Comm comm., int* rank); - определяет номер (ранг) процесса в группе.
int MPI_Ssend(void* buf, int buf_size, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm); - посылка сообщения (с уведомлением). buf – адрес буфера передаваемых данных, buf_size - количество элементов данного типа данных в буфере, datatype – тип передаваемых данных, dest – номер получателя в группе, tag – тег сообщения (данному получателю могут отправляться сообщения с разными тегами), comm – коммуникатор. int MPI_Recv(void* buf, int buf_size, MPI_Datatype datatype, int src, int tag, MPI_Comm comm, MPI_Status status); status – структура данных, содержащая информацию о сообщении.
Типы данных MPI: MPI_CHARsigned char MPI_INTsigned int MPI_LONGsigned long int MPI_DOUBLEdouble MPI_BYTEunsigned char …………………………………………………………… Реализации MPI: MPICH, OpenMPI. OpenMPI_v _win32. exe MPICH2: p?s=downloads p?s=downloads
>mpicxx test.c OpenMPI:
MPICH2: >cl test.c mpi.lib