Войти
ПрограммированиеФорумОбщее

Что быстрее (9 стр)

Страницы: 15 6 7 8 9 10 Следующая »
#120
15:50, 20 июля 2009

Я бы наверное написал аккуратненькие шаблончики, примерно такие

http://www.everfall.com/paste/id.php?eeev43vx5qbk

там проверочки, что одному объекту соответствует один аспект, правильные деструкторы-конструкторы-ассертики, чтобы указатели не провисали.

после чего работал бы простой код:

struct AABB
{
  float pos[3];
  float ext[3];
};

struct RenderObject : public AspectHold<AABB, RenderObject>
{
  void Render()
  {
    printf( "Render!\n" );
  };
};


int main( int argc, char* argv[])
{
  RenderObject object;
  RenderObject::Aspect aabb( &object );

  aabb->Render();
  object->pos[0] = 1.0f;

  return 0;
}

RenderObject::Aspect aabb можно держать в любимом деревце, не напрягаясь про копирования. Вполне себе живой код.


#121
16:08, 20 июля 2009

innuendo
> А какой размер кеша был на этой консоли и по какому принципу распределялись
> SceneObject в памяти
Размер кеша без значения, ибо очевидно между кадрами он не въдерживает, а в процессе куллинга он неизбежно подогревается.
Весь вопрос - как.

>>и по какому принципу распределялись SceneObject в памяти
Тоже без значения, они больше одной кеш-строчки так или иначе.

#122
16:30, 20 июля 2009

Z
> Весь вопрос - как.
> Тоже без значения, они больше одной кеш-строчки так или иначе.

На этой консоли кэш одноуровневый ?

#123
16:57, 20 июля 2009

innuendo
> На этой консоли кэш одноуровневый ?
А что, есть конзоль с одноуровневъм кешем?
Или тъ надеешся что влезет в L2? Вообще, интересно что может въжить в кеше между кадрами...

#124
17:06, 20 июля 2009

Z
> > На этой консоли кэш одноуровневый ?
> А что, есть конзоль с одноуровневъм кешем?

Я до сих пор не знаю о каком процессоре идёт речь :)

#125
17:31, 20 июля 2009

Все три крайние ( некстген ) консоли PowerPC powered. С близкими процессорами. Так что конкретная консоль неважна.

Там очень большая линейка кеша ( 128 байт ). Нет аппаратного префетча, нет внеочередного исполнения. Линейка кеша очень сильно чувствуется в коде.
Софтовый префетч сильно помогает. Иногда в разы. В пять раз, скажем.

Еще очень сильно чувствуется load - hit - store, когда переменные не влезают на регистры или для каких-то прочих целей прогоняются через память.

#126
17:46, 20 июля 2009

frustrum cull довольно просто отспекать кстати на том PPC. Примерно 100-200 тактов на арифметику, как реализовать. 700 тактов на кеш-мисс, в плохой реализации цифры суммируются.

10K объектов по тыще тактов - это выходит 3ms. Из 16/32 на фрейм. В общем-то дохрена.

#127
20:08, 20 июля 2009

Z

Извини, а что это за сцена с 10K объектов в фраструме ? Скрин не даш ?

#128
20:11, 20 июля 2009

IronPeter
> Все три крайние ( некстген ) консоли PowerPC powered. С близкими процессорами.
> Так что конкретная консоль неважна.
> Там очень большая линейка кеша ( 128 байт ). Нет аппаратного префетча, нет
> внеочередного исполнения. Линейка кеша очень сильно чувствуется в коде.
> Софтовый префетч сильно помогает. Иногда в разы. В пять раз, скажем.

Как я понял это наследник PowerPC ? У него не 128 GPR ? Есть команды групповой загрузки регистров ?

#129
21:54, 20 июля 2009

у PowerPC жесткая спецификация, 32 GPR регистра, 32 float point. Команды имеют фиксированный размер DWORD. Групповой загрузки нет. Есть Altivec - аналог SSE. Это все совершенно открытая информация в общем-то. Вся документация на сайте IBM.

#130
0:27, 21 июля 2009
PowerPC няшка
#131
11:45, 21 июля 2009

IronPeter
> PowerPC жесткая спецификация, 32 GPR регистра, 32 float point. Команды
:) Видать перепутал с MIPS :)

IronPeter


> Групповой загрузки нет.

Извини, а как же вот это  http://www.ibm.com/developerworks/ru/library/l-powasm2/index.html

Загрузка и сохранение множественных данных

PowerPC может также производить множественные загрузки и сохранения по одной команде. К сожалению, это процесс ограничен данными размером в одно слово (32 бита). Это очень простые команды D-Form. Вы определяете базовый адрес регистра, смещение и начальный регистр назначения. Процессор будет загружать данные во все регистры, начиная с указанного регистра назначения до регистра 31, начиная с адреса, указанного в команде и двигаясь вперед. Команды, выполняющие эту операцию lmw (load multiple world) и stmw (store multiple word). Ниже -- несколько примеров:

#Начиная с адреса, указанного в регистре 10, загрузить
#следующие  32 байта в регистры 24-31
lmw 24, 0(10)

#Начиная с адреса, указанного в регистре 8, загрузить
#следующие 8 байт в регистры 30-31
lmw 30, 0(8)

#Начиная с адреса, указанного в регистре 5, загрузить
#младшие  32-бита из регистров 20-31 в следующие
#48 байт
stmw 20, 0(5)

#132
12:49, 21 июля 2009

innuendo
Это microcoded инструкции, можно считать что групповой загрузки нет - аналогичный код, развернутый руками (набор lw/etc.), будет быстрее.

#133
12:51, 21 июля 2009

а, круто, есть. Не знал про множественные загрузки.

По поводу слайдов от Z.

Вот такой прикольный фрагмент:

http://www.everfall.com/paste/id.php?17qfhghwk710

Эмулирует тест фраструма сферой. Неожиданно оказалось, что он на PPU занимает 300+ тактов. А должен меньше сотни. Напомню, что цена кеш промаха порядка 700 тактов, и простой префетч на разнесенных по памяти данных дает естественный выигрыш в 2.5 раза. Однако, почему требуется 300+ тактов?

Компилировалось некоммерческим g++ -O5. Напомню про lhs на PowerPC. В процессоре имеется очередь загрузок. Когда чтение попадает в эту очередь, то она сбрасывается. Ценой десятков тактов. Таким образом мы имеем write clause, которые разрываются dependent read clause.

Смысл кода ( уже немного магического ) было разнести латентности fp операций. Произвести 6 записей в память и оттуда с 1 lhs конфликтом вынуть целые числа.

Аккуратный анализ ( спасибо Zeux ) показал, что компилятор делает 6 подряд операций "сохрани fp на стек/загрузи со стека", раскручивая return. 6 lhs конфликтов. 240 тактов на ветер.

Ответ "не использовать fpu, а использовать VMX/SPE" напрашивается. Если кто-то напишет внятный C++ код, который решает проблему на PowerPC + gcc за 100 тактов - получит с полки пирожок. Я из дома выложу полный код.

#134
12:52, 21 июля 2009

Zeux
> Это microcoded инструкции, можно считать что групповой загрузки нет -
> аналогичный код, развернутый руками (набор lw/etc.), будет быстрее.

в старом добром Z80 было также :) LDIR и LDI

Страницы: 15 6 7 8 9 10 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.