@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;
}
  • Вопрос задан
  • 88 просмотров
Пригласить эксперта
Ответы на вопрос 1
jcmvbkbc
@jcmvbkbc
http://dilbert.com/strip/1998-08-24
Что делают эти две функции?

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

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

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