Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
MPI - MKM.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
391.79 Кб
Скачать

81 Сурак

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

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

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

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

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

2. Пример использования фукнции MPI_Cart_shift()

Функция MPI_Cart_shift обеспечивает получение рангов процессов, с которыми текущий процесс (процесс, вызвавший функцию MPI_Cart_shift) должен выполнить обмен данными : int MPI_Card_shift(MPI_Comm comm, int dir, int disp, int *source, int *dst). 1. comm – коммуникатор с топологией решетки. 2. dir - номер измерения, по которому выполняется сдвиг. 3.disp - величина сдвига (<0 – сдвиг к началу измерения). 4. source – ранг процесса, от которого должны быть получены данные. 5. dst - ранг процесса которому должны быть отправлены данные.

MPI_Cart_shift(cartcomm,0,1,&nbrs[LEFT], &nbrs[RIGHT]);

3. Решение 2-мерного уравнения Лапласа методом 1-мерной декомпозиции.

constint N=100;

float P[N][N],

h=0.01, //шаг сетки

eps=0.01, //точность

max, //норма

**p, //текущая итерация

**pp, //предыдущая итерация

a[N],b[N]; //вспомогательные векторы

inti,j,

c, //кол-во строк матрицы на каждом процессоре

stop = 1; //условие заверщения цикла

intrank,size;

MPI_Init(&argc,&argv);

MPI_Status status;

MPI_Comm_rank(MPI_COMM_WORLD,&rank);

MPI_Comm_size(MPI_COMM_WORLD,&size);

if(rank<N%size)

{

c=N/size+1;

}else

{

c=N/size;

}

p=newfloat*[c];

pp=newfloat*[c];

for(i=0;i<c;i++)

{

p[i]=newfloat[N];

pp[i]=newfloat[N];

p[i][0]=1;

pp[i][0]=1;

for(int j=1;j<N;j++)

{

p[i][j]=0;

pp[i][j]=0;

}

}

if(rank==0)

{

do

{

if(size>1)

{

MPI_Send(&p[c-1][0],N,MPI_FLOAT,rank+1,

0,MPI_COMM_WORLD);

MPI_Recv(a,N,MPI_FLOAT,rank+1,size,

MPI_COMM_WORLD, &status);

}

max=0.0;

for(i=1;i<c-1;i++)

{

for(j=1;j<N-1;j++)

{

p[i][j]=(pp[i+1][j]+pp[i-1][j]+pp[i][j+1]+pp[i][j-1])/4;

if(max<fabs(p[i][j]-pp[i][j]))

{

max=fabs(p[i][j]-pp[i][j]);

}

}

}

if(size>1)

{

for(j=1;j<N-1;j++)

{

p[c-1][j]=(pp[c-2][j]+a[j]+pp[c-1][j+1]+pp[c-1][j-1])/4;

if(max<fabs(p[c-1][j]-pp[c-1][j]))

{

max=fabs(p[c-1][j]-pp[c-1][j]);

}

}

floatmaxx;

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

{

MPI_Recv(&maxx,1,MPI_FLOAT,i,2*size,MPI_COMM_WORLD,&status);

if(maxx>max)

{

max=maxx;

}

}

}

if(max<=eps)

{

stop=0;

}

if(size>1)

{

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

{

MPI_Send(&stop,1,MPI_INT,i,3*size,MPI_COMM_WORLD);

}

}

for(i=0;i<c;i++)

{

for(j=0;j<N;j++)

{

pp[i][j]=p[i][j];

}

}

}while(stop==1);

for(i=0;i<c;i++)

{

for(int j=0;j<N;j++)

{

P[i][j]=p[i][j];

}

}

if(size>1)

{

intjj=c-1;

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

{

MPI_Recv(&c,1,MPI_INT,i,4*size,MPI_COMM_WORLD,&status);

for(j=0;j<c;j++)

{

jj++;

MPI_Recv(&P[jj][0],100,MPI_FLOAT,i,5*size,MPI_COMM_WORLD,&status);

}

}

}

ofstream out("result.txt");

for(i=0;i<N;i++)

{

for(int j=0;j<N;j++)

{

out<<P[i][j]<<'\t'; //вывожу в результаты в фаил

}

out<<'\n';

}

}

