por fin llegué a la parte inferior de esta (y morir en la respuesta de Sente estaba en la dirección correcta, gracias)
En el siguiente, el horario de verano y src son 512 MByte std :: vector. Estoy usando el compilador Intel 10.1.029 y CRT.
En 64 bits tanto
memcpy(&dst[0],&src[0],dst.size())
y
memcpy(&dst[0],&src[0],N)
donde N es declarado previamente const size_t N=512*(1<<20);
llamada
__intel_fast_memcpy
la mayor parte de los cuales se compone de:
000000014004ED80 lea rcx,[rcx+40h]
000000014004ED84 lea rdx,[rdx+40h]
000000014004ED88 lea r8,[r8-40h]
000000014004ED8C prefetchnta [rdx+180h]
000000014004ED93 movdqu xmm0,xmmword ptr [rdx-40h]
000000014004ED98 movdqu xmm1,xmmword ptr [rdx-30h]
000000014004ED9D cmp r8,40h
000000014004EDA1 movntdq xmmword ptr [rcx-40h],xmm0
000000014004EDA6 movntdq xmmword ptr [rcx-30h],xmm1
000000014004EDAB movdqu xmm2,xmmword ptr [rdx-20h]
000000014004EDB0 movdqu xmm3,xmmword ptr [rdx-10h]
000000014004EDB5 movntdq xmmword ptr [rcx-20h],xmm2
000000014004EDBA movntdq xmmword ptr [rcx-10h],xmm3
000000014004EDBF jge 000000014004ED80
y funciona a ~ 2,200 Mbytes/s.
Pero en 32 bits
memcpy(&dst[0],&src[0],dst.size())
llamadas
__intel_fast_memcpy
la mayor parte del cual consiste en
004447A0 sub ecx,80h
004447A6 movdqa xmm0,xmmword ptr [esi]
004447AA movdqa xmm1,xmmword ptr [esi+10h]
004447AF movdqa xmmword ptr [edx],xmm0
004447B3 movdqa xmmword ptr [edx+10h],xmm1
004447B8 movdqa xmm2,xmmword ptr [esi+20h]
004447BD movdqa xmm3,xmmword ptr [esi+30h]
004447C2 movdqa xmmword ptr [edx+20h],xmm2
004447C7 movdqa xmmword ptr [edx+30h],xmm3
004447CC movdqa xmm4,xmmword ptr [esi+40h]
004447D1 movdqa xmm5,xmmword ptr [esi+50h]
004447D6 movdqa xmmword ptr [edx+40h],xmm4
004447DB movdqa xmmword ptr [edx+50h],xmm5
004447E0 movdqa xmm6,xmmword ptr [esi+60h]
004447E5 movdqa xmm7,xmmword ptr [esi+70h]
004447EA add esi,80h
004447F0 movdqa xmmword ptr [edx+60h],xmm6
004447F5 movdqa xmmword ptr [edx+70h],xmm7
004447FA add edx,80h
00444800 cmp ecx,80h
00444806 jge 004447A0
y funciona a ~ 1350 MByte/s solamente.
Sin embargo
memcpy(&dst[0],&src[0],N)
donde N es declarado previamente const size_t N=512*(1<<20);
compila (en 32 bits) a una llamada directa a un
__intel_VEC_memcpy
la mayor parte de los cuales consta de
0043FF40 movdqa xmm0,xmmword ptr [esi]
0043FF44 movdqa xmm1,xmmword ptr [esi+10h]
0043FF49 movdqa xmm2,xmmword ptr [esi+20h]
0043FF4E movdqa xmm3,xmmword ptr [esi+30h]
0043FF53 movntdq xmmword ptr [edi],xmm0
0043FF57 movntdq xmmword ptr [edi+10h],xmm1
0043FF5C movntdq xmmword ptr [edi+20h],xmm2
0043FF61 movntdq xmmword ptr [edi+30h],xmm3
0043FF66 movdqa xmm4,xmmword ptr [esi+40h]
0043FF6B movdqa xmm5,xmmword ptr [esi+50h]
0043FF70 movdqa xmm6,xmmword ptr [esi+60h]
0043FF75 movdqa xmm7,xmmword ptr [esi+70h]
0043FF7A movntdq xmmword ptr [edi+40h],xmm4
0043FF7F movntdq xmmword ptr [edi+50h],xmm5
0043FF84 movntdq xmmword ptr [edi+60h],xmm6
0043FF89 movntdq xmmword ptr [edi+70h],xmm7
0043FF8E lea esi,[esi+80h]
0043FF94 lea edi,[edi+80h]
0043FF9A dec ecx
0043FF9B jne ___intel_VEC_memcpy+244h (43FF40h)
y funciona a ~ 2100MByte/s (y prueba 32bit de alguna manera no es ancho de banda).
Retiro mi afirmación de que mi propio código SSE similar a memcpy sufre de un ~ 1300 MByte/limit similar en compilaciones de 32 bits; Ahora no tengo ningún problema obteniendo> 2GByte/s en 32 o 64 bits; el truco (como lo indica la sugerencia de los resultados anteriores) es usar almacenes no temporales ("transmisión") (por ejemplo, _mm_stream_ps
intrínseco).
Me parece un poco extraño que el 32 bits "dst.size()
" memcpy hace finalmente no llamada la versión más rápida "movnt
" (si es que paso en establecimiento de memoria no es el más increíble cantidad de CPUID
de cheques y heurística lógica por ejemplo, número comparar de bytes que se copiarán con el tamaño de caché, etc. antes de que se acerque a los datos reales de ), pero al menos ya entiendo el comportamiento observado (y es no relacionado con SysWow64 o H/W).
¿Quiere decir que su código de SSE es también el doble de rápido en el modo de 64 bits nativa que en WOW64? ¿Lo ha comparado con XP de 32 bits para ver si WOW64 está afectando el rendimiento? – bk1e
Sí, eso es exactamente. La prueba del sistema operativo de 32 bits es una sugerencia excelente ... ¡pero desafortunadamente no tenemos ningún H/W equivalente con sistema operativo de 32 bits! Esperaba que alguien me dijera si WOW64 es el problema o no. Se buscará obtener una instalación de 32 bits. – timday