Mayor
Специалист
Offline
|
|
« : 19-05-2004 01:55 » |
|
мне нужна С функция меняющая местами N байт памяти , желательно оптимизированая для работы с адресами кратными 4 байтам. Как она называется ?
Если ее нет , то отслеживает ли MSVC 6 изменения в регистрах внутри директивы _asm или лучше их на всякий случай push \ pop ?
|
|
|
Записан
|
1n c0de we trust
|
|
|
lapulya
Молодой специалист
Offline
|
|
« Ответ #1 : 19-05-2004 08:49 » |
|
Вроде нет такой.... прийдется самому писать юзая memcpy.
|
|
|
Записан
|
С уважением Lapulya
|
|
|
Pu
Большой босс
Offline
78
|
|
« Ответ #2 : 19-05-2004 10:32 » |
|
а в чем проблема ? 1 забил памяти под промежуточный буфер malloc() 2 memmove в промежуточный буфер 3 memmove из промежуточного буфер 4 free() промежуточный буфер или я что не понял
|
|
|
Записан
|
Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать. (с) Артур Джонс
|
|
|
lapulya
Молодой специалист
Offline
|
|
« Ответ #3 : 19-05-2004 11:20 » |
|
memmove едленнее, чем memcpy а человеку нужна скорость
|
|
|
Записан
|
С уважением Lapulya
|
|
|
Pu
Большой босс
Offline
78
|
|
« Ответ #4 : 19-05-2004 11:36 » |
|
lapulya, ну если скорость - то ессесно на асме надо, хотя я понял что разверт этой темы идет в другой ветке. Где просто С.
|
|
|
Записан
|
Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать. (с) Артур Джонс
|
|
|
RXL
|
|
« Ответ #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
Молодой специалист
Offline
|
|
« Ответ #6 : 19-05-2004 13:44 » |
|
тока там надо i++ и на asm будет inc ecx
|
|
|
Записан
|
С уважением Lapulya
|
|
|
RXL
|
|
« Ответ #7 : 19-05-2004 14:02 » |
|
lapulya, ошибся - вначале написал от len к нулю, а переправил не все. Кстати, для for(i=len-1;i>0;i--) код выйдет короче - cmp не нужен.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
lapulya
Молодой специалист
Offline
|
|
« Ответ #8 : 19-05-2004 14:09 » |
|
точняк!
|
|
|
Записан
|
С уважением Lapulya
|
|
|
Mayor
Специалист
Offline
|
|
« Ответ #9 : 22-05-2004 04:25 » |
|
Генерируемый код достаточно оптимизирован:
Ну насчет оптимизации , незнаю : не поймешь быстрее ли mov edx,[ecx] чем mov edx,[ecx+edi] однозначно надо использовать , long вместо char . А вот насчет того , что быстрее : обмен через регистр или блок памяти я не знаю . Неизвестно как реализован кеш , в том плане , что не будет ли он тормозить при паралельных запросах на чтение запись в одну кеш-линию , не лучше ли их сделать последовательными ? И не будет ли лучше на продвинутых процах вначале обратиться к каждой кеш-линии , чтобы в кеш во время команд обмена начальных данных заносились последующие к чтению\записи участки памяти ?
|
|
|
Записан
|
1n c0de we trust
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #10 : 22-05-2004 06:30 » |
|
Mayor, Если оптимизировать до безобразия, то можно очень быстро уйти от поставленной задачи. И топтаться над одним куском текста месяцами. Всему нужны разумные пределы.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #11 : 22-05-2004 13:05 » |
|
И еще я хотел бы добавить фирма Интел выпускает новый процессор раз в два три года. И вся твоя оптимизация под свойство процессора летит. И еще, что делать с переносимостью кода. Например на процесор AMD или VIA.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
RXL
|
|
« Ответ #12 : 24-05-2004 09:46 » |
|
Mayor, вычисление эфективного адреса с использованием индекса требует дополнительного такта только для процесоров 486 и ниже. Это нормальная load-store модель - Intel и AMD заточены под это.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Mayor
Специалист
Offline
|
|
« Ответ #13 : 01-06-2004 02:35 » |
|
Finch, я не професиональный програмист, которому говорят: "программа пишется для пользователя, а не для програмиста", сроки и завершенность в данном случае не имеет значения, и поэтому я просто развлекаюсь с этой идеей , мне интересен сам процесс поиска решения, когда оно найдено я даже могу утратить к проекту интересс. RXL, что такое эфективный адресс ?
|
|
|
Записан
|
1n c0de we trust
|
|
|
RXL
|
|
« Ответ #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
Специалист
Offline
|
|
« Ответ #15 : 02-06-2004 10:42 » |
|
Теперь понял, сегментную модель памяти я не застал, сразу с flat начинал...
А про MME Intel плохо пишет, во всяком случае, то что я нашел: содержит нечто вроде: информация о БУП является собственностью Интел, если вы не являетесь разработчиком БИОС, драйверов управления памятью, знать ее вам не обязательно, иначе свяжитель с нами по ... Может конечно сейчас они ее рассекретили, но я ее пока не искал.
Лучше наверное пока, макросами пользоваться, если что вспывет можно быстро поменять или от нечего делать просто поэксперементировать...
|
|
|
Записан
|
1n c0de we trust
|
|
|
RXL
|
|
« Ответ #16 : 02-06-2004 20:27 » |
|
Mayor, у меня литературка датированна 1995-м годом. Сегменты появились еще на 8086, в реальном режиме. Это было просто segment_register*16+gp_register. На 286-м были уже 16-ти битные сегменты в защищенном режиме. Окончательно, сегментная модель устаканилась на 386-м. Ремомендую почитать.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Mayor
Специалист
Offline
|
|
« Ответ #17 : 06-06-2004 02:00 » |
|
Сейчас это представляет скорее исторический интерес, да и я под dos программировать не умею. Я бы лучше про ММЕ iPentium почитал, вдруг это уже рассекретили. Хотя, раз рекомендуешь, то хоть название бы написал , а то окажется что-нить раритетное типа Шрайбера... У меня где-то на компе затерялась статья так, там сразу про 5 режимов адресации расказывается, а типов процессоров наверное штук 10 упоминается, разве что про z80 не вспомнили , но так сложно написано, что я мало что понял, если тебе интересно могу поискать А еще чуть не забыл, на wasm Касперский, целую статью написал, про оптимизацию обращения к памяти, вот это тебе наверное интереснее будет почитать
|
|
|
Записан
|
1n c0de we trust
|
|
|
RXL
|
|
« Ответ #18 : 07-06-2004 10:20 » |
|
Доки ищи на http://www.intel.com - все на английском. На русском где скачать не знаю, но можно купить какую-нибудь книжку - это не дефицит. Касперского читал - у него не одна подобная статья.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
|