С чистым MPI мое время выполнения составляет 3,7 с
При использовании гибридного MPI + OpenMP время выполнения становится равным 4,1 с
чистый MPI работал с 16 узлами, по 1 ядру в каждом.
чистый MPI работал с 1 узлом, 16 ядрами.
Гибридный MPI + OpenMP работал с 16 узлами, по 16 ядер в каждом
Я попробовал отладку printf, и все процессы получили 16 ядер, как ожидалось.
Любое понимание поможет!
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &myRank);
MPI_Comm_size(MPI_COMM_WORLD, &numNodes);
while ( dtMain > MAX_TEMP_ERROR && iteration <= max_iterations ) {
#pragma omp parallel for private(i, j)
for(i = 1; i <= ROWS; i++) {
for(j = 1; j <= COLUMNS; j++) {
Temperature[i][j] = 0.25 * (Temperature_last[i+1][j] + Temperature_last[i-1][j] +
Temperature_last[i][j+1] + Temperature_last[i][j-1]);
}
}
if(myRank != LAST) {
MPI_Send(&Temperature[ROWS][1], COLUMNS, MPI_DOUBLE, myRank + 1, 0, MPI_COMM_WORLD);
}
if(myRank != FIRST) {
MPI_Recv(&Temperature_last[0][1], COLUMNS, MPI_DOUBLE, myRank - 1, 0, MPI_COMM_WORLD, &status);
}
if(myRank != FIRST) {
MPI_Send(&Temperature[1][1], COLUMNS, MPI_DOUBLE, myRank - 1, 1, MPI_COMM_WORLD);
}
if(myRank != LAST) {
MPI_Recv(&Temperature_last[ROWS + 1][1], COLUMNS, MPI_DOUBLE, myRank + 1, 1, MPI_COMM_WORLD, &status);
}
dt = 0.0; // reset largest temperature change
#pragma omp parallel for private(i, j) reduction(max:dt)
for(i = 1; i <= ROWS; i++){
for(j = 1; j <= COLUMNS; j++){
dt = fmax( fabs(Temperature[i][j]-Temperature_last[i][j]), dt);
Temperature_last[i][j] = Temperature[i][j];
}
}
MPI_Allreduce(&dt, &dtMain, 1, MPI_DOUBLE, MPI_MAX, MPI_COMM_WORLD);
iteration++;
}
MPI_Barrier(MPI_COMM_WORLD);