Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > OpenMP: распараллеливание цикла


Автор: Juze 6.6.2019, 14:44
Здравствуйте, помогите в решении задачи по распараллеливанию цикла 3 способами. С 1-ым я справился, в 3 пробовал через директиву firstprivate но не вышло, а 2й вообще нет идей как сделать. Заранее спасибо.
1) использовать синхронизации типа atomic
2) каждый поток пишет в свою рабочую память, потом результаты складываются
3) прямое умножение делается как обычно , транспонированное умножение - каждый поток пишет только в свою часть выходного вектора, т.е. читает всю матрицу, а обрабатывает те данные, которые попадают в его область записи.

Последовательный код
Код

for (i = 0; i < N; i++)
{
  for (j = RowIndex[i]; j < RowIndex[i + 1]; j++)
  {
    result[i] += val[j] * vector[col[j]];
    if (i != col[j])
    {
      result[col[j]] += val[j] * vector[i];
    }
  }
}


1.
Код

  #pragma omp parallel for private(i, j)
  for (i = 0; i < N; i++)
  {
    for (j = RowIndex[i]; j < RowIndex[i + 1]; j++)
    {
      #pragma omp atomic
      result[i] += val[j] * vector[col[j]];
      if (i != col[j])
      {
        #pragma omp atomic
        result[col[j]] += val[j] * vector[i];
      }
    }
  }

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)