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

 WASM Phorum —› WASM.ASSEMBLER —› Что быстрее?

. 1 . 2 . >>

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


Дата: Мар 18, 2004 01:16:52

Что быстрее?


   cld
   rep movsd


или

@@:
   movq mm(0), QWORD PTR [esi]
   movq QWORD PTR [edi], mm(0)
   add esi, SIZEOF QWORD
   add edi, SIZEOF QWORD
   loop @B


Дата: Мар 18, 2004 02:18:09

Результаты теста показали следующее:
для кода
cld
rep movsd

в среднем 390 мегов в секунду
для кода movq в среднем 440 мегов.
Замеры производились на блоке 16 мегабайт.

Для более быстрой переброски, я так думаю, придется оптимизировать под кэш.


Дата: Мар 18, 2004 02:32:12 · Поправил: Johnikum

[...deleted...]


Дата: Мар 18, 2004 02:46:23

Хмм.., я что-то не понял что делает твой код..
Значит с MMX всё-таки быстрее?


Дата: Мар 18, 2004 04:48:37

Люди, а я пытался сравнить rep movsd и mov eax,[esi];mov [edi],eax. Весь код не могу прилепить сейчас. На работе остался.
Там я сначала запускал CPUID 3 раза, как указано в инструкции Intel'а по использованию RDTSC. Первый вариант сначала запускал в холостую, чтобы перемещаемая память оказалось в кэше.
Потом эту память перемещал первым способом, потом вторым. Результаты считал соответственно.
Неоднократные тесты показали следующее: первый вариант работает на 2/3 быстрее второго.


Дата: Мар 18, 2004 04:58:32 · Поправил: SolidCode

А что, если перемещение из памяти в память сделать так:
mov     ecx,1024
mov     eax,esp ;for temp storage of stack pointer
mov     edx,[ptrDest]
mov     esp,[ptrSrc]
@@:
    pop     [edx]
    add     edx,4
    dec     ecx
    jnz     @B
mov     esp,eax ;restore stack pointer

Кто-нибудь поиграется?


Дата: Мар 18, 2004 05:33:16

Такая тема уже была..
Тут есть маленькая тестилка и исходник

SolidCode
Подобный код был самым быстрым на Speccy, а на х86 тоормозить будет сильно IMHO


Дата: Мар 18, 2004 06:17:59 · Поправил: Asterix

Хмм.., у Зубкова эта movntq даже не упоминается..
Исходник интересный ;-)


Дата: Мар 18, 2004 07:19:04

У меня был такой тестер:
cpuid
cpuid
;first time I do it to get the stuff into cache
cpuid
rdtsc
mov     xtml,eax
mov     xtmh,edx
mov     nCounter,LOOP_TIMES
.repeat
    dec     nCounter
    mov     ecx,LOOP_BYTES/4
    mov     esi,offset Buf
    mov     edi,offset NewBuf
    rep     movsd
.until nCounter==0
cpuid
rdtsc
sub     eax,xtml
sbb     edx,xtmh
mov     nMovsTime,eax
;now we start the actual race
cpuid
rdtsc
mov     xtml,eax
mov     xtmh,edx
mov     nCounter,LOOP_TIMES
.repeat
    dec     nCounter
    mov     ecx,LOOP_BYTES/4
    mov     esi,offset Buf
    mov     edi,offset NewBuf
    rep     movsd
.until nCounter==0
cpuid
rdtsc
sub     eax,xtml
sbb     edx,xtmh
mov     nMovsTime,eax
cpuid
rdtsc
mov     xtml,eax
mov     xtmh,edx
mov     nCounter,LOOP_TIMES
.repeat
    dec     nCounter
    mov     ecx,LOOP_BYTES/4
    mov     esi,offset Buf
    mov     edi,offset NewBuf
@@:
        mov     eax,[esi]
        mov     [edi],eax
        add     esi,4
        add     edi,4
        dec     ecx
        jnz     @B
.until nCounter==0
cpuid
rdtsc
sub     eax,xtml
sbb     edx,xtmh
mov     nMovTime,eax
jmp     @F
msg1    db "First loop done in %lu cycles.",13,10
        db "Second loop done in %lu cycles.",0
