HLFX.Ru Forum
профиль •  правила •  регистрация •  календарь •  народ •  FAQ •  поиск •  новое •  сутки •  главная •  выход  
HLFX.Ru Forum HLFX.Ru Forum > Наш форум > Технические вопросы > Руководства по написанию эффективного C/C++ кода
От разработчиков процессоров и компиляторов
Страницы (2): [1] 2 »   Предыдущая тема   Следующая тема
Автор
Тема Новая тема    Ответить
~ X ~
offline

Дата регистрации: Oct 2005
Проживает: Архангельск
Сообщений: 3619

Рейтинг



Награды
 
[1 награда]


Arrow Руководства по написанию эффективного C/C++ кода

Помнится, ещё в самом начале 2000-ных мне попалась краткая распечатка программинг-гайдлайнов K6 от AMD. С тех пор, наверное, я стал намного ответственнее подходить к написанию кода.
(здесь много авторитетного мнения о важности оптимизации кода)
Вот современный документ: http://support.amd.com/TechDocs/40546.pdf
Рекомендую, интересное чтение. Можно скипнуть прямо к главе 2 "C and C++ Source-Level Optimizations".

Если у вас есть чем поделиться, выкладывайте сюда.

__________________
Минутка полезного:
Бесплатный UT-подобный Half-Life mod.
Бесплатный редактор для 32-битных текстур. Без дотнета.
Бесплатный IDE для любых компиляторов и ЯП.
Бесплатная Windows-подобная ОС.
Проверка грамматики русского языка.
Чат по hl[fx]: [email protected]

Сообщить модератору | | IP: Записан
Сообщение: 137867

Старое сообщение 19-05-2014 08:38
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34588
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Всё перечисленное очевидно, за исключением п. 2.2.
Здесь требуется уточнить, что избегать доступа по разыменованию указателя надо только тогда, когда есть реальная возможность по перегруппировке/распараллеливанию инструкций. Если код сугубо последовательный - то доступ по указателю, вообще говоря, быстрее, т.к. доступ без индексного смещения (а в случае больших индексов - ещё и дополнительная операция по расчёту смещения). Кроме того, любой адекватный компилятор должен понимать, что *s и s[0] это одно и то же, и то, что у меня привычка использовать первый вариант - это всего лишь безобидная привычка.
Без оптимизаций - так вообще доступ по указателю гарантированно будет быстрее.

__________________

Сообщить модератору | | IP: Записан
Сообщение: 137868

Старое сообщение 19-05-2014 08:54
-
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32329
Нанёс повреждений: 392 ед.

Рейтинг



Цитата:
XaeroX писал:
а в случае больших индексов - ещё и дополнительная операция по расчёту смещения

Неужели есть какая-то принципиальная разница в быстродействии при складывании больших и малых чисел? Ну вот я складываю два целых числа, одно допустим 5, а другое 3. И что, это будет быстрее чем сложение чисел 236456435 и 326473475? Помоему одинаково - одна операция.
Цитата:
XaeroX писал:
Кроме того, любой адекватный компилятор должен понимать, что *s и s[0] это одно и то же, и то

В С++ крайне неудобно организовано изменение многомерного массива, указатель на который передаётся в аргумент функции. Он всё время норовит записать не втуда или вообще создать локальную копию, хотя в чистом Си с этим никогда не было проблем.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 137875

Старое сообщение 19-05-2014 11:06
-
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34588
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Дядя Миша
Я предположил, что в случае, когда индекс выходит за пределы страницы памяти, команда должна как-то это учитывать. В то время как прямая последовательная модификация указателя явно даёт процессору понять, что вот-вот потребуется новая страница в кэше.
Возможно, на современных процессорах и нет разницы.
Lea эффективнее add хотя бы потому, что это разные модули, и lea освобождает арифметический блок для вычислений. Но хороший компилятор сам умеет переводить арифметику указателей на lea/mov, и когда говорят "индексный доступ быстрее доступа по указателю" - это значит, они сами расписываются в проблемах своего компилятора, который что-то умеет плохо. По мне - так нет разницы. Единственная проблема - алиасинг, но это сильно зависит от конкретного алгоритма.

__________________

Сообщить модератору | | IP: Записан
Сообщение: 137878

Старое сообщение 19-05-2014 11:49
-
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32329
Нанёс повреждений: 392 ед.

Рейтинг



Цитата:
XaeroX писал:
Я предположил, что в случае, когда индекс выходит за пределы страницы памяти, команда должна как-то это учитывать

Ну это должен быть совсем немаленький массив. Мы с этими оптимизациями скоро дойдём до того, что хэш будет работать быстрее обращения по индексу %)
Цитата:
XaeroX писал:
это значит, они сами расписываются в проблемах своего компилятора, который что-то умеет плохо

Я бы сказал - времена ручной оптимизации давно прошли. А современные компиляторы автоматически умеют пихать SSE-апхчимизации. По крайней мере GCC ваш.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 137880

Старое сообщение 19-05-2014 11:52
-
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34588
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Цитата:
Дядя Миша писал:
А современные компиляторы автоматически умеют пихать SSE-апхчимизации. По крайней мере GCC ваш.

