Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Функции работы с памятью  (Прочитано 18406 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Mayor
Специалист

ru
Offline Offline

« : 19-05-2004 01:55 » 

мне нужна С функция меняющая местами N байт памяти , желательно оптимизированая для работы с адресами кратными 4 байтам.
Как она называется ?

Если ее нет , то отслеживает ли MSVC 6 изменения в регистрах внутри директивы _asm или лучше их на всякий случай push \ pop ?
Записан

1n c0de we trust
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #1 : 19-05-2004 08:49 » 

Вроде нет такой.... прийдется самому писать юзая memcpy.
Записан

С уважением Lapulya
Pu
Большой босс

ru
Offline Offline
78


« Ответ #2 : 19-05-2004 10:32 » 

а в чем проблема ?
1 забил памяти под промежуточный буфер malloc()
2 memmove в промежуточный буфер
3 memmove из промежуточного буфер
4 free()  промежуточный буфер
или я что не понял  Я шокирован!
Записан

Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать.
(с) Артур Джонс
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #3 : 19-05-2004 11:20 » 

memmove едленнее, чем memcpy а человеку нужна скорость
Записан

С уважением Lapulya
Pu
Большой босс

ru
Offline Offline
78


« Ответ #4 : 19-05-2004 11:36 » new

lapulya, ну если скорость - то ессесно на асме надо, хотя я понял что разверт этой темы идет в другой ветке. Где просто С.
Записан

Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать.
(с) Артур Джонс
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 19-05-2004 12:40 » 

Код:

void memflip)void * buf1, void * buf2, int len: |
  char c;
  int i;

  for)i=0;i<len;buf1++,buf2++,i--: |
    c=))char*:buf1:[i(;
    ))char*:buf1:[i(=))char*:buf2:[i(;
    ))char*:buf2:[i(=c;
    "
  "

Генерируемый код достаточно оптимизирован:
Код:

; ...
.L6{
  mov dl,[esi+ecx(
  mov al,[ebx+ecx(
  mov [esi+ecx(,al
  mov [ebx+ecx(,dl
  dec ecx
  cmp ecx,edi
  jl .L6
; ...

Если нужно ускорить, то берешь (len&-4)>>2 и вместо char (dl и al) используй long (edx и eax), а оставшиеся 0..3 байта копируй вышеприведенной ф-ией.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #6 : 19-05-2004 13:44 » 

тока там надо i++ и на asm будет inc ecx
Записан

С уважением Lapulya
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 19-05-2004 14:02 » 

lapulya,  Улыбаюсь ошибся - вначале написал от len к нулю, а переправил не все. Кстати, для for(i=len-1;i>0;i--) код выйдет короче - cmp не нужен.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #8 : 19-05-2004 14:09 » 

точняк!
Записан

С уважением Lapulya
Mayor
Специалист

ru
Offline Offline

« Ответ #9 : 22-05-2004 04:25 » 

Цитата

Генерируемый код достаточно оптимизирован:

 

Ну насчет оптимизации , незнаю :
не поймешь быстрее ли
mov edx,[ecx]
чем
mov edx,[ecx+edi]

однозначно надо использовать , long вместо char .
А вот насчет того , что быстрее : обмен через регистр или блок памяти я не знаю . Неизвестно как реализован кеш , в том плане , что не будет ли он тормозить при паралельных запросах на чтение запись в одну кеш-линию , не лучше ли их сделать последовательными ?
 И не будет ли лучше на продвинутых процах вначале обратиться к каждой кеш-линии , чтобы в кеш во время команд обмена начальных данных  заносились последующие к чтению\записи участки памяти ?
Записан

1n c0de we trust
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #10 : 22-05-2004 06:30 » 

Mayor,  Если оптимизировать до безобразия, то можно очень быстро уйти от поставленной задачи. И топтаться над одним куском текста месяцами. Всему нужны разумные пределы.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #11 : 22-05-2004 13:05 » 

И еще я хотел бы добавить фирма Интел выпускает новый процессор раз в два три года. И вся твоя оптимизация под свойство процессора летит. И еще, что делать с переносимостью кода. Например на процесор AMD или VIA.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #12 : 24-05-2004 09:46 » 

Mayor, вычисление эфективного адреса с использованием индекса требует дополнительного такта только для процесоров 486 и ниже. Это нормальная load-store модель - Intel и AMD заточены под это.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Mayor
Специалист

ru
Offline Offline

« Ответ #13 : 01-06-2004 02:35 » 

Finch, я не професиональный програмист, которому говорят: "программа пишется для пользователя, а не для програмиста", сроки и завершенность в данном случае не имеет значения, и поэтому я просто развлекаюсь с этой идеей , мне интересен сам процесс поиска решения, когда оно найдено я даже могу утратить к проекту интересс. Улыбаюсь


 RXL,  что такое эфективный адресс ?
Записан

1n c0de we trust
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #14 : 01-06-2004 09:33 » 

Mayor, effective address - термин. Это адрес внутри сегмента памяти, адресуемого через сегментные регистры (точнее, через их теневое содержимое).

Привожу упрощенно и только для 32-ух битных адресаций x86:

effective address = base + index * scale + offset
Где, base и index - регистры общего назначения, scale=1,2,4,8, offset - целочисленное смещение.

logical address = segment base address + effective address

В современных ОС принята упрощенная модель flat (плоская) - сегменты с базой 0 и размером во всю память.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Mayor
Специалист

ru
Offline Offline

« Ответ #15 : 02-06-2004 10:42 » 

Теперь понял, сегментную модель памяти я не застал, сразу с flat начинал...

А про MME Intel плохо пишет, во всяком случае, то что я нашел: содержит нечто вроде: информация о БУП является собственностью Интел, если вы не являетесь разработчиком БИОС, драйверов управления памятью, знать ее вам не обязательно, иначе свяжитель с нами по ...
Может конечно сейчас они ее рассекретили, но я ее пока не искал.

Лучше наверное пока, макросами пользоваться, если что вспывет можно быстро поменять или от нечего делать просто поэксперементировать...
Записан

1n c0de we trust
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #16 : 02-06-2004 20:27 » 

Mayor, у меня литературка датированна 1995-м годом.
Сегменты появились еще на 8086, в реальном режиме. Это было просто segment_register*16+gp_register. На 286-м были уже 16-ти битные сегменты в защищенном режиме. Окончательно, сегментная модель устаканилась на 386-м.
Ремомендую почитать.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Mayor
Специалист

ru
Offline Offline

« Ответ #17 : 06-06-2004 02:00 » 

Сейчас это представляет скорее исторический интерес, да и я под dos программировать не умею. Я бы лучше про ММЕ iPentium почитал, вдруг это уже рассекретили.

Хотя, раз рекомендуешь, то хоть название бы написал Улыбаюсь , а то окажется что-нить раритетное типа Шрайбера...

У меня где-то на компе затерялась статья так, там сразу про 5 режимов адресации расказывается, а типов процессоров наверное штук 10 упоминается, разве что про z80 не вспомнили Улыбаюсь , но так сложно написано, что я мало что понял, если тебе интересно могу поискать

А еще чуть не забыл, на wasm Касперский, целую статью написал, про оптимизацию обращения к памяти, вот это тебе наверное интереснее будет почитать
Записан

1n c0de we trust
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #18 : 07-06-2004 10:20 » 

Доки ищи на http://www.intel.com - все на английском. На русском где скачать не знаю, но можно купить какую-нибудь книжку - это не дефицит.

Касперского читал - у него не одна подобная статья.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines