Как определить зависимость параллелизма на уровне цикла от будущей итерации предыдущего оператора?

#c #parallel-processing #dependencies

#c #параллельная обработка #зависимости

Вопрос:

Если оператор (S1) зависит от БУДУЩЕЙ итерации предыдущего оператора (S0), считается ли это истинной зависимостью, потому что S0 предшествует S1, или антизависимостью, потому что i 1 (S1) следует за i (S0)?

Рассмотрим этот цикл:

 for (i=1; i<=N; i  ) {
  for (j=N; j>=i; j--­­) {
       MatrixY[i][j] = blah_blah_irrelevant_for_question; //S0
       MatrixZ[i][j] = MatrixY[i­ 1][j-1]; //S1
}
}
  

Можем ли мы написать:

 S0[i, j] ->T S1[i-1, j 1] 
  

Или мы должны написать:

 S0[i, j] ->T S1[i, j 1]  AND S0[i, j] ->A S1[i-1,j] 
  

Сначала я думал о первом, но теперь я думаю о втором.

Ответ №1:

Это антизависимость.

Альтернативный термин «зависимость записи после чтения» здесь более полезен. Оператор S1 считывает и использует значение (к нему) MatrixY[i­ 1][j-1] . Значение этого объекта позже записывается при выполнении инструкции S0, которая является записью после чтения. Если бы относительный порядок выполнения этих двух операций — одно чтение и одна запись в одном и том же местоположении — были изменены, то вычисление привело бы к другому, предположительно нежелательному результату.

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

То, как вы выражаете зависимость, зависит от используемого вами формализма.

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

1. Я полагаю, что на самом деле это тоже антизависимость от цикла j? (j-1) Поскольку j выполняет итерацию в обратном направлении (j—), то здесь вообще нет никаких истинных зависимостей, на самом деле?

2. @whoami, это j повторение в обратном направлении не имеет значения в конкретных обстоятельствах, представленных в вопросе. В отношении только того, что представлено, внутренний цикл может быть запущен вперед, а не назад, без изменения результата (последовательного выполнения) представленного кода.