· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.A&O —› Оптимизация MemMove

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Янв 29, 2004 11:20:25

Кто-нибудь пробывал оптимизировать MemMove?
Реально ли достичь максимума оптимизации и во сколько раз!!!!


Дата: Янв 29, 2004 11:35:54

критерий оптимизации? скорость, размер?


Дата: Янв 29, 2004 12:20:12

ПО СКОРОСТИ!!!


Дата: Янв 29, 2004 12:30:56

Хм.. только что с подобного топика..
копирование памяти :)


Дата: Янв 30, 2004 04:31:05

Этот вопрос сразу упирается в конкретный процессор.
Если нужно под любой, то использовать "movsd" или "mov eax,[esi]" и т.п.
Если есть MMX или SSE, то можно ими делать, что особенно важно при больших перекачках байтов. Раз стоит вопрос об оптимизации, то, видимо, много данных надо тащить и часто. Если перекинуть надо до килобайта, то лучше использовать стандартные методы. Особой разницы не заметишь.


Дата: Фев 2, 2004 14:38:07 · Поправил: S_T_A_S_

Посмотрите сюда
Там есть тестовая прога и примеры способов копирования


Дата: Мар 6, 2004 17:14:52

S_T_A_S_
Так это ведь для AMD!! Я работаю с Intel. А как известно все рпаивла касающиеся AMD не подходят для Intel.


Дата: Мар 11, 2004 05:34:24

emergenter
Ах да, у них даже наборы команд отличаются %-)))))

Следуйте совету интел: "use intel C compiler". А на остальные советы забейте. И результаты работы того теста на вашем же компьютере - тоже сущая чушь. Извините, что отнял ваше время.


Дата: Май 22, 2004 05:50:02

MMX и SSE - это как мертову припарка ;)
а оптимизировать MemMove и memcpy можно, причем очень даже значительно. подробности в "Технике оптимизации программ".


Дата: Май 22, 2004 22:14:25 · Поправил: S_T_A_S_

[ kaspersky : MMX и SSE - это как мертову припарка ;) ]

Неужели?
Я делал простейший тест (линк выше), который показывает, что это вполне конкретные цифры.

Хотя (относительно моего теста) не уместно говорить об использовании MMX/SSE, т.к. само по себе использование дополнительных команд ничего не даёт, используются лишь дополнитеольные регистры. Обычных просто не хватает.


ЗЫ
Интересно, чем отличаются MemMove от memcpy..


Дата: Май 22, 2004 23:08:24

memcpy не гарантирует корректность копирования перекрывающихся блоков, а memmove - таки да.
а для оптимизации необходимо: использовать естественный параллелизм чипсета и памяти (давать упреждающие запросы с шагом пакетного цикла обмена или на PIII юзать предвыборку);
использовать чередование банков кэша, что позволяет обрабатывать две пары ячеек в единицу времени;
выровнять адреса, если это только возможно;
копировать либо только впреред, либо блоками по несколько кил, двигаясь назад;
спланировать запросы с учетом иерархии очередей записи;
при необходимости "разбавить" код математическими инструкциями;
да много там чего еще можно придумать, особенно, на продвинутых многоканальных чисетах..


Дата: Май 22, 2004 23:26:21

> memcpy не гарантирует корректность копирования перекрывающихся блоков, а memmove - таки да.

Разве это имеет непосредственное отношение к оптимизации копирования блоков памяти..


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

Существует классический труд от Mike Wall: Using Block Prefetch for Optimized Memory Performance.
Там всё очень наглядно написано и без излишеств. AMD_block_prefetch_paper.pdf


Дата: Май 22, 2004 23:41:15

S_T_A_S_
Наверное kaspersky имел в виду процессоры с несколькими адресными шинами - это характерно для DSP и вообще всех SIMD.


Дата: Май 23, 2004 01:29:40

нихрена подобного. имеем код типа:
#define off_x	3
char str[]="0123456789abcdef...";

#ifdef _WRONG_
  memcpy (str+off_x,str,strlen(str) - off_x);
#else
  memmove(str+off_x,str,strlen(str) - off_x);
#endif
printf(str + off_x);

компилируем: cl.exe /Ox filename.c или bcc32.exe filename.c

memcpy дает: 01231237237b37bf
memmome дает: 0123456789abcdef


Дата: Май 23, 2004 02:17:35

Значит memmove копирует через буфер и будет медленнее чем memcpy.

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.370