0 / 0 / 0
Регистрация: 18.12.2020
Сообщений: 3
1

Что делает данный код на C++, MPI

18.12.2020, 22:42. Показов 1211. Ответов 0
Метки c++, mpi (Все метки)

Author24 — интернет-сервис помощи студентам
Задача: Вычисление многомерных интегралов методом Монте Карло. Реализовать параллельную и последовательную схему.
Что делает данный код по шагам, объясните, пожалуйста.

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
double MonteCarloSequential(
    std::vector<double> a, double sd,
    double (*pfunction)(std::vector<double>), bool (*parea)(std::vector<double>),
    unsigned int dim, int p_count) {
  std::mt19937 gen;
  gen.seed(static_cast<unsigned int>(time(0)));
  std::uniform_real_distribution<> urd(0, 1);
 
  std::vector<double> p(dim * p_count);
  for (unsigned int i = 0; i < p.size(); i++) {
    p[i] = a[i % dim] + urd(gen) * sd;
  }
 
  int n = 0;
  double val = 0;
 
  for (int i = 0; i < p_count; ++i) {
    std::vector<double> cpoint;
    for (unsigned int j = 0; j < dim; ++j) {
      cpoint.push_back(p[dim * i + j]);
    }
    if (parea(cpoint)) {
      n++;
      val += pfunction(cpoint);
    }
  }
 
  val = val / n;
  double area = std::pow(sd, dim) * n / p_count;
 
  return area * val;
}
 
double MonteCarloParallel(std::vector<double> a, double sd,
                                   double (*pfunction)(std::vector<double>),
                                   bool (*parea)(std::vector<double>),
                                   unsigned int dim, int p_count) {
  if (a.size() != dim) throw(1);
 
  int size, rank;
  MPI_Comm_size(MPI_COMM_WORLD, &size);
  MPI_Comm_rank(MPI_COMM_WORLD, &rank);
 
  int delta = p_count / size;
  std::vector<double> p(dim * p_count);
 
  if (rank == 0) {
    std::mt19937 gen;
    gen.seed(static_cast<unsigned int>(time(NULL)));
    std::uniform_real_distribution<> urd(0, 1);
    for (unsigned int i = 0; i < p.size(); i++) {
      p[i] = a[i % dim] + urd(gen) * sd;
    }
  }
 
  std::vector<double> loc_p(delta * dim);
 
  MPI_Scatter(&p[0], delta * dim, MPI_DOUBLE, &loc_p[0],
              delta * dim, MPI_DOUBLE, 0, MPI_COMM_WORLD);
 
  int loc_n = 0;
  int n = 0;
  double loc_val = 0;
  double val = 0;
 
  for (int i = 0; i < delta; ++i) {
    std::vector<double> cpoint;
    for (unsigned int j = 0; j < dim; ++j) {
      cpoint.push_back(loc_p[dim * i + j]);
    }
    if (parea(cpoint)) {
      loc_n++;
      loc_val += pfunction(cpoint);
    }
  }
  MPI_Reduce(&loc_n, &n, 1, MPI_INT, MPI_SUM, 0,
             MPI_COMM_WORLD);
  MPI_Reduce(&loc_val, &val, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);
 
  val = val / n;
  double area = std::pow(sd, dim) * n / p_count;
 
  return area * val;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.12.2020, 22:42
Ответы с готовыми решениями:

Что делает данный код?
for (int i = 0; i&lt;s1.length(); i++) if (s2.find(s1) != string::npos) cout &lt;&lt;...

Что делает данный код?
#include &lt;iostream&gt; #include &lt;queue&gt; using namespace std; int main() { queue &lt;int&gt; x1;...

Что делает данный код?
Подскажите что делаеть этот код? const String ConnStr = &quot;Provider=%s;Data Source=%s;Mode=%s&quot;; ...

Что делает данный код?
Подскажите что делает этот код? template&lt;typename T&gt; T RPM(SIZE_T address) { T buffer;...

0
18.12.2020, 22:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.12.2020, 22:42
Помогаю со студенческими работами здесь

Скажите, что делает данный код?
Решил немного поэкспериментировать и столкнулся с чем-то новым и непонятным для меня. Что делает...

есть предположение, что делает данный код
Я пытался собрать X Ray Engine 1.6 по исходникам. исправлял все ошибки, которые встречал, пока не...

есть предположение, что делает данный код
Я решил собрать X Ray Engine 1.6 из исходников. Исправлял все ошибки, которые появлялись, пока не...

Что делает данный код и зачем такое кому-нибудь может понадобиться?
Я ответил на вопрос,но точной формулировки не нашёл,хотел бы свериться(приложения с ответами...

Обьясните пожайлуста как и что делает данный оператор в этом выражении fState [x][y] ^= 1;. Неполный код привожу ниже.
Вот код программы из книжки Ч. Петзолд (Програмирование для Windows® 95) #define DIVISIONS 5 ......

Что делает данный цикл?
void startAgain() { int i = 0, j = 0, n = 3; for (i = 0; i &lt; 3; i++) { for (j = 0; j &lt; 3;...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru