В книге Компьютерные системы: программист Перспектива, упражнение 5.5 показывает фрагмент кода для вычисления значения полиномаОпределить критический путь в потоке данных
double poly(double a[], double x, int degree)
{
long int i;
double result = a[0];
double xpwr = x;
for (i = 1; i <= degree; i++) {
result += a[i] * xpwr;
xpwr = x * xpwr;
}
return result;
}
упражнения предполагает, что тактовые циклы, которые необходимы для сложения и умножения с плавающей запятой с двойной точностью, равны 3 и 5 соответственно. Читатель просит объяснить, почему измеренное CPE (Cycles Per Element) значение 5.
Согласно прогулочному ответу, в каждой итерации, нам необходимо обновить переменные xpwr
и result
, и операции, которые нам нужны является добавлением с плавающей запятой (для result
) и умножением с плавающей запятой (для xpwr
), поэтому последний доминирует в латентности, в результате чего конечный CPE составляет 5.
Но я думаю, что поток данных должен быть чем-то вроде это:
xpwr result
| |
+-----+ +--[load] |
| | | |
[mul] [mul] |
| | |
| +---+ +-----+
| | |
| [add]
| |
| +------+
| |
xpwr result
Таким образом, самый длинный путь от предыдущего значения xpwr
до нового значения result
, проходящий через исполнительные устройства [mul]
и [add]
. Поэтому самое длинное время должно быть 8 циклов.
Я хочу спросить
- Что именно смысл критического пути? И как это определить?
- Какой ответ (мой и книга) более разумный?
Любые объяснения относительно процессора, архитектуры, исполнительных блоков, конвейера, блока с плавающей точкой будут оценены.
'xpwr = x * xpwr;' это единственный оператор, который не полностью независим от итераций, поэтому это 5-тикратная латентность - это то, что мешает компьютеру быстрее работать. (Разумеется, это предполагает достаточную поддержку аппаратного обеспечения для использования параллелизма.) Достойный компилятор мог бы улучшить (по крайней мере, в более высокой степени), признав, что вычисление xpwr можно распараллелить, например, вычислить x^2 в первая итерация x * x^2 и x^2 * x^2 (параллельно) во втором, x^3 * x^2 и x^4 * x^2 в третьем и т. д. xpwr частично * имя * зависимость. Книга кажется неточной. –