Главная страница

Коллоквиум сұрақтары жауаптары (2) (копия). Коллоквиум сратары


Скачать 2 Mb.
НазваниеКоллоквиум сратары
Дата15.02.2022
Размер2 Mb.
Формат файлаdocx
Имя файлаКоллоквиум сұрақтары жауаптары (2) (копия).docx
ТипДокументы
#363200
страница3 из 10
1   2   3   4   5   6   7   8   9   10

Синтаксис


копия c++

int MPIAPI MPI_Pack_size(

      int          incount,

      MPI_Datatype datatype,

      MPI_Comm     comm,

_Out_ int          *size

);

Параметры


  • аргумент
    подсчета количества для вызова упаковки.


  • тип данных Аргумент типа данных для вызова упаковки.


  • аргумент коммуникатора связи для вызова упаковки.

  • размер [out]
    Верхняя граница размера упакованного сообщения, в байтах.

Возвращаемое значение


Возвращает MPI_SUCCESS при успешном выполнении. В противном случае возвращаемое значение является кодом ошибки.

В Fortran возвращаемое значение сохраняется в параметре IERROR.

Функция MPI_Buffer_attach

Синтаксис


копия c++

int

MPIAPI MPI_Buffer_attach(

_In_ void *buffer,

     int  size

);

Параметры


  • буфер [в]
    Начальный адрес буфера.

  • размер
    буфера в байтах.

Возвращаемое значение


Возвращает MPI_SUCCESS при успешном выполнении. В противном случае возвращаемое значение является кодом ошибки.

В Fortran возвращаемое значение сохраняется в параметре IERROR.

Функция MPI_Buffer_detach


Удаляет существующий буфер.

Синтаксис


Копия c++

int

MPIAPI MPI_Buffer_detach(

_Out_ void *buffer_addr,

_Out_ int  *size

);

Параметры


  • buffer_addr [out]
    Начальный адрес буфера.

  • размер [out]
    Размер буфера в байтах.

Возвращаемое значение


Возвращает MPI_SUCCESS при успешном выполнении. В противном случае возвращаемое значение является кодом ошибки.

В Fortran возвращаемое значение сохраняется в параметре IERROR.

MPI_BSEND_OVERHEAD представляет размер в байтах накладных расходов памяти, создаваемых при каждом выпуске MPI_Bsend или MPI_Ibsend. Буфер, подключенный в данный момент к MPI через MPI_Buffer_attach, должен содержать достаточно места как для отправки сообщения, так и для создания дополнительных ресурсов памяти.
14 Шаблон бойынша хабарлама қабылдау. Қолдану есептеріне мысалдар келтіріңіз.

15 MPI_Get_count() және MPI_Probe () функциялары.Жұмыс принципі және пайдалану ерекшеліктері, айырмашылықтары.

Функция MPI_Get_count


Получает количество элементов "верхнего уровня".

Синтаксис


c++Копировать

int MPIAPI MPI_Get_count(

_In_  MPI_Status   *status,

      MPI_Datatype datatype,

_Out_ int          *count

);

Параметры


  • статус [в]
    Статус возврата операции приема.

  • тип
    данных Тип данных каждого элемента буфера приема.

  • count [out]
    Number of received elements.

Return value


Возвращает MPI_SUCCESS при успешном выполнении. В противном случае возвращаемое значение является кодом ошибки.

В Fortran возвращаемое значение сохраняется в параметре IERROR.

Функция MPI_Probe


Проверка блокировки сообщения.

Синтаксис


c++Копировать

int MPIAPI MPI_Probe(

      int        source,

      int        tag,

      MPI_Comm   comm,

_Out_ MPI_Status *status

);

Параметры



  • ранг исходного источника или MPI_ANY_SOURCE.


  • значение тега тега или MPI_ANY_TAG.

  • comm
    Communicator.

  • объект состояния status [out]
    .

Возвращаемое значение


Возвращает MPI_SUCCESS при успешном выполнении. В противном случае возвращаемое значение является кодом ошибки.

В Fortran возвращаемое значение сохраняется в параметре IERROR.
16 Бұғаттаусыз байланыс операциялары. "Алмасу сұранысы" объектісі (request).

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

