Программная конвейеризация
Разворот цикла традиционными методами (см. "разворот циклов") порождает зависимость по данным. Вернемся к листингу3. Смотрите, хотя загрузка обрабатываемых ячеек происходит параллельно (ну… практически параллельно, они будут ползти по конвейеру находясь на различных стадиях готовности), следующая операция сложения не может быть начата до тех пор, пока не будет завершена предыдущая.
Для усиления параллелизма, необходимо суммировать все ячейки в своих переменных, как показано ниже:
// обрабатываем первые XXL
– (XXL
% 4) итераций
for(i=0; i<XXL;i+=4)
{
sum_1 += a[i+0];
sum_2 += a[i+2];
sum_3 += a[i+3];
sum_4 += a[i+4];
}
// обрабатываем оставшийся "хвост"
for(i-=XXL; i<XXL;i++)
sum += a[i];
// складываем все воедино
sum += sum_1 + sum_2 + sum_3 + sum_4;