Суперскалярные и векторные процессоры

Скалярный процессор — это простейший класс микропроцессоров. Скалярный процессор обрабатывает один элемент данных за одну инструкцию (SISD, Single Instruction Single Data), типичными элементами данных могут быть целые или числа с плавающей запятой. В векторных процессорах (SIMD, Single Instruction Multiple Data), в отличие от скалярных, одна инструкция работает с несколькими элементами данных.

Суперскалярность — архитектура вычислительного ядра, использующая несколько декодеров команд, которые могут загружать работой множество исполнительных блоков. Планирование исполнения потока команд является динамическим и осуществляется самим вычислительным ядром.

Если в процессе работы команды, обрабатываемые конвейером, не противоречат друг другу, и одна не зависит от результата другой, то такое устройство (ядро) может осуществить параллельное выполнение команд. В суперскалярных системах решение о запуске инструкции на исполнение принимает сам вычислительный модуль, что требует много ресурсов.

Векторный процессор — это процессор, в котором операндами некоторых команд могут выступать упорядоченные массивы данных — векторы. Отличается от скалярных процессоров, которые могут работать только с одним операндом в единицу времени. Абсолютное большинство процессоров являются скалярными или близкими к ним.

 

 

Пользовательские типы данных. Размеры памяти для данных. Освобождение памяти.

Любой тип данных в MPI имеет две характеристики: протяженность и размер, выраженные в байтах:

Протяженность типа определяет, сколько байт переменная данного типа занимает в памяти. Эта величина может быть вычислена как адрес последней ячейки данных - адрес первой ячейки данных + длина последней ячейки данных (опрашивается подпрограм MPI_Type_extent). Размер типа определяет количество реально передаваемых байт в коммуникационных операциях. Эта величина равна сумме длин всех базовых элементов определяемого типа (опрашивается подпрограммой MPI_Type_size). Для простых типов протяженность и размер совпадают.

Функция MPI_Type_free уничтожает описатель производного типа. intMPI_Type_free(MPI_Datatype *datatype)

datatype – уничтожаемый производный тип.

Функция MPI_Type_free устанавливает описатель типа в состояние MPI_DATATYPE_NULL. Это не повлияет на выполняющиеся в данный момент коммуникационные операции с этим типом данных и на производные типы, которые ранее были определены через уничтоженный тип.

 

Напишите программу параллельного поиска максимального числа в массиве.

int main(int argc,char **argv)

{

int size,rank,i,n=12;

float a[]={10.0,-1.0,2.0,3.0,7.0,6.0,3.0,1.0,-2.0,4.0,-9.0,20.0};

MPI_Status status;

MPI_Init(&argc,&argv);

MPI_Comm_rank(MPI_COMM_WORLD,&rank);

MPI_Comm_size(MPI_COMM_WORLD,&size);

float f=0,max=0,maxo=0;

int nachalo,konec,shag;

shag=n/(size-1);

if(rank!=size-1)

{

nachalo=rank*shag;

konec=rank*shag+shag;

max=a[nachalo];

for(i=nachalo;i<konec;i++)

if(a[i]>max)

max=a[i];

 

MPI_Send(&max,1,MPI_FLOAT,size-1,1,MPI_COMM_WORLD);

}

if(rank==size-1){

maxo=-32000;

for(i=0;i<size-1;i++)

{ MPI_Recv(&max,1,MPI_FLOAT,i,1,MPI_COMM_WORLD,&status);

if(maxo<max)

maxo=max; }

printf("%f\n",maxo);

}

MPI_Finalize();

}

 

 

Сурак

Архитектура NUMA.

NUMA (Non-Uniform Memory Access) – это архитектура совместного доступа к памяти в многопроцессорных системах, в которой время доступа к участку памяти определяется его расположением относительно процессора. Как и в случае с большинством других свойств процессорных систем, невнимание к особенностям архитектуры может привести к ухудшению работы памяти. К счастью, существует возможность нивелировать проблемы в работе, связанные с характерными особенностями NUMA-архитектур и даже использовать некоторые её преимущества для улучшения работы приложений. Это касается привязки потоков к процессорам, распределения памяти с использованием неявных методов, а также применения системных API для привязки ресурсов и перемещения страниц между узлами вычислительной системы.