Бұғаттамайтын операциялар алмасу функциялары мен сұрау салу функциялары арасындағы байланыс үшін арнайы жасырын (opaque) "алмасу сұранысы" (request) объектісін пайдаланады. Қолданбалы бағдарламалар үшін бұл нысанға тек MPI функциялары қоңыраулары арқылы қол жеткізуге болады. Егер айырбастау операциясы аяқталған болса, тексеру кіші бағдарламасы MPI_REQUEST_NULL мәніне орнатып, "алмасу сұрауын" алып тастайды. Mpi_request_free ішкі бағдарламасы арқылы операцияның аяқталуын күтпестен сұрауды алып тастауға болады.
17 MPI_Isend(), MPI_Irecv() функциялары, параметрлерін сипаттаңыз, MPI_Request типінің параметрі.

Ішкі бағдарламадан қайтару дереу (immediate), деректерді берудің аяқталуын күтпестен жүзеге асырылады. Бұл функция атауларындағы I префиксін түсіндіреді. Сондықтан, buf айнымалысын "алмасу сұранысы"өтелгенге дейін қайта пайдалануға болмайды. Мұны mpi_wait немесе MPI_Test кіші бағдарламалары арқылы request параметрін беру арқылы жасауға болады.

Параметрлері:

OUT

buf

- қабылданатын деректер үшін мекенжай;

IN

count

- қабылданатын элементтердің максималды саны;

IN

datatype

- қабылданатын хабарлама элементтерінің түрі;

IN

source

-процесс нөмірі-жіберуші;

IN

tag

- хабарлама идентификаторы;

IN

comm

- коммуникатор;

OUT

request

- "алмасу сұранысы". Операция идентификаторы



MPI_Irecv. Кіші бағдарламадан қайтару деректерді қабылдаудың аяқталуын күтпей-ақ дереу жүргізіледі. Қабылдаудың аяқталу сәтін mpi_wait немесе mpi_test кіші бағдарламаларының көмегімен тиісті request параметрімен анықтауға болады. Блоктау операцияларындағыдай, алынған хабарламаның параметрлерін оны нақты оқымай-ақ сұрау қажеттілігі жиі туындайды. Бұл MPI_Iprobe функциясы арқылы жасалады.

Параметрлері:

OUT

buf

- қабылданатын деректер үшін мекенжай;

IN

count

- қабылданатын элементтердің максималды саны;

IN

datatype

- қабылданатын хабарлама элементтерінің түрі;

IN

source

-процесс нөмірі-жіберуші;

IN

tag

- хабарлама идентификаторы;

IN

comm

- коммуникатор;

OUT

request

- "алмасу сұранысы". Операция идентификаторы


18 MPI_Wait(),MPI_Test() функциялары, жұмыс принципі, мысалдар келтіріңіз.

MPI_Wait
MPI_Wait ожидает завершения неблокирующей операции. То есть, в отличие от MPI_Test, MPI_Wait будет блокировать до завершения основной неблокирующей операции. Поскольку неблокирующая операция немедленно возвращается, она делает это до завершения основной MPI-процедуры. Ожидание завершения этой процедуры и есть то, для чего предназначен MPI_Wait. Существуют разновидности MPI_Wait для одновременного мониторинга нескольких обработчиков запросов: MPI_Waitall, MPI_Waitany и MPI_Waitsome.

Синопсис
int MPI_Wait(MPI_Request *request, MPI_Status *status)

Входные параметры

Запрос - request

запрос (хэндл)

Выходные параметры

Статус -status

объект состояния (Status). Может быть MPI_STATUS_IGNORE.
Поле MPI_ERROR возврата статуса устанавливается только в том случае, если возврат из MPI-подпрограммы - MPI_ERR_IN_STATUS. Этот класс ошибок возвращается только теми процедурами, которые принимают массив аргументов состояния (MPI_Testall, MPI_Testsome, MPI_Waitall и MPI_Waitsome). Во всех остальных случаях значение поля MPI_ERROR в статусе остается неизменным.
Для операций отправки единственное использование статуса - это MPI_Test_cancelled или в случае, если произошла ошибка в одной из четырех процедур, которые могут вернуть класс ошибки MPI_ERR_IN_STATUS, в этом случае поле MPI_ERROR в статусе будет установлено. В этом случае значение будет установлено в MPI_SUCCESS для любой операции отправки или приема, которая завершилась успешно, или MPI_ERR_PENDING для любой операции, которая и не провалилась и не завершилась.

Пример:

int main(int argc, char* argv[])

