MPI OpenMP Hybrid медленнее, чем чистый MPI - PullRequest
0 голосов
/ 13 апреля 2019

С чистым 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);
...