0 / 0 / 0
Регистрация: 01.12.2019
Сообщений: 10

Объясните код, что здесь происходит.алгоритм и код

02.12.2019, 20:48. Показов 1109. Ответов 0
Метки mpi (Все метки)

Студворк — интернет-сервис помощи студентам
allreducee.cpp

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
// Copyright 2019 
#include "../../../modules/task_2/.../allreducee.h"
#include <cmath>
#include <cstring>
#include <stdexcept>
 
int Allreduce(void* sendbuf, void* recvbuf, int count, MPI_Datatype datatype,
  MPI_Op op, MPI_Comm comm) {
  if ((sendbuf == nullptr) || (recvbuf == nullptr))
  throw std::runtime_error("Send or receive null pointer.");
  // The memory buffer with the message being sent and the memory buffer for the resulting message null pointer
 
  if (count == 0) throw std::runtime_error("Is empty.");
  // Message buffer is empty
 
  if (datatype != MPI_INT && datatype != MPI_FLOAT && datatype != MPI_DOUBLE)
  throw std::runtime_error("Error");
  // Invalid data type
 
  if (op != MPI_SUM) throw std::runtime_error("Error");
  // Invalid operation
  if (op != MPI_SUM) throw std::runtime_error("Incorrect operation.");
 
  int rank, size;
  MPI_Comm_size(MPI_COMM_WORLD, &size);
  MPI_Comm_rank(MPI_COMM_WORLD, &rank);
 
  if (datatype == MPI_INT) std::memcpy(recvbuf, sendbuf, count * sizeof(int));
  if (datatype == MPI_FLOAT)
    std::memcpy(recvbuf, sendbuf, count * sizeof(float));
  if (datatype == MPI_DOUBLE)
    std::memcpy(recvbuf, sendbuf, count * sizeof(double));
 
  int delta;
  int exp = static_cast<int>(std::log2(size));
  for (int i = 0; i <= exp; ++i) {
    delta = static_cast<int>(std::pow(2, i));
    if (size > delta) {
      for (int proc = delta; proc < size;
        proc += static_cast<int>(std::pow(2, i + 1))) {
        if (rank == proc)
          MPI_Send(recvbuf, count, datatype, proc - delta, rank, comm);
 
        if (rank == proc - delta) {
          MPI_Status status;
          if (datatype == MPI_INT) {
            int* getbuf = new int[count];
            MPI_Recv(getbuf, count, datatype, proc, proc, comm, &status);
            for (int j = 0; j < count; ++j)
              static_cast<int*>(recvbuf)[j] += getbuf[j];
          } else if (datatype == MPI_FLOAT) {
            float* getbuf = new float[count];
            MPI_Recv(getbuf, count, datatype, proc, proc, comm, &status);
            for (int j = 0; j < count; ++j)
              static_cast<float*>(recvbuf)[j] += getbuf[j];
          } else if (datatype == MPI_DOUBLE) {
            double* getbuf = new double[count];
            MPI_Recv(getbuf, count, datatype, proc, proc, comm, &status);
            for (int j = 0; j < count; ++j)
              static_cast<double*>(recvbuf)[j] += getbuf[j];
          }
        }
      }
    }
  }
 
  if (rank == 0) {
    for (int proc = 1; proc < size; ++proc)
      MPI_Send(recvbuf, count, datatype, proc, proc + size, comm);
  } else {
    MPI_Status status;
    MPI_Recv(recvbuf, count, datatype, 0, rank + size, comm, &status);
  }
 
  return MPI_SUCCESS;
}

main.cpp


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
// Copyright 2019
#include <gtest/gtest.h>
#include <gtest-mpi-listener.hpp>
#include "./allreducee.h"
 
TEST(Allreduce_MPI, Test_on_Matrix_SIZEx10_INT) {
  int size;
  MPI_Comm_size(MPI_COMM_WORLD, &size);
  const int cols = 10;
 
  int* recv = new int[cols];
  int* send = new int[cols];
  for (int i = 0; i < cols; ++i) send[i] = 1;
 
  Allreduce(send, recv, cols, MPI_INT, MPI_SUM, MPI_COMM_WORLD);
 
  for (int i = 0; i < cols; ++i) ASSERT_EQ(recv[i], size);
}
 
