Модератор-националист Kerk преследует оппонентов по политическим мотивам.
Здравствуйте, Bill Baklushi, Вы писали:
BB>Хороший оптимизатор обычно генерирует хороший машинный код.
Я тут недавно пытался понять зачем компилятор когда инлайнил vector<size_t>::resize нагенерил довольно запутанного AVX кода.
Претензий к результату нет — работает быстро, делает что нужно. Но почему так?
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Здравствуйте, Эйнсток Файр, Вы писали:
ЭФ>Может это как-то связано с копированием при resize? И через AVX это копирование идёт быстрее?
Копирование я бы узнал сразу, а тут вот что:
_2il0floatpacket_3873 xmmword 100000000000000010h
...
vmovdqu xmm2, cs:_2il0floatpacket_3833
lea r11, [rbp+rcx*8+0]
vpxor xmm1, xmm1, xmm1
vmovq xmm0, r11
add r11, 8
vpinsrq xmm3, xmm0, r11, 1
lea r11, ds:0[rcx*8]
vpcmpeqd xmm0, xmm0, xmm0
nop word ptr [rax+rax+00h]
loc_7540:
vpcmpeqq xmm4, xmm3, xmm1
add rcx, 8
vpxor xmm5, xmm0, xmm4
vpaddq xmm4, xmm3, xmm2
vpcmpeqq xmm3, xmm4, xmm1
vpxor xmm3, xmm0, xmm3
vmaskmovpd xmmword ptr [r11+rax], xmm5, xmm1
vmaskmovpd xmmword ptr [r11+rbp+10h], xmm3, xmm1
vpaddq xmm3, xmm4, xmm2
vpcmpeqq xmm5, xmm3, xmm1
vpaddq xmm3, xmm3, xmm2
vpcmpeqq xmm4, xmm3, xmm1
vpxor xmm5, xmm0, xmm5
vpxor xmm4, xmm0, xmm4
vpaddq xmm3, xmm3, xmm2
vmaskmovpd xmmword ptr [r11+rbp+20h], xmm5, xmm1
vmaskmovpd xmmword ptr [r11+rbp+30h], xmm4, xmm1
add r11, 40h
cmp rcx, r9
jb short loc_7540
test rdx, rdx
jz loc_765B
loc_75A5:
lea rax, [r9+1]
cmp r13, rax
jb loc_765B
sub r13, r9
lea rax, [rsi+r10*8]
lea rax, [rax+r9*8]
cmp r8b, 1
jnz short loc_75C7
loc_75C3:
xor edx, edx
jmp short loc_7629
; ---------------------------------------------------------------------------
loc_75C7:
cmp r13, 2
jl short loc_75C3
vmovq xmm1, rax
lea r8, [rax+8]
vpinsrq xmm3, xmm1, r8, 1
mov rdx, r13
vmovdqu xmm0, cs:_2il0floatpacket_3833
vpcmpeqd xmm2, xmm2, xmm2
vpxor xmm1, xmm1, xmm1
xor r8d, r8d
lea rcx, [rsi+r10*8]
and rdx, 0FFFFFFFFFFFFFFFEh
lea rbp, [rcx+r9*8]
xor ecx, ecx
loc_7600:
vpcmpeqq xmm4, xmm3, xmm1
add r8, 2
vpxor xmm5, xmm2, xmm4
vpaddq xmm3, xmm3, xmm0
vmaskmovpd xmmword ptr [rcx+rbp], xmm5, xmm1
add rcx, 10h
cmp r8, rdx
jb short loc_7600
test r13, 1
jz short loc_765B
loc_7629:
lea rcx, [rax+rdx*8]
lea rax, [rsi+r10*8]
lea rbp, ds:0[rdx*8]
lea rax, [rax+r9*8]
loc_763D:
test rcx, rcx
jz short loc_764B
mov qword ptr [rbp+rax+0], 0
loc_764B:
inc rdx
add rcx, 8
add rbp, 8
cmp rdx, r13
jl short loc_763D
loc_765B:
add rsp, 20h
pop rbp
pop r15
pop r14
pop r13
pop rsi
retn
Причём больше нигде такое в коде не встречается.
Причём если бы что там такое было особенное, так ведь нет, тупо красим дом Болконских:
vector<size_t> m_field;
...
m_field.resize (newSize);
Путём эксперимента выяснил что этот кусок делает инициализацию новых size_t в той части, которой вектор прирос. Почему то компилер решил что занулить эту область надо именно таким подвыподвертом.
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Здравствуйте, CreatorCray, Вы писали:
CC>Путём эксперимента выяснил что этот кусок делает инициализацию новых size_t в той части, которой вектор прирос. Почему то компилер решил что занулить эту область надо именно таким подвыподвертом.
Ну раз он заливает xmm1 в память, а тот занулён — то да, это memset нулевыми байтами. Остальное — попытка с помощью масок остановиться не перед невыровненным на 16 байт концом области, а после него. Не знаю, есть ли смысл; то, что я вижу по gcc, выглядит иначе — он останавливается перед границей, а хвост доливает уже поэлементными операциями.
Что быстрее — мерять надо. Может, на некэшированной памяти всё это уже тяжело пофиг...
Здравствуйте, netch80, Вы писали:
N>Ну раз он заливает xmm1 в память, а тот занулён — то да, это memset нулевыми байтами.
Там уже есть туева хуча других мемсетов, в том числе невыровненных. Но выглядят они иначе. Почему то этот кусок оно родило (и продолжает упорно рожать) именно таким.
N> Остальное — попытка с помощью масок остановиться не перед невыровненным на 16 байт концом области, а после него. Не знаю, есть ли смысл; то, что я вижу по gcc, выглядит иначе — он останавливается перед границей, а хвост доливает уже поэлементными операциями.
Остальные места выглядят именно так.
Неисповедимы пути компиляторские.
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>