Re[5]: быстрое копирование памяти
От: Антипка Россия  
Дата: 22.08.05 06:10
Оценка:
Хай, Progger, Вижу, ты тут наколбасил:

Этот (правильный) код мы запомним, коментарий ниже:
P>mov eax,dword ptr [p1]
P>mov ecx,dword ptr [p2]
P>mov edx,dword ptr [ecx]
P>mov dword ptr [eax],edx
P>mov ecx,dword ptr [ecx+4]
P>mov dword ptr [eax+4],ecx

P>соотв. же строка "memcpy(p1, p2, 8)" только по одному вызову почти равняется приведённому коду.


P>во-вторых, в нормальных программах (читай "скомпилированных компилятором, настроенным нормальным программистом") выравнивание всегда кратно четырём (выравнивание QWORD хоть и предусмотрено, но реальной пользы в его использовании я не вижу). это я о фразе "выравнивание, подходящее для double" (это что за новое слово в программировании? если на то пошло, то DOUBLE'у, как и любой структуре в памяти, даже выравнивание BYTE подойдёт).


Весьма опрометчивое заявление. Ты хоть подозреваешь о существовании других процессорных архитектур, или для тебя свет клином сошелся на x86? Да и x86 начиная с 486 умеет прерываться по обращению к невыровненной панмяти, если установлен соответсвующий флаг. Кто гарантирует тебе, что в конкретном случае это будет не так?

P>в-третьих, настолько бездарно написать код копирования памяти могли только в microsoft'e (я не имею ничего против них, но все-таки). любой студент второго/третьего курса знает об инструкции MOVSD в сочетании с REPNE/REPNZ и напишет код, который короче в несколько раз и полностью поддается оптимизации процессором, в отличие от представленного в файле 'memcpy.asm'. интересущимся советую открыть соотв. исходники модуля System.pas среды Delphi и посмотреть как НАДО писать такие процедуры (копирование памяти выполняется с 4-хбайтным выравниванием, по возможности, обращаю внимание, а не с 2-хбайтным, как у MSVC).


Нет, ну какой-то за.....ц наехал на мою любимую компанию. Этого я так не оставлю. Да ладно бы еще по делу — это можно было бы и стерпеть, а тут — ну совершенно без повода. Короче, слушай сюда, коль сам напросился на порку: то, что ты предлагаешь — даже не вчерашний и не позавчерашний день, а просто доисторическая эра. Ты застрял на уровне Intel 8088. Для них ТАК действительно было оптимально. Короче, БЕГОМ В БИБЛИОТЕКУ. Начни со статьи "Опмизация программ на ассемблере для i486 и Pentium" (потом ты поймешь, что для последующих процессоров, начиная с пня-про, ситуация еще более актуальна).

Ладно, специально для тебя цитирую:

3.6. Какие команды использовать ?
1) Уже на i486 оптимизировались лишь так называемые часто используе-
мые команды: mov, add, sub, neg, inc, dec, xor, or, and, not, cmp,
test, команды сдвига и ветвления. Поэтому оказывается лучше использо-
вать вместо "тяжеловесных" команд последовательности простых.
Hа Р5 только простые команды являются спариваемыми (см. приложение).
Пример:

U V
rep movsd — ; 4 такта
--------------
1 байт за такт

но

U V
mloop:
mov eax,[esi] mov ebx,[esi+4] ; 1
mov ecx,[esi+8] mov edx,[esi+12] ; 2
mov [edi],eax mov [edi+4],ebx ; 3
mov [edi+8],ecx mov [edi+12],edx ; 4
add esi,16 add edi,16 ; 5
dec ebp jnz mloop ; 6
------------------
2.67 байта за такт

Разворачивая цикл дальше, в пределе получаем 4 байта за такт.



Теперь ты понял, почему мелкомягкие сделали именно так? Так кто из вас двоих (ты или M$) идиот?

Далее лезешь на сайт Интел и скачиваешь доки по их процессорному ряду x86. Самый важный документ для тебя — Intel Architecture Optimization Manual. Скачиваешь его (для каждой модели процессора он свой) и читаешь медленно и вдумчиво до просветления. Особое внимание обращаешь на различные stall'ы.


P>итог: если пользовать memcpy() то неплохо бы для начала переписать её КАК НАДО. если копировать стандартные типы WORD DWORD DOUBLE FLOAT и прочее, то не надо никакой memcpy().

Да, а тебе НЕПЛОХО БЫ прежде чем высказывать суждения по какому-либо поводу, получить хотя бы поверхностное представление об обсуждаемых вещах. Короче: СУДИ, ДРУЖОК, НЕ ВЫШЕ САПОГА.

PS. А что, дельфятник действительно выдает "REPNZ MOVSD" при включенной оптимизации по быстродействию? Если ответ "ДА", выкинь его на помойку и перейди на что-нибудь более современное/эффективное.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.