В первом случае распараллеливание возможно только при наличии вторичной области хранения.Для максимального параллелизма вам понадобится совершенно отдельный массив:
for all i in [2, n-2] in parallel do
y'(i) = y(i+1)
end do
Если вы хотите использовать только два блока параллельного выполнения, вам потребуется хранилище для одного элемента массива:
e = y(n/2)
for all i in [0, 1] in parallel do
for j in [1, n/2 - 1] do
y(i*n/2 + j) = (y(i*n/2 + j)
end do
end do
y(n/2 - 1) = e
Вам нужно это, чтобы избежать состояния гонки на последнем элементе первой половины и первом элементе второй половины.На самом деле существует прямая связь между объемом дополнительной памяти, который вам нужен, и коэффициентом, с помощью которого вы распараллеливаете код.
Второй цикл не может быть распараллелен, поскольку вы должны вычислить y (i-1)вычислить у (я).Ни за что.Это не проблема для первого цикла, так как все значения, которые в конечном итоге читаются, гарантированно будут иметь правильное значение перед началом цикла.Не так во втором!
Для чего бы это ни стоило, эти циклы можно комбинировать, если они должны выполняться последовательно.Это было бы быстрее, чем распараллеливание первого и оставление второго в покое.