Да умеют, но я больше доверяю собственным мозгам в этом плане.
Когда я оптимизирую определённую функцию, я точно знаю, какие у неё будут аргументы, какие результаты мне нужны, а какие нет. Я знаю расположение данных в памяти. Всё это позволяет писать более эффективный SSE-код, чем общее решение "на все случаи жизни" на том же SSE. Конечно, есть и минус - чуть изменил функцию или её прототип, и надо всё переписывать. Поэтому я такие вещи всегда напоследок откладываю, когда все интерфейсы устаканились.
Кармак в дум3 вон вообще каждой функции сделал отдельную SSE-версию.
А вальва написала общие версии - и в итоге они работают медленнее, чем обычные FPU-реализации.

__________________

Сообщить модератору | | IP: Записан
Сообщение: 137882

Старое сообщение 19-05-2014 12:07
-
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32329
Нанёс повреждений: 392 ед.

Рейтинг



Не, у нее там есть SSE-версии на наиболее критичные функции, типа VectorTransform. И по моему даже указатели на функции, чёб нужную подставлять. Дух функциональщины слабо истребим

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 137898

Старое сообщение 19-05-2014 17:20
-
~ X ~
offline

Дата регистрации: Oct 2005
Проживает: Архангельск
Сообщений: 3619

Рейтинг



Награды
 
[1 награда]


Цитата:
XaeroX писал:
А вальва написала общие версии - и в итоге они работают медленнее, чем обычные FPU-реализации.

Эхем, ты что-то путаешь. Как раз наоборот - в ХЛ2 есть SSE- и 3DNow-версии векторных функций, которые автоназначаются при загрузке игры.

__________________
Минутка полезного:
Бесплатный UT-подобный Half-Life mod.
Бесплатный редактор для 32-битных текстур. Без дотнета.
Бесплатный IDE для любых компиляторов и ЯП.
Бесплатная Windows-подобная ОС.
Проверка грамматики русского языка.
Чат по hl[fx]: [email protected]

Сообщить модератору | | IP: Записан
Сообщение: 138863

Старое сообщение 14-06-2014 21:11
- За что?
Cybermax
Житель форума

Дата регистрации: May 2006
Проживает: ㅤ
Сообщений: 5127

Рейтинг



Цитата:
Дядя Миша писал:
Старое сообщение 19-05-2014 21:20

Цитата:
~ X ~ писал:
Новое сообщение сегодня 01:11

__________________

Сообщить модератору | | IP: Записан
Сообщение: 138864

Старое сообщение 14-06-2014 22:00
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34588
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Цитата:
~ X ~ писал:
Эхем, ты что-то путаешь.

Прочитай, пожалуйста, весь мой пост, а не выхваченную из контекста фразу.
Цитата:
~ X ~ писал:
Как раз наоборот - в ХЛ2 есть SSE-

Попробуй их спрофилировать. Узнаешь много нового об уровне программистов вальвы.

__________________

Сообщить модератору | | IP: Записан
Сообщение: 138865

Старое сообщение 14-06-2014 22:04
-
ILZM
LAW

Дата регистрации: Oct 2011
Проживает: Mega City One
Сообщений: 301

Рейтинг



А вот если оптимизировать циклы, например, весь cStudioModelRenderer по принципу, который написан в мануале, то даст ли это прибавки к фпс ?


Цитата:
2.14 Explicit Parallelism in Code
Optimization
Where possible, break long dependency chains into several independent chains that can be executed
in parallel to take advantage of the execution units in each pipeline.
Application
This optimization applies to:
• 32-bit software
• 64-bit software
Rationale
It is especially important to break long x87, SSE, or SSE2 dependency chains into smaller executing
units in floating-point code, because of the longer latency of floating-point operations. Most
languages (including ANSI C) are bound by the guarantee that floating-point expressions can not be
reordered; compilers cannot usually perform such optimizations unless they offer a switch to allow
noncompliant reordering of floating-point expressions according to algebraic rules.
Reordered code that is algebraically identical to the original code does not necessarily produce
identical computational results due to the lack of associativity of floating-point operations. There are
well-known numerical considerations in applying these optimizations (consult a book on numerical
analysis). In some cases, reordered floating-point code may lead to unexpected results, but in the vast
majority of cases, the final result differs only in the least-significant bits.
Examples
Avoid
double a[100], sum;
int i;
sum = 0.0f;30 C and C++ Source-Level Optimizations Chapter 2
Software Optimization Guide for AMD Family 10h and 12h Processors 40546 Rev. 3.13 February 2011
for (i = 0; i < 100; i++) {
sum += a[i];
}
Preferred
double a[100], sum1, sum2, sum3, sum4, sum;
int i;
sum1 = 0.0;
sum2 = 0.0;
sum3 = 0.0;
sum4 = 0.0;
for (i = 0; i < 100; i + 4) {
sum1 += a[i];
sum2 += a[i+1];
sum3 += a[i+2];
sum4 += a[i+3];
}
sum = (sum4 + sum3) + (sum1 + sum2);
Notice that the four-way unrolling is chosen to exploit the four-stage fully pipelined floating-point
adder. Each stage of the floating-point adder is occupied on every clock cycle, ensuring maximum
sustained utilization.

