2009-02-27 9 views
4

Мне было интересно, какие типы Integer или Float являются самыми быстрыми.
Я думал, что байт быстрее целого, потому что он имеет меньший диапазон.
Некоторые люди сказали мне, что в некоторых случаях целое число быстрее, чем байт.Численная оптимизация

второй вопрос:
ГПУ находится на пути к мировому господству ..
так я спросил себя: Может ли двойник «быстрее», чем Integer .. из-за ПДП
так где эксперты ? :)

ответ

6

Вы должны думать больше, чем циклы часов для выполнения арифметики. Вы можете сказать, что добавление двух ints занимает много циклов, добавив два удвоения, которые занимают много циклов и т. Д., Но это может быть не актуально. Если все ваши данные вписываются в кеш одновременно, то выбор времени отдельных операций имеет смысл. Но если нет, дополнительное время, требуемое из-за ошибки кеша, доминирует над различием в отдельных операциях.Иногда работа с меньшими типами данных происходит быстрее, потому что это делает разницу между необходимостью вытаскивать что-то из кеша или нет, или нужно идти на диск или нет.

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

0

Длина байтов числовых типов зависит от языка, а иногда и от используемой вами платформы. Например, в java и int, и float используют 4 байта, поэтому время обработки должно быть равным. Меня удивляет, хотя более длинные типы обрабатываются быстрее. Если есть доказательства того, что я хотел бы прочитать об этом.

0

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

О integer vs.double: Может быть, GPU выполняет более быструю арифметику с удвоениями, чем обычный процессор, но я сомневаюсь, что она удваивает арифметику быстрее, чем целое число, поскольку целочисленная арифметика просто регистрирует арифметику.

0

Самая большая оптимизация переходит от использования циклических скалярных вычислений для использования векторных вычислений. Затем воспользуйтесь преимуществами GPU или CPU SSE.

0

Ну, пока вы не выполняете никаких векторных оптимизаций, вы можете использовать целые числа размером с регистры (32/64 бит) без какого-либо фактического удара производительности.

Номера с плавающей запятой немного отличаются: в то время как процессоры оптимизированы для удваивания, графические процессоры обычно работают с поплавками.

4

Я думал, что байт быстрее целого, потому что он имеет меньший радиус действия.

Что-то я испытал: с помощью short дал мне работу хит в то время как с помощью int было просто отлично. Это связано с тем, что в архитектуре обычно отсутствуют шорты. Это удобные типы. Процессор фактически работает со своим размером слова. В моем случае размер слова был размером слова int. Таким образом, при доступе к краткому нужно было сначала упаковать значение в int, работать с ним, а затем распаковать и получить результат в краткой форме. Все это привело к поражению производительности. Таким образом, короче не обязательно лучше.

+0

Да, шорты могут быть катастрофически медленными, особенно для архитектур PowerPC. – Crashworks

1

Это зависит от каких-либо данных в архитектуре. Процессор с плавающей запятой будет обрабатывать float и double одинаково при выполнении вычислений. Они оцениваются с 80-битной точностью и, следовательно, занимают одинаковое количество времени. Загрузка и сохранение значений в регистрах FPU может иметь значение. Double занимает в два раза больше места в ОЗУ и поэтому может быть медленнее из-за промахов в кеше. Заметно, если у вас есть большие массивы, которые вы склонны индексировать случайным образом.

+0

На самом деле, поплавки могут занять больше времени, из-за дополнительных шагов конвертирования из float в double и back. –

+0

Но все-таки зависит от того, требуется ли преобразование или нет. Некоторые делают зачистки там, где не требуется преобразование. – lakshmanaraj

1

На уровне процессора нет байтов, только слова, которые в настоящее время являются 32-битными или 64-битными. Арифметические устройства обычно жестко связаны с числами с размером слова (или больше, в случае с плавающей запятой).

Таким образом, нет преимущества скорости при использовании типов, меньших, чем слово в отношении арифметических операций, и может быть ограничение скорости, поскольку вам необходимо выполнить дополнительную работу, чтобы имитировать типы, которые у процессора нет изначально, например запись одного байта в память требует, чтобы вы сначала прочитали слово, в котором оно входит, измените его и затем запишите. Чтобы этого избежать, большинство компиляторов фактически используют полное слово памяти для всех меньших переменных, поэтому даже логическая переменная занимает 32 или 64 бита.

Однако, если у вас большой объем данных, например большой массив, то использование меньших типов обычно дает лучшую производительность, потому что у вас будет меньше промахов в кеше.