Здравствуйте, Дубров Иван Сергеевич, Вы писали:
ДИС>Где-то я видел (AMD-шная статья кажется) кусок кода для быстрого копирования куска памяти (с использованием кэша, инструкций MMX и прочей фигни). При этом копирование REP MOVSD оказывается гораздо медленнее. Так что возможно есть способ гораздо быстрее REP STOSD.
(bandwidth: ~1630 Mbytes/sec)
#define CACHEBLOCK 400h // QWORDs in a block (8K bytes)
mov esi, [src] // source array
mov edi, [dst] // destination array
mov ecx, [len] // total number of QWORDS (8 bytes)
// (assumes len / CACHEBLOCK = integer)
lea esi, [esi+ecx*8]
lea edi, [edi+ecx*8]
neg ecx
emms
mainloop:
mov eax, CACHEBLOCK / 16 // note: prefetch loop is unrolled 2X
prefetchloop:
mov ebx, [esi+ecx*8] // Read one address in line,
mov ebx, [esi+ecx*8+64]// and one address in the next.
add ecx, 16 // add 16 QWORDS, = 2 64-byte cache lines
dec eax
jnz prefetchloop
sub ecx, CACHEBLOCK
mov eax, CACHEBLOCK / 8
writeloop:
movq mm0, qword ptr [esi+ecx*8]
.
.
movq mm7, qword ptr [esi+ecx*8+56]
movntq qword ptr [edi+ecx*8], mm0
.
.
movntq qword ptr [edi+ecx*8+56], mm7
add ecx, 8
dec eax
jnz writeloop
or ecx, ecx
jnz mainloop
sfence
emms