Re[2]: Компиляция - наше всё.
От: Bill Baklushi СССР  
Дата: 18.11.20 17:17
Оценка:
Эйнсток Файр:

ЭФ>Какой ещё код? Только чисто схемно-аппаратные решения!

Да, VHDL c Verilog-ом это очень интересно, к сожалению не копенгаген.

ASIC-и тем плохи, что решение там вшито, и в готовом чипе ничего не изменишь (AFAIK).

А обычные микроконтроллеры программировал на старом добром C.
Модератор-националист Kerk преследует оппонентов по политическим мотивам.
Re[3]: Компиляция - наше всё.
От: CreatorCray  
Дата: 18.11.20 18:43
Оценка:
Здравствуйте, Bill Baklushi, Вы писали:

BB>Хороший оптимизатор обычно генерирует хороший машинный код.

Я тут недавно пытался понять зачем компилятор когда инлайнил vector<size_t>::resize нагенерил довольно запутанного AVX кода.
Претензий к результату нет — работает быстро, делает что нужно. Но почему так?
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Re[4]: Компиляция - наше всё.
От: Эйнсток Файр Мухосранск Странный реагент
Дата: 19.11.20 00:52
Оценка:
CC> компилятор когда инлайнил vector<size_t>::resize нагенерил довольно запутанного AVX кода.
CC> Претензий к результату нет — работает быстро, делает что нужно. Но почему так?

Может это как-то связано с копированием при resize? И через AVX это копирование идёт быстрее?
Re[5]: Компиляция - наше всё.
От: CreatorCray  
Дата: 19.11.20 05:40
Оценка: 1 (1)
Здравствуйте, Эйнсток Файр, Вы писали:

ЭФ>Может это как-то связано с копированием при 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>>
Re[6]: Компиляция - наше всё.
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 19.11.20 10:50
Оценка:
Здравствуйте, CreatorCray, Вы писали:

CC>Путём эксперимента выяснил что этот кусок делает инициализацию новых size_t в той части, которой вектор прирос. Почему то компилер решил что занулить эту область надо именно таким подвыподвертом.


Ну раз он заливает xmm1 в память, а тот занулён — то да, это memset нулевыми байтами. Остальное — попытка с помощью масок остановиться не перед невыровненным на 16 байт концом области, а после него. Не знаю, есть ли смысл; то, что я вижу по gcc, выглядит иначе — он останавливается перед границей, а хвост доливает уже поэлементными операциями.
Что быстрее — мерять надо. Может, на некэшированной памяти всё это уже тяжело пофиг...
The God is real, unless declared integer.
Re[7]: Компиляция - наше всё.
От: CreatorCray  
Дата: 19.11.20 18:51
Оценка:
Здравствуйте, netch80, Вы писали:

N>Ну раз он заливает xmm1 в память, а тот занулён — то да, это memset нулевыми байтами.

Там уже есть туева хуча других мемсетов, в том числе невыровненных. Но выглядят они иначе. Почему то этот кусок оно родило (и продолжает упорно рожать) именно таким.

N> Остальное — попытка с помощью масок остановиться не перед невыровненным на 16 байт концом области, а после него. Не знаю, есть ли смысл; то, что я вижу по gcc, выглядит иначе — он останавливается перед границей, а хвост доливает уже поэлементными операциями.

Остальные места выглядят именно так.

Неисповедимы пути компиляторские.
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.