AppName db "Loop timer",0
@@:
invoke  wsprintf,offset Buf,offset msg1,nMovsTime,nMovTime
invoke  MessageBox,0,offset Buf,offset AppName,MB_OK


Дата: Мар 18, 2004 08:02:24

Asterix

у Зубкова эта movntq даже не упоминается..
Это потомучто у Randall Hyde про это не написано ;-)

[offtop]
кстати, exe с такой секцией импорта как там генерируется FASM'ом + макросы ;-) (если надо) [/offtop]



SolidCode
;first time I do it to get the stuff into cache

Чего-то не понял - скорость памяти там меряется или скорость кеша?
Кстати, используются счетчики в памяти - это вносит некоторую погрешность из-за конфликтов банков кеша.


Дата: Мар 18, 2004 15:52:36

А нужны ли перед измерением команды CPUID?
И нужно ли создавать идеальные условия?
Ведь в реальных условиях редко бывает, что работает один процесс, да еще с задранным приотритетом...

Или я чего то не понял?


Дата: Мар 18, 2004 21:37:04

Вот еще один вариантик (из книги "Техника оптимизации программ"):
;-----------------------------------------------
PAGE_SIZE	equ	4096     
PREFETCH_SIZE	equ	128 ;для P3 = 64

.XMM
	mov	esi,[Block1]
	mov	edi,[Block2]
	xor	ecx,ecx
mMove:
	mov	edx,ecx
	lea	ebx,[ecx+PAGE_SIZE]
	mov	eax,[esi+ecx+PAGE_SIZE]		
mPrefetch:
	prefetchnta	[esi+edx]
	prefetchnta	[esi+edx+PREFETCH_SIZE]
	add		edx,PREFETCH_SIZE*2
	cmp		edx,ebx
	jb		mPrefetch

	mov	edx,ecx
mMoveCh:
	movaps	xmm0,opt [esi+edx+16*0]
	movntps	opt [edi+edx+16*0],xmm0

	movaps	xmm0,opt [esi+edx+16*1]
	movntps	opt [edi+edx+16*1],xmm0

	movaps	xmm0,opt [esi+edx+16*2]
	movntps	opt [edi+edx+16*2],xmm0

	movaps	xmm0,opt [esi+edx+16*3]
	movntps	opt [edi+edx+16*3],xmm0

	movaps	xmm0,opt [esi+edx+16*4]
	movntps	opt [edi+edx+16*4],xmm0

	movaps	xmm0,opt [esi+edx+16*5]
	movntps	opt [edi+edx+16*5],xmm0

	movaps	xmm0,opt [esi+edx+16*6]
	movntps	opt [edi+edx+16*6],xmm0

	movaps	xmm0,opt [esi+edx+16*7]
	movntps	opt [edi+edx+16*7],xmm0

	add	edx,16*8
	cmp	edx,ebx
	jb	mMoveCh

	add	ecx,PAGE_SIZE
	cmp	ecx,sizeBlock
	jb	mMove
;-----------------------------------------------

скорость ~600 Мб/сек.


Дата: Мар 19, 2004 05:48:03

Johnikum
скорость ~600 Мб/сек.

Откуда такие цифры-то? Это как MOVSD :P
У меня bandwidth 1850 Mb/sec на DDR266 (под XP) получается при использовании movq/movntq.
Правда, с отимизацией.
Да и код я позаимствовал не из "Техника оптимизации программ", а из нормального (буржуйского) источника.
В ссылке, которую я привел выше, я на этот PDF линк давал. Рекомендую ;-)
А xmm+prefetchnta, как я понял из практики, толку мало дает, (видимо это взято из intel'овской рекламы SSE ;-)
Так что, можно зачастую обойтись более древними командами, главное "жесткий" префетч использовать, а не prefetchnta.


Дата: Мар 19, 2004 15:29:30

S_T_A_S_
PDF нашел. Дейсвительно что-то у меня тормознуто... Будем пробовать. Результаты сообщу попозжа.


Дата: Мар 19, 2004 19:53:29

Johnikum
А моя прога на вашем компе что показывает? А то память может SDRAM - тогда все же медленнее будет, хотя не так..

. 1 . 2 . >>


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