Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Зертхана ПВ.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
494.59 Кб
Скачать

Зертханалық жұмыс №2. Мәлімет алмасудың негізгі амалдарының орындалу алгоритмдерін жүзеге асыру және құру. Салыстырмалы талдау

Мақсаты: Мәлімет алмасуды амалдарды орындауда қолдану. Оларға салыстырмалы талдау жасау.

Тапсырма 1. (мәліметтерді бөлу үшін MPI datatypes-ты қолдану)

Бұл тапсырмада, сіз MPI_Bcast жеке сұранысының көмегімен әртүрлі datatypes-пен байланысу үшін, broadcast шаблоныңызды өзгертесіз. Сіздің программаңыз стандарттық енгізуден екілік дәлдік мәні мен бүтін санды есептей алады және бұл MPI_Bcast сұранысы көмегімен 0-дік процес пен басқа барлық процестерге бұл мәндерді хабарлайды. MPI datatypes-ты қолданыңыз.

Ұсыныс: Сіз өзіңіздің шешіміңізде MPI-дың мына шаблондарын қолдануыңызға болады:

MPI_Address, MPI_Type_struct, MPI_Type_commit, MPI_Type_free, MPI_Bcast

Мысалы:

#include <stdio.h>

#include "mpi.h"

int main( argc, argv )

int argc;

char **argv;

{

int rank;

struct { int a; double b } value;

MPI_Datatype mystruct;

int blocklens[2];

MPI_Aint indices[2];

MPI_Datatype old_types[2];

MPI_Init( &argc, &argv );

MPI_Comm_rank( MPI_COMM_WORLD, &rank );

/* One value of each type */

blocklens[0] = 1;

blocklens[1] = 1;

/* The base types */

old_types[0] = MPI_INT;

old_types[1] = MPI_DOUBLE;

/* The locations of each element */

MPI_Address( &value.a, &indices[0] );

MPI_Address( &value.b, &indices[1] );

/* Make relative */

indices[1] = indices[1] - indices[0];

indices[0] = 0;

MPI_Type_struct( 2, blocklens, indices, old_types, &mystruct );

MPI_Type_commit( &mystruct );

do {

if (rank == 0)

scanf( "%d %lf", &value.a, &value.b );

MPI_Bcast( &value, 1, mystruct, 0, MPI_COMM_WORLD );

printf( "Process %d got %d and %lf\n", rank, value.a, value.b );

} while (value.a >= 0);

/* Clean up the type */

MPI_Type_free( &mystruct );

MPI_Finalize( );

return 0;

}

2 Тапсырма.(мәліметтерді бөлу үшін, MPI_Pack қолдану қажет). MPI_Pack және MPI_Unpack қолдану кезінде әртүлі datatypes хабарлау үшін сілтеме шаблонын өзгертуіңіз керек. Бұл жерде сіздің бүтін санды және екілік дәлдікпен есептеп (0 прцессінен), MPI_Bast сұранысының көмегімен 0-ге жіне барлық басқа процестерге хабарлайды. Мәліметтерді буферге бумалау үшін, MPI_Pack қолданыңыз( жай ғана char packbuf [100] қолдануыңызға болады, бірақ MPI_Pack_size орнына қалай қолдануға болатынын ойланып көріңіз).

Екерту. MPI_Bcast, MPI_Send/MPI_Recv операциясынан айырмашылығы, ол тура сол дәл мәліметтің жіберілуін немесе қабылданып алуын сұрайды. Ол үшін, сіз MPI_Bcast аргументі үшін барлық процесстер сол бір мәндес екенінде сенімді болуыңыз қажет.

Ұсыныс: Сіз өзіңіздің есептеулеріңізде осы MPI шаблондарын қолдана аласыз:

MPI_Pack, MPI_Unpack, MPI_Bcast.

Примерное решение

#include <stdio.h>

#include "mpi.h"

int main( argc, argv )

int argc;

char **argv;

