Forest
|
Carpal Tunnel
|
|
|
|
Рег.: 29.08.2002
|
Сообщений: 11597
|
|
Рейтинг: 795
|
|
Re: Оптимизируются ли тривиальные операции?
[re: Xanderus]
18.11.2007 22:24
|
|
|
В ответ на:
А насчет умножения на 0 - если оно не целочисленное, то результат может и не нулем быть.
Это как это? Если так происходит - это ошибка Или процы уже дошли до того, что нулем как таковым не оперируют, а оперируют минимальным числом?
|
|
monoid
|
|
|
|
|
Рег.: 14.02.2004
|
Сообщений: 1689
|
Из: ГЗ::Б::12
|
Рейтинг: 1331
|
|
Re: Оптимизируются ли тривиальные операции?
[re: Forest]
18.11.2007 23:20
|
|
|
Многие процессоры при реализации вещественной арифметики следуют стандарту IEEE 754 (иногда с отклонениями), в котором есть представления "бесконечностей" различных знаков и "не-числа":
code:
$ cat nan.c
#include <stdio.h>
int main(void)
{
double inf_p = 1.0/0.0, inf_n = (-1.0)/0.0, nan = 0.0/0.0;
printf ("+INF: %g, +INF*0: %g, -INF: %g, -INF*0: %g, NaN: %g, NaN*0: %g\n",
inf_p, inf_p*0.0, inf_n, inf_n*0.0, nan, nan*0.0);
return 0;
}
$ gcc nan.c
$ ./a.out
+INF: inf, +INF*0: nan, -INF: -inf, -INF*0: nan, NaN: nan, NaN*0: nan
Кстати, любопытный факт: нули в IEEE 754 тоже разных знаков, и нейтральным элементом относительно сложения является именно отрицательный ноль: (+0) + (+0) = (+0) (-0) + (-0) = (-0) (-0) + (+0) = (+0)
Fj_, DarkGray, Xanderus: я знаю про такое явление как параллелизм на уровне команд, спасибо. Вы что, ребята, вообще? Я не хотел превращать тред в разгоряченный спор со взаимными оскорблениями. Извините. Но молча пропустить неправильное утверждение тоже не смог. Еще раз. Есть конкретное понятие "латентности операции". Для большинства арифметических операций она постоянна. Для загрузки числа из памяти, например, латентность переменна, так как оно может лежать в кеше или в оперативке. Утверждение про "умножение занимает один такт" в контексте параллелизма на уровне команд некорректно, хотя бы потому, что никак не ссылается на то, лежит ли это умножение на критическом пути вычислений, или нет. Вот если я скажу, что поскольку декодеры команд популярных процессоров пропускают не более трех инструкций за такт, поэтому при достаточном параллелизме на уровне команд можно считать, что умножение занимает треть такта, как вы к этому отнесетесь?
|
# |
|
DizzyDen
|
достаточно добр
|
|
|
|
Рег.: 04.03.2003
|
Сообщений: 51430
|
Из: http://лакалхвост
|
Рейтинг: 13545
|
|
Re: Оптимизируются ли тривиальные операции?
[re: monoid]
19.11.2007 13:51
|
|
|
Quote:
Вот если я скажу, что поскольку декодеры команд популярных процессоров пропускают не более трех инструкций за такт, поэтому при достаточном параллелизме на уровне команд можно считать, что умножение занимает треть такта, как вы к этому отнесетесь?
Ну это, собственно, и есть затраты на умножение в момент пиковой производительности.
|
If stateless paradigm is good for your code, why shouldn't it be for your country? |
|
DarkGray
|
Carpal Tunnel
|
|
|
|
Рег.: 30.09.2002
|
Сообщений: 31421
|
|
Рейтинг: 8956
|
|
Re: Оптимизируются ли тривиальные операции?
[re: monoid]
19.11.2007 18:18
|
|
|
Quote:
поэтому при достаточном параллелизме на уровне команд можно считать, что умножение занимает треть такта, как вы к этому отнесетесь?
отлично. если это справедливо для реальной программы, то чем плоха оценка - что умножение выполняется за треть такта?
|
|
|
Re: Оптимизируются ли тривиальные операции?
[re: DarkGray]
19.11.2007 21:53
|
|
|
Лингвистически такая конструкция выглядит странно. Что физически могло выполниться за треть такта? oO
|
|
DizzyDen
|
достаточно добр
|
|
|
|
Рег.: 04.03.2003
|
Сообщений: 51430
|
Из: http://лакалхвост
|
Рейтинг: 13545
|
|
|
Ты не поверишь - операция с вещественными аргументами!
|
If stateless paradigm is good for your code, why shouldn't it be for your country? |
|
|
Re: Оптимизируются ли тривиальные операции?
[re: DizzyDen]
20.11.2007 14:29
|
|
|
Ага ) В это точно не поверю :-D
Но я всегда думал, что такт задает наименьший промежуток между стационарными состояниями на процессоре. И только в этих состояниях ясно, что операция начала выполняться или выполнилась. Это не так?
|
|
Fj_
|
Carpal Tunnel
|
|
|
|
Рег.: 12.09.2004
|
Сообщений: 8795
|
|
Рейтинг: 3287
|
|
|
Но я всегда думал, что такт задает наименьший промежуток между стационарными состояниями на процессоре. И только в этих состояниях ясно, что операция начала выполняться или выполнилась. Это не так? ---
А хз. Тактовая частота == Clock frequency, то есть это частота центрального кварца на процессоре, не больше и не меньше. Разумеется, внутри процессора есть тыща умножителей и делителей частоты, которые синхронизируют разнообразные процессы, так что хотя некая корреляция между тактовой частотой и реальной латентностью операций есть, статуса закона у нее нет.
Моноид, конечно, прав, говоря, что понятие латентности (то есть минимального времени выполнения данной операции in respect to clock frequency на данном конкретном процессоре) вполне определено, наиболее соответствует неформальному определению "длительность операции" и у операции умножения на исследованных нами современных процах латентность вовсе не 1 такт. И, кстати, видимо меньше, чем у условного перехода. Окей, я был терминологически неправ!
Что касается усредненного времени, я теперь даже и не знаю. Я проверил - в том же коде дописывание if (k != 0) (я смотрел в листинг, ничего не отоптимизировалось) тоже параллелится с самим умножением (укладываясь в те же три такта, независимо от того, чему равно k). Пытаться построить сложный случай, чтобы выяснить, как джамп влияет на кэш инструкций и предсказатель переходов, мне влом.
|
The data is the error (c)IIS FTP Server. |
|
blind
|
still alive
|
|
|
|
Рег.: 16.01.2004
|
Сообщений: 23129
|
Из: Хамовники
|
Рейтинг: 16483
|
|
Re: Оптимизируются ли тривиальные операции?
[re: Fj_]
21.11.2007 00:46
|
|
|
усредненное время исполнения инструкции бессмысленно - как оно будет в реальности сильно зависит от процессора, окружающего кода и состояния кэша. для разумной оценки нужна более сложная модель чем время_выполнения(кода_кусок) = сумма(среднее_время(инструкция))
видел статейку где авторы ужасались от хаотичного поведения современных процессоров -- из-за сложной работы с памятью и кэшами время исполнения кода крайне нестабильно.
|
13/37 =) |
|