Size: a a a

Compiler Development

2020 March 08

M

MaxGraey in Compiler Development
Denis Gabidullin
./clang  1.15s user 0.00s system 99% cpu 1.155 total
./gcc  2.44s user 0.00s system 99% cpu 2.437 total

gcc развернул, но всё-равно не догнал
Но проблема не только в это:
https://godbolt.org/z/kjjqFA

Шланг использует 3  операции
       mov     rsi, qword ptr [rcx + test_s_array+131096]
       cmp     esi, 1
       adc     rdx, 0

В то время как GCC для того же аж вот такую пачку
       movsx   rax, ecx
       adc     r8, 0
       sal     rax, 5
       add     rax, OFFSET FLAT:test_s_array
       mov     rax, QWORD PTR [rax+24]
       cmp     eax, 1
       adc     r8, 0
       add     edx, 2
источник

DG

Denis Gabidullin in Compiler Development
MaxGraey
Но проблема не только в это:
https://godbolt.org/z/kjjqFA

Шланг использует 3  операции
       mov     rsi, qword ptr [rcx + test_s_array+131096]
       cmp     esi, 1
       adc     rdx, 0

В то время как GCC для того же аж вот такую пачку
       movsx   rax, ecx
       adc     r8, 0
       sal     rax, 5
       add     rax, OFFSET FLAT:test_s_array
       mov     rax, QWORD PTR [rax+24]
       cmp     eax, 1
       adc     r8, 0
       add     edx, 2
Да, я уже посмотрел.
Но я не могу понять причины.
Мне кажется, есть какое-то простое и очевидное объяснение. Но я его пока не нашёл.
Или у меня ошибка, но у меня уже "глаз замылился".
источник

M

MaxGraey in Compiler Development
Видимо поэтому и не хожет разворачивать цикл - потому как слишком большой оверхед и не вписывается в пределы по допустимому размеру
источник

DG

Denis Gabidullin in Compiler Development
MaxGraey
Видимо поэтому и не хожет разворачивать цикл - потому как слишком большой оверхед и не вписывается в пределы по допустимому размеру
Но почему gcc разворачивает цикл так неоптимально?
источник

M

MaxGraey in Compiler Development
Denis Gabidullin
Но почему gcc разворачивает цикл так неоптимально?
Проблема не в развороте цикла - это уже следствие. Проблема в неоптимальной кодогенерации GCC для
if( test_s_array[idx].f3 == 0 ) cnt++;
источник

FO

FORTRAN ONE LOVE in Compiler Development
Переслано от FORTRAN ONE LOVE
Эта штука вообше считает число нулевых элементов и умножает его на 4096
источник

FO

FORTRAN ONE LOVE in Compiler Development
Если это написать в таком виде, то есть смысл посмотреть, а что же реально происходит со скоростью
источник

E

EgorBo in Compiler Development
имхо совершенно верное поведение не разворачивать циклы везде подря в -О2
источник

E

EgorBo in Compiler Development
только в -О3
источник

DG

Denis Gabidullin in Compiler Development
Ладно, всем спасибо!
Попозже покапаю ещё.
источник

M

MaxGraey in Compiler Development
так там O3
источник

E

EgorBo in Compiler Development
когда компилируете под иос, там вроде по дефолту разворот циклов отключен насильно
источник

DG

Denis Gabidullin in Compiler Development
EgorBo
имхо совершенно верное поведение не разворачивать циклы везде подря в -О2
Там не O2, а Ofast
источник

E

EgorBo in Compiler Development
Denis Gabidullin
Там не O2, а Ofast
ок. но в целом это справделиво все равно, кланг в о2 постоянно что-то стремится развернуть
источник

M

MaxGraey in Compiler Development
И проблема не в развороте как я уже говорил, а тесты подтвердили
источник

AP

Antony Polukhin in Compiler Development
MaxGraey
Но проблема не только в это:
https://godbolt.org/z/kjjqFA

Шланг использует 3  операции
       mov     rsi, qword ptr [rcx + test_s_array+131096]
       cmp     esi, 1
       adc     rdx, 0

В то время как GCC для того же аж вот такую пачку
       movsx   rax, ecx
       adc     r8, 0
       sal     rax, 5
       add     rax, OFFSET FLAT:test_s_array
       mov     rax, QWORD PTR [rax+24]
       cmp     eax, 1
       adc     r8, 0
       add     edx, 2
Я тут новееький: а вы багу в GCC зарепортили?
источник

M

MaxGraey in Compiler Development
Antony Polukhin
Я тут новееький: а вы багу в GCC зарепортили?
Нет. Если кто то считает нужным, то было бы неплохо зарепортить. Я просто GCC не пользуюсь (линуксом тоже) да их в bugzilla не зарегистрирован
источник

BD

Berkus Decker in Compiler Development
Denis Gabidullin
А можете сказать, по каким конкретно причинам?
-march=native -mcpu=native пробовал?
источник

DG

Denis Gabidullin in Compiler Development
Berkus Decker
-march=native -mcpu=native пробовал?
-march пробовал, ничего не меняет. -mtune тоже.
-mcpu, вроде, deprеcated
источник

BD

Berkus Decker in Compiler Development
Denis Gabidullin
-march пробовал, ничего не меняет. -mtune тоже.
-mcpu, вроде, deprеcated
Есть вариант плюнуть на гцц и юзать шланг)
источник