Использование OpenMP в программе MPI - PullRequest
0 голосов
/ 27 мая 2020

У меня есть итеративная программа решателя разреженных матриц, реализованная в MPI, и я хочу улучшить производительность программы с помощью OpenMP. Я знаю, что их можно комбинировать, но я застрял в их сочетании. Когда я использую OpenMP, я получаю огромное замедление. Под огромным я подразумеваю, что время выполнения увеличивается с 1,5 до 5,5 секунд.

Кроме того, в программе нет проблем с корректностью, мне нужна только помощь для реализации OpenMP.

Примечание: CSR формат используется в вычислениях. Итак, у нас есть указатели row, col и val.

Я применил OpenMP как;

for(int k = 0; k < time_steps; k++) 
{
    #pragma omp parallel for num_threads(16) shared(row_count)
    for(int i = 0; i < row_count; i++)
    {
        local_res[i] = 0.0;
        for(int j = rowptr[i]; j < rowptr[i+1]; j++)
        {   
            local_res[i] += valptr[j - elm_displs] * rhs[colptr[j - elm_displs]];
        }
    }

    #pragma omp barrier
    MPI_Allgatherv(local_res, row_count, MPI_DOUBLE, final_res, rowCounts, rowDispls, MPI_DOUBLE, MPI_COMM_WORLD);

    #pragma omp parallel for num_threads(16) shared(nrows)
    for(int i = 0; i < nrows; i++)
    {
        rhs[i] = final_res[i];
    }
} 

Где массивы;

local_res = (double*)malloc(sizeof(double) * nrows);
final_res = (double*)malloc(sizeof(double) * nrows);

Значения:

int nrows // number of rows in the global matrix
int row_count // number of rows for a process, each process has its own row_count.
int elm_displs // starting index of elements in a process for col indexes and matrix values.

Итак, каждый процесс вычисляет свою часть умножения и сохраняет ее в локальный результат, а затем все они получают вектор общего результата и копируют его в правую часть (правую часть). Я не очень разбираюсь в OpenMP, я знаю только основы. Так что любой совет или рекомендация по ресурсам были бы замечательными.

...