TEST(Allreduce_MPI, Test_on_Matrix_SIZEx10_FLOAT) {
  int size;
  MPI_Comm_size(MPI_COMM_WORLD, &size);
  const int cols = 10;
 
  float* recv = new float[cols];
  float* send = new float[cols];
  for (int i = 0; i < cols; ++i) send[i] = static_cast<float>(2.);
 
  Allreduce(send, recv, cols, MPI_FLOAT, MPI_SUM, MPI_COMM_WORLD);
 
  for (int i = 0; i < cols; ++i) ASSERT_EQ(recv[i], (float)2. * size);
}
 
TEST(Allreduce_MPI, Test_on_Matrix_SIZEx10_DOUBLE) {
  int size;
  MPI_Comm_size(MPI_COMM_WORLD, &size);
  const int cols = 10;
 
  double* recv = new double[cols];
  double* send = new double[cols];
  for (int i = 0; i < cols; ++i) send[i] = 3.;
 
  Allreduce(send, recv, cols, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
 
  for (int i = 0; i < cols; ++i) ASSERT_EQ(recv[i], size * 3.);
}
 
TEST(Allreduce_MPI, Test_on_Matrix_SIZEx100000_INT) {
  int size;
  MPI_Comm_size(MPI_COMM_WORLD, &size);
  const int cols = 100000;
 
  int* recv = new int[cols];
  int* send = new int[cols];
  for (int i = 0; i < cols; ++i) send[i] = 1;
 
  Allreduce(send, recv, cols, MPI_INT, MPI_SUM, MPI_COMM_WORLD);
 
  for (int i = 0; i < cols; ++i) ASSERT_EQ(recv[i], size);
}
 
TEST(Allreduce_MPI, ASSERT_ANY_THROW_COUNT) {
  int size;
  MPI_Comm_size(MPI_COMM_WORLD, &size);
 
  int* recv = new int[10];
  int* send = new int[10];
  for (int i = 0; i < 10; ++i) send[i] = 1;
 
  ASSERT_ANY_THROW(Allreduce(send, recv, 0, MPI_INT, MPI_SUM, MPI_COMM_WORLD));
}
 
int main(int argc, char** argv) {
  ::testing::InitGoogleTest(&argc, argv);
  MPI_Init(&argc, &argv);
 
  ::testing::AddGlobalTestEnvironment(new GTestMPIListener::MPIEnvironment);
  ::testing::TestEventListeners& listeners =
    ::testing::UnitTest::GetInstance()->listeners();
 
  listeners.Release(listeners.default_result_printer());
  listeners.Release(listeners.default_xml_generator());
 
  listeners.Append(new GTestMPIListener::MPIMinimalistPrinter);
  return RUN_ALL_TESTS();
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.12.2019, 20:48
Ответы с готовыми решениями:

Кто может расшифровать код простыми словами - что здесь происходит?
'use strict'; const inventory = { items: , add(itemName) { console.log(`Adding ${itemName} to inventory`); ...

Что здесь неверно?(код вроде простой)
Что здесь неверно? def all_the_same(a): previous = a print(previous) for i in range(len(a)): if i == previous...

Объясните алгоритм пожалуйста и исправьте код
#include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;windows.h&gt; #include &lt;stdlib.h&gt; int main() { SetConsoleOutputCP(1251); ...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.12.2019, 20:48
Помогаю со студенческими работами здесь

Объясните, пожалуйста, что значит код, расположенный внутри тега, и код, расположенный внутри страницы?
Объясните, пожалуйста, что значит код, расположенный внутри тега, и код, расположенный внутри страницы. Не совсем понятно, чем они...

Как работает код и что происходит?
Как работает код и что происходит? Ну хоть чучуть объясните. using System.Collections.Generic; namespace Models { ...

Объясните что за код ?
if radiogroup2.ItemIndex=0 then if radiogroup1.ItemIndex=1 then answers:=true else answers:=false else ...

Что происходит с переменной? (Видео и код прилагаются)
Здравия всем! Я тут столкнулся во время отладки с одной очень странной проблемой. Есть вот такой код: *** // char...

Объясните подробно данный код программы. Знаю что это фильтр а пошагово что к чему не понимаю
void __fastcall TForm1::suiButton7Click(TObject *Sender) { tdiag -&gt; Filtered = false; tdiag -&gt; Filt = «id_p=« + suiEdit6 -&gt; Text; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru