Операции с Double намного быстрее чем операции с float?

vertyal17

Я заметил, что double занимает 8 байт памяти на моей 32-разрядной машине. Таким образом, я так понимаю, если операция умножения float * float может занимать 1 регистровую команду, то умножение double * double вроде как должно занимать больше одной каманды.
Можно ли ожидать, при использовании float вместо double, в интенсивных математических расчетах, значительного увеличения производительности (сравнимое с увеличением в два раза) (Язык Си++)?
Эмпирическая проверка в матлабе, показала что использование single вместо double дает значительный выигрыш в производительности.

vall

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

aleks058

Помнится, кто-то из преподов рассказывал, что проц при вычислениях работает с даблами.
Если встречается флоат, он его растягивает до дабла, производит вычисления и обрезает обратно до флоата. От этого возможны тормоза.
Не знаю, насколько это верно...

psihodog

А я так и не понял, что у тебя быстрее получилось?
> Операции с Double намного быстрее чем операции с float?
> Эмпирическая проверка в матлабе, показала что использование single вместо double дает значительный выигрыш в производительности.

Olenenok

Это стопудово из-за памяти. А так, если использовать x87, и float, и double сначала приводятся к 10-байтному формату сопроцессора. А если sse2, то фиг его знает.

zzzzzzzzzzz

Причем тут C++? Вопрос в архитектуре. Если пользовать PC, где всякие там SSE и 3DNow!, то прикинуть выигрыш нетрудно: часто будет в два раза больше значений за инструкцию и в два раза меньше обращений к памяти.

mira-bella

Я заметил, что double занимает 8 байт памяти на моей 32-разрядной машине. Таким образом, я так понимаю, если операция умножения float * float может занимать 1 регистровую команду, то умножение double * double вроде как должно занимать больше одной каманды.
Можно ли ожидать, при использовании float вместо double, в интенсивных математических расчетах, значительного увеличения производительности (сравнимое с увеличением в два раза) (Язык Си++)?
Эмпирическая проверка в матлабе, показала что использование single вместо double дает значительный выигрыш в производительности.
все может быть совершенно по-разному в зависимости от архитектуры и компилятора
для x86 архитектуры при компиляции с использованием только FPU, разницы почти никакой не будет (как уже сказали, и float и double преобразуются в 10 байтовый тип, обычно обозначаемый long double, с ним производятся вычисления и происходит обратное преобразование, так что быстрее и точнее всех long double)
Если же компилятор хорошо оптимизирует под SSE2 или 3dNow и вычисления хорошо векторизуемы, т.е. часто над многими аргументами происходят одни и те же операции независимо и т.п., то использование меньших типов действительно может дать значительное преимущество.
Для других архитектур еще кроме аналогичных вышеописанным могут быть ситуации: (1) где для float и double есть инструкции (в частности мб float==double) и следовательно разницы почти никакой, (2) где только для double есть инструкции и следовательно float конвертится в double и наоборот (т.е. использование float чуть медленнее (3) где отсутствует поддержка floating point вычислений на уровне оборудования (например i386 без FPU и многие древние процы) и соответственно все зависит от эмулятора, понятно, что вероятнее float будет быстрее, (4) теоретически можно предположить возможность архитектуры, где только для float существуют инструкции, но вроде таких нет (разве что если float от 8 байт, но это уже скорее специфика компилятора, что он это float обозвал).

4223080

как уже сказали, и float и double преобразуются в 10 байтовый тип, обычно обозначаемый long double, с ним производятся вычисления и происходит обратное преобразование, так что быстрее и точнее всех long double
На x86 по крайней мере в MS Visual Studio 6.0 "long double"="double" (т.е. он 8-ми байтовый). В Borland C++ v5.02 (это последний борланд на котором я работал) sizeof(long double)=10
А вот как в других компилерах? В VS2005, например? Подскажите
Оставить комментарий
Имя или ник:
Комментарий: