Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Регистрация Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Блоги > Волгоградец

Оценить эту запись

Производительность операций с floating point number

Запись от Волгоградец размещена 18.03.2011 в 18:28
Обновил(-а) Волгоградец 18.03.2011 в 21:05

На днях прочитал про стандарт IEEE-754, к которому, как известно относится тип Number во флэше. Ничерта не понял, все слишком мудрёно, но на заметку взял такую штуку - оказывается операциям с очень маленькими числами требуется больше времени на выполнение (особенности реализации чисел - довольно запутанная штука). Например, на моем компьютере Intel Core 2 Duo E7600 такой код:
Код AS3:
var aNum:Number = 10;
var bNum:Number = 10;
 
test(aNum, bNum);
 
function test(a:Number, b:Number):void
{
	var c:Number = a + b;
}
выполняется в 2 раза быстрее, чем
Код AS3:
var aNum:Number = 1e-308;
var bNum:Number = 1e-308;
(или если хотя бы один из операндов очень маленький)
Почему я написал название процессора? Потому что числовые операции происходят где-то там, но разные процессоры могут по-разному эти вычисления производить - например AMD (в статье так прочитал) урезают точность в угоду производительности в своих процессорах (интел вроде тоже в некоторых моделях).
И главный вопрос - почему я озадачился? Я допиливаю "очередной никому не нужный кроме меня физ движок собственного сочинения" и пытаюсь оптимизировать все что только можно оптимизировать. В той статье бороться советуют округлением - т.е. если значение очень маленькое - принять его равным 0. Но вот незадача - встроенного метода типа clamp() в AS нету, а if проверка займет больше времени, чем медленная операция.
В принципе, пост получился ниочем, но лично мне было интересно узнать такую фичу, теперь если в Своей Игре попадется вопрос на эту тематику, то я смогу заработать 100 очков.
Ах, да - тестировал во Flash CS4, AS 3.0, FP10.
Всего комментариев 12

Комментарии

Старый 18.03.2011 22:07 mayakwd вне форума
mayakwd
 
Аватар для mayakwd
Движок "пощупать" дадите?
Старый 18.03.2011 23:25 Волгоградец вне форума
Волгоградец
 
Аватар для Волгоградец
Дам конечно!
Старый 19.03.2011 14:45 gloomyBrain вне форума
gloomyBrain
 
Аватар для gloomyBrain
И я, я тоже хочу! =) как раз недавно засел сравнивать и тестить nape vs box2d...
Старый 19.03.2011 18:40 Волгоградец вне форума
Волгоградец
 
Аватар для Волгоградец
Неее, мне до них как до китая раком. Вообще на флэше круче nape нет ничего (я сужу по демкам - они божественны).
Старый 19.03.2011 19:16 wvxvw вне форума
wvxvw
 
Аватар для wvxvw
http://wiki.joa-ebert.com/index.php/Avoiding_Denormals
Тут есть об этом, и предлагается прибавлять очень маленькое число, чтобы избежать более затратных мат. операций. Но, если чесно, я думаю, что такой оптимизацией лучше не заниматься, т.как например завтра рассчеты ф.п. чисeл перенесут в GPU, (там действительно быстрее), но там может оказаться встроенная оптимизация, и ваш код будет наоборот работать хуже, если вы сделали оптимизацию на програмном уровне. При чем такие ситуации сплошь и рядом. Ну, скажем нe в AS3, но в языках, которые компилируются непосредственно в машинные коды существовала практика использовать побитовый сдвиг для деления и умножения на степень двойки. Но производители процессоров добавили инструкцию LEA, которая умножает число на константу, и работает это лучше, чем програмная реализация умножения и деления.
Старый 20.03.2011 00:01 Волгоградец вне форума
Волгоградец
 
Аватар для Волгоградец
Да, wvxvw, интересно. Но опять же - проблема в том, чтобы определить, когда в коде у меня возникнут эти denormals. В каждой операции прибавлять маленькое число - это лишнее и большие затраты (учитывая то, что denormals возникают не так часто). Проверяя число в условии - это вообще очень медленно.
Цитата:
завтра рассчеты ф.п. чисeл перенесут в GPU
Дык уже на nvidia картах можно считать.
Старый 20.03.2011 01:21 NeonSelf вне форума
NeonSelf
Хочу заметить, учитывая что сам AS3 компилируется в байт-код, кторый впоследствии исполняется виртуальной машиной - оптимизайия арифметики с переменными типа Number - бесполезная трата времени. С выходом очередного плеера или новой версии компилятора все это может производиться на совершенно другом уровне и в других условиях. А если учесть, что Adobe питает некую слабость к странным округлениям, например позиции и ориентации спрайтов в сцене - то ваш оптимизированный код может выдавать такие результаты, которые трудно предсказать...
Если в вашем проекте действительно много сложных расчетов, лучше попробовать изменить формулы, выделить куски, которые многократно пересчитываются с одинаковыми входными параметрами и кешировать результаты, сократить количество вызовов функций и свойств обьектов. Также можно реже использовать статические методы и переменные т.к. они по неизвестным мне причинам работают медленнее. Кроме того, в случае с физическим движком, стоит обратить внимание на способ разбиения пространства который вы используете, в зависимости от выполняемых задач, удачно выбранный способ разбиения пространства может на порядок сократить время расчета взаимодействий между группами объектов.

P.S. операции с очень большими или очень маленькими числами исполняются медленнее, так как перед расчетом производится "приведение порядка" тоесть мантисса одного из чисел смещается, для того чтобы можно было произвести вычисление результата. Это неизбежная процедура, которая выполняется в самом процессоре, и GPU тут не помошник - в нем эти расчеты производятся точно также, за тем исключением что процессоров там много, и независимые выражения могут вычисляться параллельно.
Старый 20.03.2011 01:55 wvxvw вне форума
wvxvw
 
Аватар для wvxvw
У меня нет точной информации. И я не занимался никогда ничем, что бы требовало знать инструкции процессора, про GPU - со слов моего знакомого, который этим занимался. На сколько я его тогда понял, в определенных графических процессорах, особенно в тех, в которых есть хардверная поддержка какого-нибудь графического фреймворка типа OpenGL есть (или были) инструкции для работы с ф.п. числами. В то время как у процессоров которыми комплектуются обычные ПК таких инструкций нет. Но информация не приверенная, и мне не охота искать в вики, так оно или нет

ЗЫ. Если сложение дробных чисел окажется узким местом в движке, то считайте, что вы уже сделали его идеальным

Не, и все-таки полез в вики.
http://en.wikipedia.org/wiki/GPGPU
Цитата:
The implementations of floating point on Nvidia GPUs are mostly IEEE compliant; however, this is not true across all vendors.[1] This has implications for correctness which are considered important to some scientific applications. While 64-bit floating point values (double precision float) are commonly available on CPUs, these are not universally supported on GPUs; some GPU architectures sacrifice IEEE compliance while others lack double-precision altogether. There have been efforts to emulate double-precision floating point values on GPUs; however, the speed tradeoff negates any benefit to offloading the computation onto the GPU in the first place.
Что говорит о том, что разница сущестует, и довольно заметная. Очевидно, что скорее всего видеокарточки считают быстрее, но не по стандарту. Вобщем, дыма без огня не бывает
Старый 20.03.2011 13:19 Котяра вне форума
Котяра
 
Аватар для Котяра
Флэшер - торт.
Люблю топики где говорят про мантиссы, а не про <не буду называть его имени, дабы не провоцировать>
по теме:
соглашусь с
Цитата:
Если сложение дробных чисел окажется узким местом в движке, то считайте, что вы уже сделали его идеальным
Старый 20.03.2011 13:34 gloomyBrain вне форума
gloomyBrain
 
Аватар для gloomyBrain
Цитата:
А если учесть, что Adobe питает некую слабость к странным округлениям, например позиции
В этом как раз нет ничего странного. Единицей графики, выводимой на экран в FP является твип, который равен 1/20 пикселя. Соответственно, координаты округляются до целого числа твипов
Старый 20.03.2011 15:30 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
@Глум, так-то да. Но было бы здорово иметь свойство snapToPixels, которая автомат бы округляла координаты. Твипсы-твипсами, а на них выводит не оук.

@Котяра, спасибо за поднятое настроение =)
Старый 22.03.2011 01:16 dimarik вне форума
dimarik
 
Аватар для dimarik
Котяра, in4core? Хехе.
По поводу твипсов... Недавно тестил свой зрительный порог с точностью до твипселя. Оказалось, что менее одной десятой пикселя (два твипселя) я не различаю. Пришлось округление в transform сеттерах делать в эту субъективную величину. Может, аукнется позже.
 

 


Часовой пояс GMT +4, время: 21:09.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.