|
|
| Посл.отвђт | Сообщен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 - тогда все же медленнее будет, хотя не так.. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.045 |