{

MPI_Init(&argc, &argv);
// Убедиться что будет использовано всего 2 процесса

int size;

MPI_Comm_size(MPI_COMM_WORLD, &size);

if (size != 2)

{

printf("Это приложение предназначено для запуска с помощью 2 процессов.\n");

MPI_Abort(MPI_COMM_WORLD, EXIT_FAILURE);

}
// Задаем ранги процессам

int my_rank;

MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
if (my_rank == 0)

{

// Мастер процесс отправляет сообщение

int buffer = 12345;

printf("MPI-процесс %d отправляет значение %d.\n", my_rank, buffer);

MPI_Ssend(&buffer, 1, MPI_INT, 1, 0, MPI_COMM_WORLD);

}

else

{

// Служебный процесс принимает сообщение

int received;

MPI_Request request;

MPI_Irecv(&received, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &request);
// Выполните некоторые другие действия, пока выполняется MPI_Recv.

printf("MPI-процесс %d выдал MPI_Irecv и перешел к печати этого сообщения.\n", my_rank);
// Выполните некоторые другие действия, пока выполняется MPI_Recv.

printf("MPI-процесс %d ожидает завершения базового MPI_Recv.\n", my_rank);

MPI_Wait(&request, MPI_STATUS_IGNORE);

printf("MPI_Wait завершен, что означает, что базовый запрос (т.е. MPI_Recv) также завершен..\n");

}
MPI_Finalize();
return EXIT_SUCCESS;

}



MPI_TEST

MPI_Test проверяет, завершена ли неблокирующая операция в заданное время. То есть, в отличие от MPI_Wait, MPI_Test не будет ждать завершения основной неблокирующей операции. Поскольку неблокирующая операция немедленно возвращается, она делает это до завершения основной MPI-процедуры. Проверка завершения этой процедуры - это то, для чего предназначен MPI_Test. Существуют разновидности MPI_Test для проверки нескольких обработчиков запросов одновременно: MPI_Testall, MPI_Testany и MPI_Testsome.
Синтаксис

  1. int MPI_Test(MPI_Request* request,

  2. int* flag,

  3. MPI_Status* status);



запрос

Обработчик запроса на неблокирующую процедуру для ожидания.
флаг

Переменная, в которой хранится результат проверки; true, если основная неблокирующая процедура завершена, false в противном случае.
статус

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

Значения возврата

*Код ошибки, возвращенный в результате тестирования запроса.
*MPI_SUCCESS: процедура успешно завершена.

ПРИМЕР:

  1. #include

  2. #include

  3. #include

  4.  

  5. int main(int argc, char* argv[])

  6. {

  7. MPI_Init(&argc, &argv);

  8.  

  9. // Получить количество процессов и проверить, что используется только 2 процесса

  10. int size;

  11. MPI_Comm_size(MPI_COMM_WORLD, &size);

  12. if(size != 2)

  13. {

  14. printf("Это приложение предназначено для запуска с помощью 2 процессов.\n");

  15. MPI_Abort(MPI_COMM_WORLD, EXIT_FAILURE);

  16. }

  17.  

  18. // Получить звание

  19. int my_rank;

  20. MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);

  21.  

  22. if(my_rank == 0)

  23. {

  24. // “Ведущий" процесс MPI отправляет сообщение.

  25. int first_message = 12345;

  26. int second_message = 67890;

  27. MPI_Request request;



  28. // Ждать, пока приемник выдаст MPI_Test, предназначенный для отказа

  29. MPI_Barrier(MPI_COMM_WORLD);

  30.  

  31. printf("[Process 0] Sends first message (%d).\n", first_message);

  32. MPI_Isend(&first_message, 1, MPI_INT, 1, 0, MPI_COMM_WORLD, &request);

  33. printf("[Process 0] Sends second message (%d).\n", second_message);

  34. MPI_Send(&second_message, 1, MPI_INT, 1, 0, MPI_COMM_WORLD);

  35. MPI_Wait(&request, MPI_STATUS_IGNORE);

  36. }

  37. else

  38. {

  39. // "Ведомый" процесс MPI получает сообщение.

  40. int first_message;

  41. int second_message;

  42. int ready;

  43. MPI_Request request;

  44.  

  45. MPI_Irecv(&first_message, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &request);

  46.  

  47. // Соответствующий send еще не был выдан, этот MPI_Test будет "провален".

  48. MPI_Test(&request, &ready, MPI_STATUS_IGNORE);

  49. if(ready)

  50. printf("[Process 1] MPI_Test #1: message received (%d).\n", first_message);

  51. else

  52. printf("[Process 1] MPI_Test #1: message not received yet.\n");

  53.  

  54. // Сообщите отправителю, что мы выдали MPI_Test, который должен был завершиться неудачей, теперь он может отправить сообщение.

  55. MPI_Barrier(MPI_COMM_WORLD);

  56.  

  57. MPI_Recv(&second_message, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);

  58. printf("[Process 1] Second message received (%d), which implies that the first message is received too.\n", second_message);

  59. MPI_Test(&request, &ready, MPI_STATUS_IGNORE);

  60. if(ready)

  61. printf("[Process 1] MPI_Test #2: message received (%d).\n", first_message);

  62. else

  63. printf("[Process 1] MPI_Test #2: message not received yet.\n");

  64. }

  65.  

  66. MPI_Finalize();

  67.  

  68. return EXIT_SUCCESS;

  69. }


