Почему вы устанавливаете количество ячеек при попытке реализовать OpenMPI

Я пытаюсь узнать, как использовать OpenMPI и наткнулся на этот пример кода

#include "mpi.h”
int main(int argc, char **argv)
{
  // Call MPI initialization
  MPI_Init(&argc, &argv);

  // Get my processor ID and number of processor
  int myProcID;
  int numProcs;
  MPI_Comm_rank(MPI_COMM_WORLD, &myProcID);
  MPI_Comm_size(MPI_COMM_WORLD, &numProcs);

  // Set number of cells from command line argument
  int numCells  = atoi(argv[1]);

 <etc…>

  // Find which piece of the integral this 
  // processor is responsible for
  int numCellsPerProc = numCells/numProcs;
  int myStart = myProcID * numCellsPerProc;
  int myEnd   = myStart + numCellsPerProc;

  // Account for unequal load by making sure 
  // last processor has correct end
  if (myProcID == numProcs - 1) myEnd = numCells;
  // Loop over cells and compute integral 
  // using trapezoidal rule
  double myResult = 0.0;
  for (int i = myStart; i < myEnd; ++i)
  {
    double xL = xMin + i*dx;
    double xR = xL + dx;
    myResult += 0.5 * (myFunction(xL)+myFunction(xR)) * dx;
  }

  // Sum result across processors
  double totalResult;
  MPI_Reduce(&myResult, &totalResult, 1, MPI_DOUBLE, MPI_SUM,
             0, MPI_COMM_WORLD);

  // Print the result, but only from root processor
  if (myProcID == 0)
  {
    std::cout << "result = ";
    std::cout << std::fixed << std::setprecision(10)
              << totalResult << std::endl;
  }

  // Call MPI_Finalize
  MPI_Finalize();

  return 0;
}

<etc>

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

  // Set number of cells from command line argument
  int numCells  = atoi(argv[1]);

 <etc…>

  // Find which piece of the integral this 
  // processor is responsible for
  int numCellsPerProc = numCells/numProcs;
  int myStart = myProcID * numCellsPerProc;
  int myEnd   = myStart + numCellsPerProc

1 ответ

Решение

Это зависит от аргумента командной строки - argv[1] - сколько заданий у вас будет на узел (например, в OpenMPI вы можете указать, через -N, количество заданий на узел). Кроме того, вы можете создавать потоки для использования многоядерных процессоров.

На самом деле, вы вычисляете интегральное
\ int_0 ^ cell myFunction (x) \ mathrm {d} x,
Вы разделяете интервал интеграции [0, клетка] в numProcs части, поэтому каждая работа вычисляет свою часть, и в итоге все сводится к сокращению.

(слово cell - не очень хорошее имя переменной в этом контексте)

Другие вопросы по тегам