Параллельные операции в массиве с зависимостью

#c #task #openmp

#c #задача #openmp

Вопрос:

Мне нужна помощь в решении этой проблемы, у меня есть код с операциями, выполняемыми над предыдущим элементом массива, и мне нужно распараллелить с помощью задач openmp, однако я знаю, как устранить эту зависимость. Мой учитель говорит, что в этом случае неинтересно использовать depend (in, out) . Как бы я тогда удалил это, зависящее от этого?

 void sum_sequential(float a[N]) {
        a[0] = 1.0;

    for (int i = 1; i < N; i  )
        a[i] = 2 * a[i-1]   1;
}
  

Комментарии:

1. Вам нужно решение в закрытой форме?

Ответ №1:

Вы совершенно правы в том, что существует зависимость от данных. Значение, подлежащее вычислению для каждого элемента, выражается в терминах значения, ранее вычисленного для предыдущего элемента, поэтому этот алгоритм по своей сути является последовательным. В его распараллеливании нет практического преимущества, поскольку успешное решение зависимостей не оставляет места для какого-либо параллелизма.

ОДНАКО, если вы внимательно изучите вычисления, их можно повторно выразить алгебраически эквивалентным способом, который не имеет таких зависимостей — совершенно другой алгоритм, который дает те же результаты и тривиально распараллеливается. Рискуя дать слишком большую подсказку, попробуйте выписать первые несколько членов результатов вручную и посмотреть, узнаете ли вы простой шаблон.

Комментарии:

1. Фактически эта последовательность операций может быть выражена суммированием и, следовательно, может быть упрощена. Вопрос заключался в том, как распараллелить этот код, и, как вы сказали, он последовательный. Завтра я поговорю со своим учителем об этом упражнении, которое я на самом деле не считаю параллельным. Спасибо.

2. @SUdoW можете ли вы принять ответ Джона, пожалуйста? Спасибо.