У меня есть итеративная программа решателя разреженных матриц, реализованная в 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, я знаю только основы. Так что любой совет или рекомендация по ресурсам были бы замечательными.