Welcome to U.A.C. [O.S.A.]
login / register
Status: Guest
Архивы форума | iddqd.ru
Wolf 3D
ПравилаПравила ПоискПоиск
18+
Неожиданные результаты скорости вычислений
   Список разделов - Местечко мапперов и моддеров - Неожиданные результаты скорости вычисленийОтветить
АвторСообщение
VladGuardian
= Major =
Next rank: Lieutenant Colonel after 196 points
3094

Doom Rate: 1.17
Ссылка на пост №1 Отправлено: 26.01.14 16:02:53
Решил замерить скорость выполнения операции деления, умножения и сложения на разных типах данных.
Создал тестовый цикл из 500 млн. одинаковых операций (деления).
Развернул цикл, довольно значительно - http://ru.wikipedia.org/wiki/Размотка_цикла
Скомпилировал Release-версию с выключенными оптимизациями, запустил... получил довольно странные результаты...

РЕЗУЛЬТАТ СКОРОСТИ ДЛЯ ДЕЛЕНИЯ:
Int: 14984 ticks
Int64: 23453 ticks
Float: 9656 ticks
Double: 9641 ticks

РЕЗУЛЬТАТ СКОРОСТИ ДЛЯ УМНОЖЕНИЯ:
Int: 1031 ticks
Int64: 5781 ticks
Float: 750 ticks
Double: 750 ticks

РЕЗУЛЬТАТ СКОРОСТИ ДЛЯ СЛОЖЕНИЯ:
Int: 563 ticks
Int64: 2578 ticks
Float: 719 ticks
Double: 703 ticks

РЕЗУЛЬТАТ СКОРОСТИ ДЛЯ ВЫЧИТАНИЯ:
Int: 578 ticks
Int64: 2578 ticks
Float: 704 ticks
Double: 703 ticks

Есть логичное объяснение этому безобразию?

Программа: speedtest.exe
Новый пример: http://rghost.ru/51942767
Исходник:

#include "stdafx.h"
#include

Моя система: :
Pentium-4 2 Ghz (одноядерный)
Windows XP SP3
Visual C++ 2008 Express Edition
1 7 13
Archi]ASTS[
UAC General
Next rank: Unavailable after 0 points
12719

Doom Rate: 1.87
Ссылка на пост №2 Отправлено: 26.01.14 16:05:47
VladGuardian
Компилятор, машина?

То, что числа с плавающей точкой делятся быстрее, мне кажется, в принципе, логичным.
2 1 1
VladGuardian
= Major =
Next rank: Lieutenant Colonel after 196 points
3094

Doom Rate: 1.17
Ссылка на пост №3 Отправлено: 26.01.14 16:06:51
Pentium-4 2 Ghz (одноядерный)
Windows XP SP3
Visual C++ 2008 Express Edition

Archi :
То, что числа с плавающей точкой делятся быстрее, мне кажется, в принципе, логичным.

...попробовать умножение?

Добавлено спустя 9 минут:

Добавляю результаты в первый пост (обновляется)...
1 7 13
Archi]ASTS[
UAC General
Next rank: Unavailable after 0 points
12719

Doom Rate: 1.87
Ссылка на пост №4 Отправлено: 26.01.14 16:20:48
Ну ты, конечно, жжош. Вот так нельзя было сделать?
http://pastebin.com/4LSWTkg5

И да, я знаю, что conio.h устарел.

Там бы еще радномных чисел не помешало, на самом деле.
2 1 1
VladGuardian
= Major =
Next rank: Lieutenant Colonel after 196 points
3094

Doom Rate: 1.17
Ссылка на пост №5 Отправлено: 26.01.14 16:23:58
Archi :
жжош

Я сделал правильнее, потому что инкремент цикла (i++) и сравнение (i
Archi :
И да, я знаю, что conio.h устарел.

Это к делу относится?
Archi :
радномных чисел не помешало

Мысль хорошая.
Попробую, с заведомо сгенерированными массивами рандомных чисел.
1 7 13
Archi]ASTS[
UAC General
Next rank: Unavailable after 0 points
12719

Doom Rate: 1.87
Ссылка на пост №6 Отправлено: 26.01.14 16:31:22
VladGuardian :
Я сделал правильнее, потому что инкремент цикла (i++) отбирает время выполнения (СИЛЬНО ВЛИЯЕТ НА РЕЗУЛЬТАТ).

Препроцессор все равно его изменит под цикл, лол.

O2:
Скрытый текст:

2 1 1
VladGuardian
= Major =
Next rank: Lieutenant Colonel after 196 points
3094

Doom Rate: 1.17
Ссылка на пост №7 Отправлено: 26.01.14 16:33:02
У тебя были включены оптимизации.
Найди их в настройках проекта и выключи.

С оптимизациями проводить данный тест не имеет смысла.

Результат :
Int64: 0 tics
вообще бессмыслен, неужели не очевидно? :)
1 7 13
Archi]ASTS[
UAC General
Next rank: Unavailable after 0 points
12719

Doom Rate: 1.87
Ссылка на пост №8 Отправлено: 26.01.14 16:45:15
Угу.
Скрытый текст:


http://pastebin.com/zzpa9bvf
2 1 1
VladGuardian
= Major =
Next rank: Lieutenant Colonel after 196 points
3094

Doom Rate: 1.17
Ссылка на пост №9 Отправлено: 26.01.14 16:55:25


Скорость Int = Int64 = Float = Double <-- В этом результате тоже мало смысла.
Догадайся почему.

Потому что ЗНАЧИТЕЛЬНУЮ часть времени внутри цикла отжирает ф-ция rand().

Погоди, я сейчас попробую с массивом случ.чисел скорость намерять...
1 7 13
Archi]ASTS[
UAC General
Next rank: Unavailable after 0 points
12719

Doom Rate: 1.87
Ссылка на пост №10 Отправлено: 26.01.14 16:59:53
В этом тесте вообще смысла нет. С оптимизацией(без которой программу в релиз пускать нет смысла) операции над элементарными типами данных производятся практически моментально, из-за таких наборов инструкций, как, например, SSE. Ты мог бы до этого додуматься сам.

http://www.doomworld.com/vb/source-ports/66873-...erpolate-angle-t/
2 1 1
c4tnt
= 1st Lieutenant =
Next rank: - Captain - after 211 points
1879

Doom Rate: 1.92
Ссылка на пост №11 Отправлено: 26.01.14 17:00:53
Не, ну такие адовые тесты гонять на операционке с вытесняющей многозадачностью и без сбора статистики по тысяче попыток - это явно неправильно. Ну и проблема теста в его лютой синтетичности. Довольно сложно разработать алгоритм, который будет вычислять что-то полезное только с помощью математических операций внутри ядра. Разве что число pi считать, да и то его выгружать придётся. Можно попробовать решить какое-нибудь лду итеративно. На современных процессорах гораздо большая проблема не в том, чтобы что-то посчитать, а в подтаскивании//оттаскивании данных обычно.

P.S. Хотелось бы глянуть на дизасм этого чуда.
1 1
VladGuardian
= Major =
Next rank: Lieutenant Colonel after 196 points
3094

Doom Rate: 1.17
Ссылка на пост №12 Отправлено: 26.01.14 17:13:35
Archi :
операции над элементарными типами данных производятся практически моментально, из-за таких наборов инструкций, как, например, SSE

С одной махонькой поправочкой - ГРУППОВЫЕ операции с элементарными типами данных.
Как это часто бывает в реальных алгоритмах, операции происходят над ОДИНОЧНЫМИ числами, а не над векторами(массивами) чисел.
c4tnt :
Ну и проблема теста в его лютой синтетичности.

Ну а почему все-таки операции над интами происходят медленнее операций с флоатами, мне так никто и не объяснил :)
Сплошная философия.

