Комментарии 17
Правильно ли я понимаю, что «магические числа» вроде 0x92492492 — это на самом деле hex представление этих самых fixed point чисел?
Кстати, в Intel Ice Lake уменьшили латенси у idiv более чем в 5 раз до 18 циклов (не помню на счет пропускной способности) — а это уже не так страшно как ранее.
Это случайно не перевод? Уж слишком статья пестрит бессмысленными применениями английских терминов или даже фраз:
Выглядит weird и unnaturaly.
Особенно это:
можем получить Latency в 25-119 clock cycles, а reciprocal throughput — 25-120.
Fraction часть числа B.
умножению на truncating with rounding up 0.1
Выглядит weird и unnaturaly.
Особенно это:
получение старших битов 64 битного произведения в C++ коде реализуется интринсиком (something like mulh)
Тоже открывал эту Америку, что умножение — 1 такт, деление — 14, и велосипед изобретал.
А вот авторы gcc это знали давно, поэтому наколхоживание псевдоумножений в коде ничего не дало, только испортило читаемость.
Если не просят оптимизировать и ускорять, лучше не усложнять. Или сразу считать в q63.
А вот авторы gcc это знали давно, поэтому наколхоживание псевдоумножений в коде ничего не дало, только испортило читаемость.
Если не просят оптимизировать и ускорять, лучше не усложнять. Или сразу считать в q63.
Спасибо, давно искал эту тему на русском!
… и такие исходники, которые junior и middle разработчики не поймут и не смогут поддерживать.
Вот так, на ровном месте, можно себе и компании создать проблемы.
Но, теперь, когда вы понимаете как это работает, можете сами с легкостью заменить деление — умножением, не полагаясь на милость компилятору
… и такие исходники, которые junior и middle разработчики не поймут и не смогут поддерживать.
Вот так, на ровном месте, можно себе и компании создать проблемы.
Ну, сложно сказать — если контора математическая, код документируется, то вроде должно быть ОК. Собственно, в Алгоритме Ruy(printf) — сделано умножением, правда, со сдвигами. То есть, сий инженер из g00gl3 по факту написал тоже самое, что делают компиляторы видя / 10, оставив все теже сдвиги :]
Тема давно изложена на русском языке. Уоррен Г. «Алгоритмические трюки для программистов» bookfi.net/dl/437262/99b72b
Ну а прием этот эффективно работает далеко не всегда.
Ну а прием этот эффективно работает далеко не всегда.
И да, «магические числа» — это из Уоррена. Так что Автор читал, но умолчал об источнике.
Простите, но я не понял о чём статья:
…если делитель известен на этапе компиляции, есть возможность заменить целочисленное деление умножением и логическим сдвигом вправо (а иногда, можно обойтись и без него вовсе — я конечно про реализацию в Языке Программирования)Если у меня в коде есть выражение X/10, что мне мешает просто заменить его на X*0.1?
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Делись, рыбка, быстро и нацело