Презентацию к данной лекции Вы можете скачать здесь.
Фоннеймановская архитектура последовательная, скалярная. В "классическом" фоннеймановском компьютере параллелизм отсутствует на всех уровнях. Традиционная последовательная модель программирования, ориентированная на SISD архитектуры (по Флинну). Языки последовательного программирования.
Пользователю нужна производительность. Увеличение производительности позволяет:
Многие расширения фоннеймановской архитектуры используют параллелизм на разном уровне
Вычислительные системы с распределенной памятью (кластеры, MIMD по классификации Флинна) от небольших кластеров до суперкомпьютеров, занимающих первые позиции в рейтинге Top 500 Supercomputers..
Первые многоядерные процессоры появились на рынке в 2005 году. Сейчас это доминирующий тип архитектур.
Вычислительная система с многоядерным процессором – параллельная вычислительная система с общей памятью, обычно SMP (Symmetric Multiprocessor System).
Архитектура Intel® Many Integrated Core (MIC) – шаг к системам с большой многоядерностью, от 32-ядерного прототипа к системам с десятками, сотнями и т.д. ядер
Алгоритм можно представить в виде диаграммы информационного графа.
Информационный граф описывает последовательность выполнения операций и взаимную зависимость между различными операциями или блоками операций.
Узлами информационного графа являются операции, а однонаправленными дугами каналы обмена данными.
Понятие операции может трактоваться расширенно. Это может быть оператор языка, но может быть и более крупный блок программы.
Традиционной считается последовательная модель программирования. В этом случае в любой момент времени выполняется только одна операция и только над одним элементом данных. Последовательная модель универсальна. Ее основными чертами являются применение стандартных языков программирования (для решения вычислительных задач это, обычно, Fortran и С/С++), хорошая переносимость программ и невысокая производительность.
Основными особенностями параллельной модели программирования являются более высокая производительность программ, применение специальных приемов программирования и, как следствие, более высокая трудоемкость программирования, проблемы с переносимостью программ. Параллельная модель не обладает свойством универсальности.
В параллельной модели программирования появляются проблемы, непривычные для программиста, привыкшего заниматься последовательным программированием. Среди них: управление работой множества процессоров, организация межпроцессорных пересылок данных и другие.
Повышенная трудоемкость параллельного программирования связана с тем, что программист должен заботиться:
Системные вызовы операционной системы (UNIX/Linux)
IPC (InterProcess Communications)
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include "mesg.h"
main()
{
message message;
key_t key;
int msgid, length, n;
if ((key = ftok("server", 'A')) < 0){
printf("Невозможно получить ключ\n"); exit(1); }
message.mtype=1L;
if ((msgid = msgget(key, PERM | IPC_CREAT)) < 0){
printf("Невозможно создать очередь\n"); exit(1); }
n = msgrcv(msgid, message, sizeof(message), message.mtype, 0);
if (n > 0) {
if (write(1, message.buff, n) != n) {
printf("Ошибка вывода\n"); exit(1); }
}
else { printf("Ошибка чтения сообщения\n"); exit(1); }
exit(0);
}
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include "mesg.h"
main()
{
Message message;
key_t key;
int msgid, length;
message.mtype = 1L;
if ((key = ftok("server", 'A')) < 0){
printf("Невозможно получить ключ\n"); exit(1); }
if ((msgid = msgget(key, 0)) < 0){
printf("Невозможно получить доступ к очереди\n"); exit(1); }
if ((length = sprintf(message.buff, "Здравствуй, Мир!\n")) < 0){
printf("Ошибка копирования в буфер\n"); exit(1); }
if (msgsnd(msgid, (void *) message, length, 0) !=0){
printf("Ошибка записи сообщения в очередь\n");
exit(1); }
if (msgctl(msgid, IPC_RMID, 0) < 0){
printf("Ошибка удаления очереди\n"); exit(1); }
exit(0);
}
POSIX Threads - стандарт POSIX реализации потоков (нитей) выполнения, определяющий API для создания и управления ими.
Ссылка http://www.opengroup.org/onlinepubs/009695399/basedefs/pthread.h.html
#include <stdio.h>
#include "gettimeofday.h"
#include <pthread.h>
#define gNumThreads 1
#define N 100000000
double a[N + 1], b[N + 1], sum;
int i, j;
double start, stop;
const int gNumSteps = N;
double gVectorSum = 0;
void *threadFunction(void *arg)
{
int i;
int myNum = *((int *)arg);
double partialSum = 0; // local to each thread
for ( i = myNum; i < gNumSteps; i += gNumThreads ) // use every gNumThreads-th step
{
partialSum += a[i] * b[i]; //compute partial sums at each thread
}
gVectorSum += partialSum; // add partial to global final answer
return 0;
}
int main()
{
pthread_t tid[gNumThreads];
int tNum[gNumThreads], i, j;
// initialize vector
for (j = 0; j < N; j++)
{
a[j] = 1.031; b[j] = 1.057;
}
printf("Computed value of vector sum: ");
start = wcgettimeofday();
for (i = 0; i < gNumThreads; i++)
{
tNum[i] = i;
pthread_create(tid[i], NULL, threadFunction, tNum[i]);
}
for (i = 0; i < gNumThreads; i++)
pthread_join(tid[i], NULL);
stop = wcgettimeofday();
printf("sum = %f\n", gVectorSum);
printf("time = %g\n", stop - start);
}
В Microsoft Windows имеется возможность разработки многопоточных приложений на C++ с помощью "стандартных" системных средств – прикладного программного интерфейса операционной системы.
Ссылка http://msdn.microsoft.com
#include <windows.h>
#include <stdio.h>
#define N 100000000
double a[N + 1], b[N + 1], sum;
int i, j;
double start, stop;
const int gNumSteps = N;
const int gNumThreads = 1;
double gVectorSum = 0;
CRITICAL_SECTION gCS;
DWORD WINAPI threadFunction(LPVOID pArg)
{
int i;
int myNum = *((int *)pArg);
double partialSum = 0; // local to each thread
for ( i = myNum*(gNumSteps / gNumThreads); i < (myNum+1)*(gNumSteps /gNumThreads); i++ )
// use every gNumThreads-th step
{
partialSum += a[i] * b[i]; //compute partial sums at each thread
}
EnterCriticalSection(gCS);
gVectorSum += partialSum; // add partial to global final answer
LeaveCriticalSection(gCS);
return 0;
}
int main()
{
HANDLE threadHandles[gNumThreads];
int tNum[gNumThreads], i, j;
for (j = 0; j < N; j++)
{
a[j] = 1.031; b[j] = 1.057;
}
printf("Computed value of dot product: ");
start = wcgettimeofday();
InitializeCriticalSection(gCS);
for ( i = 0; i < gNumThreads; ++i )
{
tNum[i] = i;
threadHandles[i] = CreateThread( NULL, // Security attributes
0, // Stack size
threadFunction, // Thread function
(LPVOID)tNum[i], // Data for thread func()
0, // Thread start mode
NULL); // Returned thread ID
}
WaitForMultipleObjects(gNumThreads, threadHandles, TRUE, INFINITE);
DeleteCriticalSection(gCS);
stop = wcgettimeofday();
printf("sum = %f\n", gVectorSum);
printf("time = %g\n", stop - start);
}
OpenMP - стандарт программного интерфейса приложений для параллельных систем с общей памятью. Поддерживает языки C, C++, Fortran.
Первая версия появилась в 1997 (Fortran) / 1998 (C/C++) годах. Последняя версия OpenMP 3.0 (2008 год). Разработкой стандарта занимается OpenMP ARB (Architecture Board).
Ссылка http://openmp.org
#include <windows.h>
#include <stdio.h>
#define N 100000000
double a[N + 1], b[N + 1];
int i;
double start, stop;
double gDotProduct = 0;
int main()
{
// initialize vectors
for (i = 0; i < N; i++)
{
a[i] = 1.034; b[i] = 1.057;
}
printf("Computed value of vector sum: ");
start = omp_get_wtime();
Intel® TBB – библиотека шаблонов параллельных алгоритмов и контейнеров на языке С++
Intel® CilkTM Plus - расширение C/C++, упрощающее реализацию параллелизма для систем с общей памятью
Компиляторы – автоматическая оптимизация, автоматическое распараллеливание, векторизация.
Анализаторы производительности.
"Экспериментальные" технологии
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.