P.S. Сейчас делаю алгоритм, который работает с (предварительно заполненным) массивом рандомных чисел...
1 7 13
c4tnt
= 1st Lieutenant =
Next rank: - Captain - after 211 points
1879

Doom Rate: 1.92
Ссылка на пост №13 Отправлено: 26.01.14 17:18:51

Как это часто бывает в реальных алгоритмах

Так не бывает(тм)

Если можно оперировать только с одиночными числами, а в вектор они никак не собираются, то это значит что либо в алгоритме ещё килограмм ветвлений на квадратный сантиметр кода, либо есть только один вычислительный блок, результаты которого зависят от вычисления предыдущего блока. В тесте, кстати, результат следующего вычисления от предыдущего не зависит, поэтому fpu могло довольно быстро асинхронно считать целые стопки чисел. Это надо дизасм смотреть опять же. Второй вариант - сделать тестируемую зону с использованием _asm вставки чтобы всё однозначно было.


Ну а почему все-таки операции над интами происходят медленнее операций с флоатами, мне так никто и не объяснил

Листинг на ассемблере нужен чтобы такое объяснять.
1 1
VladGuardian
= Major =
Next rank: Lieutenant Colonel after 196 points
3094

Doom Rate: 1.17
Ссылка на пост №14 Отправлено: 26.01.14 17:43:23
Переделал алгоритм под массивы, заполненные случайными числами... результат выглядит намного более вразумительно:
(видимо, кэширование данных решало в прошлом примере)
Int: 4735 ticks
Int64: 11625 ticks
Float: 4922 ticks
Double: 4906 ticks

Пример одной из тестовых функций:
#define N 1000000

void test_float2()
{
   float res;
   for (int j=0; j<500; ++j)
   for (int i=0; i       res = floats[i]/floats[i+1];
      res = floats[i+2]/floats[i+3];
      res = floats[i+4]/floats[i+5];
      res = floats[i+6]/floats[i+7];
      res = floats[i+8]/floats[i+9];
   }
}

, т.е. деление выполняется 500 миллионов раз.
(и это отбирает 4922 ticks на моем процессоре)

Новый пример: http://rghost.ru/51942767
1 7 13
c4tnt
= 1st Lieutenant =
Next rank: - Captain - after 211 points
1879

Doom Rate: 1.92
Ссылка на пост №15 Отправлено: 26.01.14 19:05:46
Тогда можно предположить, что компилятор умный и умеет хорошо распоряжаться FPU стэком. И в первом случае он не перезагружал значения в стэк, так как не было необходимости. Кстати, для того, чтобы вычисления с переменной реально проводились, желательно ставить на неё volatile. С другой стороны это чревато memory barrier в обе стороны от переменной и сильному замедлению в итоге.
1 1
Страница 1 из 1Перейти наверх
   Список разделов - Местечко мапперов и моддеров - Неожиданные результаты скорости вычислений