Re[4]: Как быстро заполнить память повторяющимися 4-мя байта
От: cpp Россия http://www.elecard.com
Дата: 19.12.02 05:01
Оценка:
Здравствуйте, Дубров Иван Сергеевич, Вы писали:

ДИС>Где-то я видел (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
Сергей.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.