IPB
ЛогинПароль:

> ПРАВИЛА РАЗДЕЛА!!!

1. Заголовок или название темы должно быть информативным
2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE]
3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора.
5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM!
6. Проверяйте программы перед тем, как выложить их на форум!!

> Скорость работы с памятью в WinXP
сообщение
Сообщение #1


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Я так понял, что каждое обращение к памяти, встречающееся в программе, долго и упорно обрабатывается системой на предмет залезания не туда, и если действительно было нарушение, вызывается обработчик исключения. Я сделал одну процедуру, у которой основной рабочий цикл (заполнении линии одинаковым, пока что, значением) выглядел так:

// заполнение регистра ecx длиной участка...
jle @@; @:
mov [eax], edx
add eax, 4
// sub eax, 4
dec ecx; jnz @; @@:


Сделал замер скорости. Огорчился.
Решил смеха ради добавить одну паразитную команду (она тут закомментирована). Получил резкое ускорение - то есть теперь данные стали выводиться в одно и то же место в памяти. Видимо система запомнила, куда в последний раз обращалась программа и не стала проверять обращение на корректность лишний раз.
Как на самом деле обрабатываются обращения к памяти в винде? И можно ли использовать эту информацию для ускорения?
Кстати, почему пара deс; jnz работает намного быстрее, чем loop, который специально предназначен для циклов?


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 14)
сообщение
Сообщение #2


Гость






Во-первых, не факт, что на всех процессорах будет тот же эффект. Давай сделаем так: приведи простейшую программку, которая будет использовать LOOP, и которая будет использовать DEC+JNZ, и сравнивать скорости их выполнения. И протестируем эту программку на разных процессорах. Скажем, на DualCore, QuadCore, P4, на Селеронах, на AMD-шках, можно на i7 попробовать потестировать... Я уверен, результаты будут не такими уж однозначными.

Теперь - почему на твоей модели процессора (если можно, формулируй в следующий раз именно так, я еще раз говорю: не факт, что это выполняется везде) LOOP может быть медленнее, чем DEC/JNZ - см. здесь: Оптимизация для процессоров семейства Pentium: 17. Выполнение кода не по порядку

Добавлено через 22 сек.
P.S. Перенести в Ассемблер?

Добавлено через 3 мин.
P.P.S. А заменить dec ecx на sub ecx,1 не пробовал? Попробуй...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


> Давай сделаем так: приведи простейшую программку, которая будет использовать LOOP, и которая будет использовать DEC+JNZ

Ну что-то типа этого:


program Test;

{$APPTYPE CONSOLE}

uses
Windows;

var
T: integer;
i: integer;

procedure Delay1;
begin
asm
mov ecx, $FFFFFFF
@:
loop @;
end;
end;

procedure Delay2;
begin
asm
mov ecx, $FFFFFFF
@:
dec ecx; jnz @;
end;
end;

begin

T := GetTickCount;
while T = GetTickCount do;
T := GetTickCount;
Delay1;
i := GetTickCount - T;
WriteLn('loop: ', i);

T := GetTickCount;
while T = GetTickCount do;
T := GetTickCount;
Delay2;
i := GetTickCount - T;
WriteLn('dec;jnz: ', i);

ReadLn;
end.



> Во-первых, не факт, что на всех процессорах будет тот же эффект.

То есть чаще будет наоборот и поэтому имеет смысл сделать луп? Вот дельфийский компилятор тоже делает через вычитание, причём почему-то в качестве счётчика цикла выбран ebx.
Ещё забавный эффект - если перед циклом записать что-то в стек и сразу извлечь обратно, то получится полуторакратное замедление.

> см. здесь

Ща почитаю.

> P.S. Перенести в Ассемблер?

Подтему с циклами - да. Но меня больше интересовала скорость заполнения фрагмента памяти, а она, мне кажется, связана с особенностями системы.

> А заменить dec ecx на sub ecx,1 не пробовал?

Если в исходном виде поменять - эффекта ноль. Усилил эффект, убрав всё тело цикла, заметил полуторакратное замедление суба по сравнению с деком. Луп же вышел ещё вдвое медленне суба.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Вот, посмотри, что у меня получилось:
На более старой машине (там видно характеристики)
Прикрепленное изображение

А это на двухядернике:
Прикрепленное изображение

И там и там Win XP SP3... Запускался один и тот же EXE-шник, если что.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


От типа памяти + кэша должно сильно зависеть. TarasBer, давно пора забыть про классическую схему с обращением напрямую к каждому адресу..


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


> TarasBer, давно пора забыть про классическую схему с обращением напрямую к каждому адресу...

А какие бывают другие? И как заставить процессор выводить не в память, а в кэш?


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






А можно озвучить задачу, которую ты пытаешься решить?
Цитата
основной рабочий цикл (заполнении линии одинаковым, пока что, значением)
- это конечно хорошо, но еще бы знать, что и чем заполняется...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


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


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






Цитата
В рабочем цикле будет заполняться экранный буфер цветом примитива, с учётом тумана и будет заполняться з-буфер.
То есть, я так понимаю (ключевое слово выделено), цикла самого еще нет, а ты уже занимаешься его оптимизацией? Не надо этого делать... Во-первых, так завещал Кнут ("Premature optimization is the root of all evil" ©, если что), а во-вторых, открывай книгу Криса Касперски "Техника оптимизации программ", и читай, что и как надо оптимизировать, а что и как - не надо. И что надо делать, чтобы оптимизация была именно таковой, а не борьбой с ветряными мельницами...

Так что, пока разговор ни о чем. Если есть какой-то конкретный кусок кода, который надо оптимизировать, потому что ты точно знаешь, что в нем содержится проблема, и именно он не дает твоей программе работать как положено, а не какой-то наведенный эффект из другой части программы, то давай продолжим... Но для этого тебе надо по меньшей мере прогнать свой код через профилировщик, причем не раз и не два, и на большом количестве повторений. Ну, это все есть у Касперски, я ж не буду сейчас перепечатывать сюда всю книгу...

Update:
Кстати, ссылка в тему: Зачастую оптимизация противоречит интуиции

Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Я не просто так спросил, если что.
Я бы не стал задавать вопрос, если бы сам код закраски полигона у меня не был готов. Причём большие полигоны у меня закрашиваются медленнее, чем опенглом, а маленькие - быстрее. Это говорит о том, что у меня тормозит внутренний цикл. То есть, как я понял, проблема с fillrate. У меня внутренний цикл написан на асме, рядом стоит его закомментированная копия на Паскале, чтобы, если что, вернуться и перепроверить алгоритм.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


И да, тогда перенесите тему в ассемблер, пожалуйста.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Гость






Ну, и где этот код и результаты его прогонов на разных компьютерах?

Тему перенес...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Результаты скорости меня интересуют, в первую очередь, для моего компьютера. Я рассуждаю так - что идёт у меня, то пойдёт у всех остальных.
Вот скрин. Сверху - моя заливка полигона (в одном месте вместо мов поставлен ксор для красоты, он на скорость не влияет), снизу - опенгл. В заголовке - сколько миллисекнуд заняла скольки-кратная отрисовка сцены.


Эскизы прикрепленных изображений
Прикрепленное изображение

--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Попробовал выводить по 8 байт, при помощи команды movq.
Не помогло.

Добавлено через 10 мин.
Попробовал выводить по 8 байт, при помощи команды movq.
Не помогло - скорость абсолютно та же осталась.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Профи
****

Группа: Пользователи
Сообщений: 930
Пол: Мужской

Репутация: -  11  +


Так в виндовсе память работает в защищённом режиме, имхо, на конечном этапе ресурсами распоряжается менеджер памяти. При выводе картинки задействуется малый объём ресурсов, ситуация напоминает оплату электричества: при низком потреблении за почтовые услуги нужно постоянно платить в разы больше чем за потреблённую энергию (привет экономичным лампочкам)). Если занять у менеджера памяти ~100Мб (или больше) памяти и не дать ему усомниться в том что она нужна приложению всегда и полностью, статистика скорости доступа должна быть более точной. Это только скорость оперативки, видеокарты, отдельный вопрос.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 28.03.2024 23:01
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name