Лекция17_m

advertisement
Параллельные аппаратные архитектуры
и модели программирования
•
•
•
•
•
•
Традиционная архитектура фон Неймана
Расширение традиционной архитектуры
Сопроцессоры
Многоядерные процессоры
Мультипроцессоры
Мультикомпьютеры
• Параллелизм данных
• Параллелизм задач
• Распараллеливание на уровне процессов
• Распараллеливание на уровне потоков
Традиционная архитектура фон Неймана
ЦП
АЛУ
ОЗУ
УУ
…………………..
…………………..
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
Download