Почему вы устанавливаете количество ячеек при попытке реализовать 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
, количество заданий на узел). Кроме того, вы можете создавать потоки для использования многоядерных процессоров.
На самом деле, вы вычисляете интегральное,
Вы разделяете интервал интеграции в
numProcs
части, поэтому каждая работа вычисляет свою часть, и в итоге все сводится к сокращению.
(слово cell
- не очень хорошее имя переменной в этом контексте)