Численная оптимизация
-
09-09-2019 - |
Вопрос
Мне было интересно, какие целочисленные или плавающие типы являются самыми быстрыми..
я думал, что byte быстрее, чем integer, потому что он имеет меньший диапазон.
Некоторые люди рассказали мне ..что в некоторых случаях целое число быстрее, чем байт.
второй вопрос :
ГПУ находится на пути к Мировому господству ..
поэтому я спросил себя :Может ли двойное значение "быть быстрее", чем Целое число ..из - за FPU
так где же эксперты ?:)
Решение
Вы должны думать не только о тактовых циклах, чтобы выполнить арифметические вычисления.Вы могли бы сказать, что добавление двух целых чисел занимает столько-то циклов, добавление двух двойных чисел занимает столько-то циклов и т.д.но это может быть неуместно.Если все ваши данные помещаются в кэш одновременно, то синхронизация отдельных операций имеет смысл.Но если нет, то дополнительное время, требуемое из-за промаха кэша, перевешивает разницу в отдельных операциях.Иногда работа с меньшими типами данных происходит быстрее, потому что это делает разницу между необходимостью извлекать что-то из кэша или нет, или необходимостью переходить на диск или нет.
В наши дни компьютеры тратят большую часть своего времени на перемещение данных, а не на арифметические действия, даже в приложениях для подсчета чисел.И соотношение первых ко вторым увеличивается.Вы не можете просто сравнить, например, время, необходимое для умножения коротких позиций, с удвоением.Вы можете обнаружить, что при наличии двух версий вашей программы одна версия быстрее справляется с небольшой задачей, а другая - с более крупной программой, и все это из-за относительной эффективности видов памяти.
Другие советы
я думал, что byte быстрее, чем integer, потому что он имеет меньший диапазон.
Что-то, что я испытал:используя short
дало мне повышение производительности, в то время как использование int
было просто прекрасно.Это связано с тем, что в архитектуре обычно не существует коротких замыканий.Это типы удобства.Процессор действительно работает с его размером слова.В моем случае размер слова соответствовал значению int.Итак, при доступе к short ему пришлось сначала упаковать значение в int, поработать с ним, а затем распаковать и получить мне результат в short.Все это привело к снижению производительности.Таким образом, чем короче, тем не обязательно лучше.
Это зависит от отсутствия битов данных в архитектуре.Процессор с плавающей запятой будет обрабатывать float и double одинаково при выполнении вычислений.Они оба вычисляются с 80-битной точностью и, следовательно, займут одинаковое количество времени.Загрузка и сохранение значений в регистры FPU может иметь значение.Double занимает в два раза больше места в оперативной памяти и поэтому может быть медленнее из-за промахов в кэше.Заметно, если у вас большие массивы, которые вы склонны индексировать случайным образом.
На уровне процессора нет байтов, только слова, которые в настоящее время являются 32-битными или 64-битными.Арифметические единицы обычно запрограммированы для работы с числами размером со слово (или больше, в случае чисел с плавающей запятой).
Таким образом, нет преимущества в скорости при использовании типов размером меньше слова в отношении арифметических операций, и может возникнуть ограничение скорости, потому что вам придется выполнять дополнительную работу, чтобы имитировать типы, которых у процессора нет изначально, напримерзапись одного байта в память требует, чтобы вы сначала прочитали слово, частью которого оно является, изменили его, а затем записали обратно.Чтобы избежать этого, большинство компиляторов фактически используют полное слово памяти для всех переменных меньшего размера, так что даже логическая переменная занимает 32 или 64 бита.
Однако, если у вас большой объем данных, например большой массив, то использование меньших типов обычно повышает производительность, поскольку у вас будет меньше пропусков в кэше.
Длина в байтах числовых типов зависит от языка, а иногда и от используемой платформы.Например, в java и int, и float используют 4 байта, поэтому время обработки должно быть равным.Однако меня бы удивило, что более длинные типы обрабатываются быстрее.Если есть доказательства этого, я хотел бы прочитать об этом.
О том, какой из них быстрее, целочисленный или байтовый, пока они оба помещаются в регистр, они работают одинаково или, по крайней мере, без заметной разницы.
О целочисленности и двойственности:Может быть, GPU выполняет более быструю арифметику с удвоением, чем обычный cpu, но я сомневаюсь, что он выполняет двойную арифметику быстрее, чем integer, поскольку целочисленная арифметика - это просто регистровая арифметика.
Самая большая оптимизация заключается в переходе от использования циклических скалярных вычислений к использованию векторных вычислений.Затем воспользуйтесь преимуществами SSE графического процессора или CPU.
Что ж, пока вы не выполняете никаких векторных оптимизаций, вы можете использовать целые числа размером с ваши регистры (32/64 бита) без какого-либо фактического снижения производительности.
Числа с плавающей запятой немного отличаются:В то время как процессоры оптимизированы для двойных вычислений, графические процессоры обычно работают с плавающими значениями.