Сообщить модератору | | IP: Записан
Сообщение: 138870

Старое сообщение 15-06-2014 08:48
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34588
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


ILZM
На пентиум-1 - безусловно, пол-фпс выиграешь.

__________________

Сообщить модератору | | IP: Записан
Сообщение: 138872

Старое сообщение 15-06-2014 09:14
-
~ X ~
offline

Дата регистрации: Oct 2005
Проживает: Архангельск
Сообщений: 3619

Рейтинг



Награды
 
[1 награда]


XaeroX

Цитата:
XaeroX писал:
Прочитай, пожалуйста, весь мой пост, а не выхваченную из контекста фразу.

Какой контекст? Ну ок, я код дума не читал. Просто делюсь наблюдениями.

Цитата:
XaeroX писал:
На пентиум-1 - безусловно, пол-фпс выиграешь.

Это ты зря. При тестировании оптимизации кода на системе частиц я выигрывал куда больше. Я думаю, на проце 2ГГЦ можо получить весьма неплохой выигрыш в движке ХЛ1, где всё на проце крутится.
Да и вообще, надо уважать труд инденеров и стремиться к красоте кода.

PS: кибермакс просит предупреждений за флуд )

__________________
Минутка полезного:
Бесплатный UT-подобный Half-Life mod.
Бесплатный редактор для 32-битных текстур. Без дотнета.
Бесплатный IDE для любых компиляторов и ЯП.
Бесплатная Windows-подобная ОС.
Проверка грамматики русского языка.
Чат по hl[fx]: [email protected]

Сообщить модератору | | IP: Записан
Сообщение: 138878

Старое сообщение 15-06-2014 11:44
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34588
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Цитата:
~ X ~ писал:
Какой контекст? Ну ок, я код дума не читал. Просто делюсь наблюдениями.

Хорошо, я скажу иначе. Вальва под видом ссе-оптимизаций скормила народу сладкий хлебушек. Так понятнее?
Цитата:
~ X ~ писал:
Я думаю, на проце 2ГГЦ можо получить весьма неплохой выигрыш в движке ХЛ1, где всё на проце крутится.

А ты не думай, ты экспериментируй.
Вечно народ так: умных книжек начитается, экзамены на пятёрки сдаст - а волатила тормозит как чёрт знает что.

__________________

Сообщить модератору | | IP: Записан
Сообщение: 138880

Старое сообщение 15-06-2014 12:23
-
~ X ~
offline

Дата регистрации: Oct 2005
Проживает: Архангельск
Сообщений: 3619

Рейтинг



Награды
 
[1 награда]


Честно говоря - нет. Они плохо написали?
Я хотел себе то же самое сделать. Только забил по причине кривости асм-вставок для разных платформ, просто некогда всю эту муть изучать.

Я уже говорил, что после оптимизаций число частиц в кадре мне удалось повысить на ~25%.

__________________
Минутка полезного:
Бесплатный UT-подобный Half-Life mod.
Бесплатный редактор для 32-битных текстур. Без дотнета.
Бесплатный IDE для любых компиляторов и ЯП.
Бесплатная Windows-подобная ОС.
Проверка грамматики русского языка.
Чат по hl[fx]: [email protected]

Сообщить модератору | | IP: Записан
Сообщение: 138898

Старое сообщение 16-06-2014 08:26
- За что?
Тема: (Опционально)
Ваш ответ:



Переводчик транслита


[проверить длину сообщения]
Опции: Автоматическое формирование ссылок: автоматически добавлять [url] и [/url] вокруг интернет адресов.
Уведомление по E-Mail: отправить вам уведомление, если кто-то ответил в тему (только для зарегистрированных пользователей).
Отключить смайлики в сообщении: не преобразовывать текстовые смайлики в картинки.
Показать подпись: добавить вашу подпись в конец сообщения (только зарегистрированные пользователи могут иметь подписи).

Временная зона GMT. Текущее время 09:10. Новая тема    Ответить
Страницы (2): [1] 2 »   Предыдущая тема   Следующая тема
HLFX.Ru Forum HLFX.Ru Forum > Наш форум > Технические вопросы > Руководства по написанию эффективного C/C++ кода
От разработчиков процессоров и компиляторов
Версия для печати | Отправить тему по E-Mail | Подписаться на эту тему

Быстрый переход:
Оцените эту тему:

Правила Форума:
Вы not можете создавать новые темы
Вы not можете отвечать в темы
Вы not можете прикреплять вложения
Вы not можете редактировать ваши сообщения
HTML Код ВЫКЛ
vB Код ВКЛ
Смайлики ВКЛ
[IMG] Код ВКЛ
 

< Обратная связь - HLFX.ru >

На основе vBulletin
Авторское право © 2000 - 2002, Jelsoft Enterprises Limited.
Дизайн и программирование: Crystice Softworks © 2005 - 2024