Я работаю над проектом с MPI, но столкнулся с проблемой при попытке написать программу.
В настоящее время у меня есть следующее
int rank, numRanks;
MPI_Init(NULL, NULL);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &numRanks);
if(rank == 0){
//do some initialisation
}
//logic begins
if(rank == 0){
for(i=0 to 10){
//some basic checks
MPI_Scatter() /* scattering an array to all processes */
MPI_Bcast() /* sending a value to all processes */
//some heavy computations on the part of the array
MPI_Barrier()
MPI_Reduce() /* reducing the output of all processes' heavy computation to a single number */
printf(valueFromReduce)
}
else{
//some heavy computations on the part of the array (same code as the one in rank 0)
MPI_Barrier()
}
Идея кода заключается в следующие:
- инициализировать
l oop несколько раз
2.1. root процесс выполняет некоторые базовые c проверки / вычисления
2.2. root разбивает массив на все процессы для ускорения интенсивных вычислений
2.3. все процессы выполняют вычисления для своей части массива
2.4. выходы преобразуются в процесс ранга 0 после каждого вычисления и печатаются
В настоящее время проблема кода связана с рассеянием и трансляцией данных - дочерние процессы начинают выполняться до широковещательной передачи / разброс выполняется.
Можно ли разбрасывать / транслировать данные с ранга 0 на все ранги?