Параллельные аппаратные архитектуры и модели программирования • • • • • • Традиционная архитектура фон Неймана Расширение традиционной архитектуры Сопроцессоры Многоядерные процессоры Мультипроцессоры Мультикомпьютеры • Параллелизм данных • Параллелизм задач • Распараллеливание на уровне процессов • Распараллеливание на уровне потоков Традиционная архитектура фон Неймана ЦП АЛУ ОЗУ УУ ………………….. ………………….. XY ………………….. 00 01 Системная шина A2 0011 0101 1110 0111 A0 A1 35 E7 XY ………………….. ………………….. FF К1 CD/DVD дисковод К3 К2 HDD Модем К4 Кn Контроллеры Монитор Внешние устройства Расширение традиционной архитектуры Кэш 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) ЦПУ УУ ЦПУ ЦПУ УУ УУ Потоки команд АЛУ АЛУ ЛП ЛП … АЛУ ЛП Потоки данных Соединительная сеть Некоторые модели параллельного программирования: Модель передачи сообщений – программа порождает несколько задач, каждой задаче присваивается уникальный идентификатор, обмен данными осуществляется посредством сообщений. Модель параллелизма данных – одна операция применяется к множеству элементов некоторой структуры данных. Модель разделяемой памяти – задачи имеют общее адресное пространство, в программе не описываются сообщения, важное место занимает синхронизация. Закон Амдала: 1 K , S P/N где K – коэффициент ускорения (оценка эффективности), S доля последовательной части программы, P – доля параллельной части программы, N – количество процессоров, необходимых для идеального распараллеливания. Интерфейс параллельного программирования MPI ( Message Passing Interface ). Пример программы: #include <stdio.h> #include <string.h> #include <mpi.h> #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<np;src++){ MPI_Recv(message, BUF_LEN, MPI_CHAR, src,tag,MPI_COMM_WORLD,&status); printf("%s\n",message); } } MPI_Finalize(); return 0; } Некоторые вызовы 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_CHAR signed char MPI_INT signed int MPI_LONG MPI_DOUBLE MPI_BYTE ………………………… signed long int double unsigned char ………………………………… Реализации MPI: MPICH, OpenMPI. OpenMPI_v1.5.3-2_win32.exe http://www.open-mpi.org/software/ompi/v1.5/ MPICH2: http://www.mcs.anl.gov/research/projects/mpich2/downloads/index.ph p?s=downloads OpenMPI: >mpicxx test.c MPICH2: >cl test.c mpi.lib