if(rank==size-1&&size>1)

{

do

{

MPI_Recv(b,N,MPI_FLOAT,rank-1,0,MPI_COMM_WORLD,&status);

MPI_Send(&p[0][0],N,MPI_FLOAT,rank-1,size,MPI_COMM_WORLD);

max=0;

for(i=1;i<c-1;i++)

{

for(j=1;j<N-1;j++)

{

p[i][j]=(pp[i+1][j]+pp[i-1][j]+pp[i][j+1]+pp[i][j-1])/4;

if(max<fabs(pp[i][j]-p[i][j]))

{

max=fabs(pp[i][j]-p[i][j]);

}

}

}

for(j=1;j<N-1;j++)

{

p[0][j]=(pp[1][j]+b[j]+pp[0][j+1]+pp[0][j-1])/4;

if(max<fabs(pp[0][j]-p[0][j]))

{

max=fabs(pp[0][j]-p[0][j]);

}

}

MPI_Send(&max,1,MPI_FLOAT,0,2*size,MPI_COMM_WORLD);

for(i=0;i<c;i++)

{

for(j=0;j<N;j++)

{

pp[i][j]=p[i][j];

}

}

MPI_Recv(&stop,1,MPI_INT,0,3*size,MPI_COMM_WORLD,&status);

}while(stop==1);

MPI_Send(&c,1,MPI_INT,0,4*size,MPI_COMM_WORLD);

for(i=0;i<c;i++)

{

MPI_Send(&p[i][0],N,MPI_FLOAT,0,5*size,MPI_COMM_WORLD);

}

}

if(rank>0&&rank<size-1)

{

do

{

MPI_Recv(b,N,MPI_FLOAT,rank-1,0,MPI_COMM_WORLD,&status);

MPI_Send(&p[c-1][0],N,MPI_FLOAT,rank+1,0,MPI_COMM_WORLD);

MPI_Recv(a,N,MPI_FLOAT,rank+1,size,MPI_COMM_WORLD,&status);

MPI_Send(&p[0][0],N,MPI_FLOAT,rank-1,size,MPI_COMM_WORLD);

max=0;

int ii;

if(rank<N%size||100%size==0)

{

ii=rank*c;

}

if(rank>N%size&&100%size!=0)

{

ii=(N%size)*(c+1)+(rank-N%size)*c;

}

for(i=1;i<c-1;i++)

{

for(j=1;j<N-1;j++)

{

p[i][j]=(pp[i+1][j]+pp[i-1][j]+pp[i][j+1]+pp[i][j-1])/4;

if(max<fabs(pp[i][j]-p[i][j]))

{

max=fabs(pp[i][j]-p[i][j]);

}

}

}

for(j=1;j<N-1;j++)

{

p[0][j]=(pp[1][j]+b[j]+pp[0][j+1]+pp[0][j-1])/4;

if(max<fabs(pp[0][j]-p[0][j]))

{

max=fabs(pp[0][j]-p[0][j]);

}

p[c-1][j]=(pp[c-2][j]+a[j]+pp[c-1][j+1]+pp[c-1][j-1])/4;

if(max<fabs(pp[c-1][j]-p[c-1][j]))

{

max=fabs(pp[c-1][j]-p[c-1][j]);

}

}

MPI_Send(&max,1,MPI_FLOAT,0,2*size,MPI_COMM_WORLD);

for(i=0;i<c;i++)

{

for(j=0;j<N;j++)

{

pp[i][j]=p[i][j];

}

}

MPI_Recv(&stop,1,MPI_INT,0,3*size,MPI_COMM_WORLD,&status);

}while(stop==1);

MPI_Send(&c,1,MPI_INT,0,4*size,MPI_COMM_WORLD);

for(i=0;i<c;i++)

{

MPI_Send(&p[i][0],N,MPI_FLOAT,0,5*size,MPI_COMM_WORLD);

}

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]