19 MPI_Barrier(), MPI_Bcast () функциялары.

MPI_BARRIER()

MPI_Barrier блокирует все MPI-процессы в данном коммуникаторе, пока все они не вызовут эту процедуру.

СИНТАКСИС

int MPI_Barrier(MPI_Comm communicator);

Параметры:

коммуникатор

Коммуникатор, в котором находится барьер.

Возвращаемое значение:

*Код ошибки, возвращенный барьером.

*MPI_SUCCESS: Процедура успешно завершена.

ПРИМЕР

  1. #include

  2. #include

  3. #include

  4.  

  5. int main(int argc, char* argv[])

  6. {

  7. MPI_Init(&argc, &argv);

  8.  

  9. // Get my rank

  10. int my_rank;

  11. MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);

  12.  

  13. printf("[MPI process %d] Я начинаю ждать у барьера.\n", my_rank);

  14. MPI_Barrier(MPI_COMM_WORLD);

  15. printf("[MPI process %d] Я знаю, что все процессы MPI ожидали на барьере.\n", my_rank);

  16.  

  17. MPI_Finalize();

  18.  

  19. return EXIT_SUCCESS;

  20. }



MPI_Bcast ()

MPI_Bcast передает сообщение от процесса всем другим процессам в том же коммуникаторе. Это коллективная операция; она должна быть вызвана всеми процессами в коммуникаторе.

СИНТАКСИС

  1. int MPI_Bcast(void* buffer,

  2. int count,

  3. MPI_Datatype datatype,

  4. int emitter_rank,

  5. MPI_Comm communicator);

Параметры

buffer

Буфер, из которого загружаются данные для трансляции, если вызывающий MPI-процесс является излучателем, или буфер, в который сохраняются транслируемые данные, если вызывающий MPI-процесс является приемником.

count

Количество элементов в транслируемом буфере.

datatype

Тип элемента в транслируемом буфере.

emitter_rank

Ранг MPI-процесса, который транслирует данные, все остальные процессы получают транслируемые данные.

Communicator

Коммуникатор, в котором происходит трансляция.

Возвращаемое значение

*Код ошибки, возвращенный из трансляции.

*MPI_SUCCESS: Процедура успешно завершена.

ПРИМЕР:

  1. #include

  2. #include

  3. #include

  4.  

  5. int main(int argc, char* argv[])

  6. {

  7. MPI_Init(&argc, &argv);

  8.  

  9. // Получить звание в коммуникаторе

  10. int my_rank;

  11. MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);

  12.  

  13. // Определите ранг процесса излучателя эфира

  14. int broadcast_root = 0;

  15.  

  16. int buffer;

  17. if(my_rank == broadcast_root)

  18. {

  19. buffer = 12345;

  20. printf("[MPI process %d] Я - корень вещания, и посылаю значение %d.\n", my_rank, buffer);

  21. }

  22. MPI_Bcast(&buffer, 1, MPI_INT, broadcast_root, MPI_COMM_WORLD);

  23. if(my_rank != broadcast_root)

  24. {

  25. printf("[MPI process %d] Я являюсь приемником вещания и получаю ценность %d.\n", my_rank, buffer);

  26. }

  27.  

  28. MPI_Finalize();

  29.  

  30. return EXIT_SUCCESS;

  31. }


20 MPI_Gather(), MPI_Gatherv(), MPI_Allgather(), MPI_Allgatherv() функциялары.

Функция MPI_Gather
Собирает данные от всех членов группы до одного участника.

int MPIAPI MPI_Gather(

_In_      void         *sendbuf,

          int          sendcount,

          MPI_Datatype sendtype,

_Out_opt_ void         *recvbuf,

          int          recvcount,

          MPI_Datatype recvtype,

          int          root,

          MPI_Comm     comm

);

1   2   3   4   5   6   7   8   9   10


написать администратору сайта