я, наконец, добрался до нижней части этого (и умереть в ответ SENTE был на правильном пути, спасибо)
В приведенном ниже, целевой_адрес и СРК являются 512 МБайт станд :: вектор. Я использую компилятор Intel 10.1.029 и CRT.
На 64-битной и
memcpy(&dst[0],&src[0],dst.size())
и
memcpy(&dst[0],&src[0],N)
, где N предварительно объявлена const size_t N=512*(1<<20);
вызова
__intel_fast_memcpy
основная часть которых состоит из:
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
и работает на частоте ~ 2200 МБайт/с.
Но на 32-битном
memcpy(&dst[0],&src[0],dst.size())
звонки
__intel_fast_memcpy
большая часть которого состоит из
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
и работает только при ~ 1350 Мбайт/с.
ОДНАКО
memcpy(&dst[0],&src[0],N)
, где N предварительно объявлена const size_t N=512*(1<<20);
компилирует (на 32 бита) для прямого вызова к
__intel_VEC_memcpy
основная часть которого состоит из
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)
и работает при ~ 2100 Мбайт/с (и доказывает 32 бит не ограничена пропускной способностью).
Я отозвал свое утверждение о том, что мой собственный memcpy-подобный код SSE страдает от подобных ~ 1300 Мбайт/лимит в 32-битных сборках; У меня теперь нет никаких проблем получение> 2GByte/s на 32 или 64 бит; трюк (как подсказка выше) - использовать невременные («потоковые») магазины (например, _mm_stream_ps
).
Это кажется немного странным, что 32-битный «dst.size()
» тетср не в конечном итоге вызова быстрее «movnt
» версия (если вы вступаете в тетсру есть самое невероятное количество CPUID
проверки и эвристические логики, например, сравнивая число байтов, которые должны быть скопированы с размером кеша и т. Д., Прежде чем он будет находиться рядом с вашими фактическими данными ), но по крайней мере я понимаю наблюдаемое поведение сейчас (и это не связано с SysWow64 или H/W).
Вы говорите, что ваш код SSE также в два раза быстрее в родной 64-битном режиме, чем в WOW64? Вы сравнили это на 32-разрядной версии XP, чтобы увидеть, влияет ли WOW64 на производительность? – bk1e 2008-11-06 17:07:06
Да, это точно. 32-битный тест ОС - отличное предложение ... но, к сожалению, у нас нет эквивалентного H/W с 32-битной ОС! Я надеялся, что кто-нибудь скажет мне, является ли WOW64 проблемой или нет. Посмотрите на получение 32-битной установки. – timday 2008-11-07 13:30:24