2013-10-05 3 views
4

Я рассматриваю следующие C++ программа:32 бит против 64 бита: Массивная выполнения Разница

#include <iostream> 
#include <limits> 


int main(int argc, char **argv) { 
    unsigned int sum = 0; 
    for (unsigned int i = 1; i < std::numeric_limits<unsigned int>::max(); ++i) { 
     double f = static_cast<double>(i); 
     unsigned int t = static_cast<unsigned int>(f); 
     sum += (t % 2); 
    } 
    std::cout << sum << std::endl; 
    return 0; 
} 

Я использую GCC/G ++ компилятора с, г ++ -v дает GCC версии 4.7.2 20130108 [GCC-4_7- версия филиала 195012] (SUSE Linux). Я запускаю openSUSE 12.3 (x86_64) и имею процессор Intel (R) Core (TM) i7-3520M.

Запуск

g++ -O3 test.C -o test_64_opt 
g++ -O0 test.C -o test_64_no_opt 
g++ -m32 -O3 test.C -o test_32_opt 
g++ -m32 -O0 test.C -o test_32_no_opt 

time ./test_64_opt 
time ./test_64_no_opt 
time ./test_32_opt 
time ./test_32_no_opt 

дает

2147483647 

real 0m4.920s 
user 0m4.904s 
sys  0m0.001s 

2147483647 

real 0m16.918s 
user 0m16.851s 
sys  0m0.019s 

2147483647 

real 0m37.422s 
user 0m37.308s 
sys  0m0.000s 

2147483647 

real 0m57.973s 
user 0m57.790s 
sys  0m0.011s 

Используя поплавок вместо двойного, оптимизированный 64-битный вариант даже заканчивается в 2,4 секунды, в то время как другие времена бегущие остаться примерно то же самое. Однако с float я получаю разные выходы в зависимости от оптимизации, возможно, из-за более высокой внутренней точности процессора.

Я знаю, что 64 бит может иметь более быструю математику, но мы имеем коэффициент 7 (и почти 15 с поплавками) здесь.

Я хотел бы получить объяснение этих несоответствий в работе.

+0

Бенчмаркинг имеет смысл только тогда, когда просят компилятор оптимизировать. Я верю, что даже в '-m32'' double' составляет 8 байтов. –

ответ

5

Проблема не в 32-битном и 64-битном, это отсутствие SSE и SSE2. При компиляции для 64 бит gcc предполагает, что он может использовать SSE и SSE2, поскольку все доступные процессоры x86_64 имеют его.

Скомпилируйте свою 32-разрядную версию с помощью -msse -msse2, и разница в времени выполнения почти исчезнет.

Мои результаты тестов для полноты:

-O3 -m32 -msse -msse2  4.678s 
-O3 (64bit)    4.524s 
+0

Для оптимального эффекта используйте «-m32 -march = native». – kfsone

+0

Для оптимального эффекта используйте «-m32 -march = native» (извините за комментарий max комментария) – kfsone

Смежные вопросы