{

int rank;

int packsize, position;

int double b;

char a;

packbuf[100];

MPI_Init( &argc, &argv );

MPI_Comm_rank( MPI_COMM_WORLD, &rank );

do {

if (rank == 0) {

scanf( "%d %lf", &a, &b );

packsize = 0;

MPI_Pack( &a, 1, MPI_INT, packbuf, 100, &packsize,

MPI_COMM_WORLD );

MPI_Pack( &b, 1, MPI_DOUBLE, packbuf, 100, &packsize,

MPI_COMM_WORLD );

}

MPI_Bcast( &packsize, 1, MPI_INT, 0, MPI_COMM_WORLD );

MPI_Bcast( packbuf, packsize, MPI_PACKED, 0, MPI_COMM_WORLD );

if (rank != 0) {

position = 0;

MPI_Unpack( packbuf, packsize, &position, &a, 1, MPI_INT,

MPI_COMM_WORLD );

MPI_Unpack( packbuf, packsize, &position, &b, 1, MPI_DOUBLE,

MPI_COMM_WORLD );

}

printf( "Process %d got %d and %lf\n", rank, a, b );

} while (a >= 0);

MPI_Finalize( );

return 0;

}

3. Тапсырма.(сақинадағы хат)

Мәліметті нөлдік прцесстен алып және оны сақиналық процессте отырып басқа процесстерге жіберетін программа жазыңыз. Сонымен қатар, і-ші процесстегі мәліметті ала отырып, оны і+1 процессіне, яғни ең соңғы процесске жеткенше жіберіп отыру керек.

Мәліметтерді тек бір бүтін сандардан ғана тұрады деп ойлау керек. Нөлдік процесс мәліметті қолданушыдан оқи алалды.

Сіз бұл MPI шаблондарды өзіңіздің тапсырмаларыңызда қолдана аласыз. MPI_Send, MPI_Recv

Тапсырма: 1 және 2 есептері үшін программаны талдап және жөндеңіз, сонымен қатар мәліметтерді нөлдік процесстерден бастап қалғанының барлығына сілтеме жасап, программасын құрыңыз.

Зертханалық жұмыс №3. Жай математикалық есептердегі параллельді есептердің жобалануы мен жүзеге асырылуының мысалдары

Мақсаты: Математикалық есептердегі параллельді есептердің орындауда қолдану. Оларға салыстырмалы талдау жасау.

Қатынасымен анықталатын матрицаның векторға көбейтілу есебін қарастырайық.

Сонымен қатар, матрица мен вектор қатарын көбейту бойынша нәтижелі вектор алу үшін n біртипті амалын қайталау керек. Мұндай нәтижелі вектор алу үшін, матрица мен векторды және тізбектелген туындының суммасын элементтері бойынша көбейтуді қажет етеді.

Матрица мен векторды көбейту кезінде орындалған әрекеттер бойынша, есептерді параллельді шешу әдісі параллельді алгоритмдер суммасының негізінде алынады. Осыларды қарастыра отырып, процесстерді қолдану үшін оның санына тәуелсіз болатын параллельді есептеулерде сұранысты ұйымдастыру үшін қабылдау мүмкіншілігн қарастыру.

Сонымен қатар,есептеу жүйесінің топологиясына сәйкес келетін қажетті таңдауға көғіл бөлу керек, (процесстер арасындағыканалдар ) яғни шығынды түсіру үшін және процессораралық әрекетті ұйымдастыру үшін қажет.

Параллельдеудің мүмкін әдісін таңдау үшін, матрицаны векторға көбейту алгоритмідеріне тәуелді ақпараттық талдау жүргізейік.

  • Матрицаның жеке қатарын векторға көбейтуді есептеу амалында тәуелсіз және параллельді орындалуы мүмкін.

  • Әр қатарды векторға көбейту кез – келген элемент бойынша тәуелсіз көбейтіледі және параллельді орындалады.

  • Матрица қатарының векторға көбейтілу амалдарындағы алынатын туындының суммасын алдындағы қарастырылғандардың ішінен бір – бірден қарастырылуы мүмкін (тізбектелген алгоритм, қарапайым және каскадты модифицирленген сұлба).

Процессорладың көбісі n группаларға бөлініп, матрицаның бөлек қатары векторға көбейтілуі орындалады. Басында әр группаның процессорының есептелуі сәйкес элементтің векторы мен матицаның элементтер қатарына жіберіледі. Әрі қарай әр процессор көбейту амалын орындайды. Тізбектелген есптеулер сумманың каскадты сұлбасымен орындалады.

Матрица қатарын векторға көбейту амалын есептеу сұлбасы.

Параллельді алгоритмнің орындалу уақыты параллельді көбейтілу амалымен каскадты сұлбаның орындалу уақыты арқылы орындалады.

Тапсырма. Шығарылатын мәліметтер туындысы үшін матрицаны векторға паралллель көбейту алгоритмін жүзеге асыратын программаны өңдеп, жөндеңіз.