@ahame

Что делают эти две функции?

Задача была нахождение наиболее близких соседних элементов вектора
int getMinDifferenceOneProc(const std::vector <int> Vec) {
  int difMin = INT_MAX;
  if (Vec.size() != 0) {
    for (int i = 0; i < static_cast<int>(Vec.size()) - 1; i++) {
      if (difMin > abs(Vec[i] - Vec[i + 1]))
        difMin = abs(Vec[i] - Vec[i + 1]);
    }
  }
  if (Vec.size() == 1) {
    return 0;
  }
  return difMin;
}

int getMinDifference(const std::vector <int> Vec) {
  int difMin = INT_MAX;
  int size, rank;
  MPI_Comm_size(MPI_COMM_WORLD, &size);
  MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  MPI_Status status;

  int modSize = Vec.size() - 1;
  int modf = modSize / size;
  int res = modSize % size;

  if (rank == 0) {
    if (modf > 0) {
      for (int noProc = 1; noProc < size; noProc++)
        MPI_Send(&Vec[res] + modf * noProc, modf + 1, MPI_INT, noProc, 0, MPI_COMM_WORLD);
    }
  } else {
    if (modf > 0) {
      std::vector<int> tmp(modf + 1);
      MPI_Recv(&tmp[0], modf + 1, MPI_INT, 0, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
      int minD = getMinDifferenceOneProc(tmp);
      MPI_Send(&minD, 1, MPI_INT, 0, 0, MPI_COMM_WORLD);
    }
  }
  if (rank == 0) {
    int procRest;
    std::vector<int> tmp(Vec.begin(), Vec.begin() + 1 + modf + res);
    difMin = getMinDifferenceOneProc(tmp);
    if (modf > 0) {
      for (int noProc = 1; noProc < size; noProc++) {
        MPI_Recv(&procRest, 1, MPI_INT, noProc, 0, MPI_COMM_WORLD, &status);
        difMin = std::min(difMin, procRest);
      }
    }
  }
  return difMin;
}
  • Вопрос задан
  • 108 просмотров
Пригласить эксперта
Ответы на вопрос 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Что делают эти две функции?

А в чём сложность взять и прочитать их код чтобы понять, что они делают?
Справку по функциям MPI можно найти, например, здесь.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы