[Bug tree-optimization/70479] New: FMA is not reassociated causing x2 slowdown vs. ICC
kyukhin at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Thu Mar 31 13:23:00 GMT 2016
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70479
Bug ID: 70479
Summary: FMA is not reassociated causing x2 slowdown vs. ICC
Product: gcc
Version: 6.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: kyukhin at gcc dot gnu.org
Target Milestone: ---
Created attachment 38146
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=38146&action=edit
Reproducer
Attached example demonstrates the issue.
GCC is recent trunk. ICC is v16.
Compile:
GCC: g++ -march=haswell -Ofast -flto -fopenmp-simd -fpermissive m.cpp -o
m.gcc
ICC: icpc -O3 -ipo -fpermissive -xAVX2 -qopenmp m.cpp -o m.icc
Run
GCC: time ./m.icc 20000 20000
ICC: time ./m.gcc 20000 20000
Hot spot generated by GCC (annotated w/ perf hit counts):
157 │8d0:┌─→vbroad 0x4(%r13),%zmm0
193 │ │ lea 0x1(%rdx),%edx
173 │ │ vmulps (%r14,%rax,1),%zmm0,%zmm0
2943│ │ vbroad 0x60(%r13),%zmm1
166 │ │ vbroad 0x5c(%r13),%zmm2
151 │ │ vbroad 0x58(%r13),%zmm3
144 │ │ vbroad 0x54(%r13),%zmm4
164 │ │ vbroad 0x50(%r13),%zmm5
170 │ │ vbroad 0x4c(%r13),%zmm6
162 │ │ vbroad 0x48(%r13),%zmm7
162 │ │ vbroad 0x44(%r13),%zmm8
154 │ │ vbroad 0x40(%r13),%zmm9
172 │ │ vbroad 0x3c(%r13),%zmm10
167 │ │ vbroad 0x38(%r13),%zmm11
172 │ │ vbroad 0x34(%r13),%zmm12
171 │ │ vbroad 0x30(%r13),%zmm13
161 │ │ vbroad 0x2c(%r13),%zmm14
176 │ │ vbroad 0x28(%r13),%zmm15
139 │ │ vbroad 0x24(%r13),%zmm16
180 │ │ vbroad 0x20(%r13),%zmm17
158 │ │ vbroad 0x1c(%r13),%zmm18
165 │ │ vbroad 0x18(%r13),%zmm19
140 │ │ vbroad 0x10(%r13),%zmm21
179 │ │ vbroad 0xc(%r13),%zmm22
146 │ │ vbroad 0x8(%r13),%zmm23
170 │ │ vbroad 0x0(%r13),%zmm24
170 │ │ vbroad 0x14(%r13),%zmm20
168 │ │ vfmadd (%r15,%rax,1),%zmm24,%zmm0
2732│ │ mov 0xb8(%rsp),%rcx
172 │ │ vfmadd (%r11,%rax,1),%zmm23,%zmm0
1649│ │ vfmadd (%rsi,%rax,1),%zmm22,%zmm0
3413│ │ vfmadd
(%rcx,%rax,1),%zmm21,%zmm0
3653│ │ mov 0xc0(%rsp),%rcx
182 │ │ vfmadd
(%rcx,%rax,1),%zmm20,%zmm0
2806│ │ mov 0xc8(%rsp),%rcx
176 │ │ vfmadd (%rcx,%rax,1),%zmm19,%zmm0
2439│ │ mov 0xd0(%rsp),%rcx
179 │ │ vfmadd (%rcx,%rax,1),%zmm18,%zmm0
2562│ │ mov 0xd8(%rsp),%rcx
197 │ │ vfmadd (%rcx,%rax,1),%zmm17,%zmm0
2867│ │ mov 0xe0(%rsp),%rcx
141 │ │ vfmadd (%rcx,%rax,1),%zmm16,%zmm0
3200│ │ mov 0xe8(%rsp),%rcx
156 │ │ vfmadd (%rcx,%rax,1),%zmm15,%zmm0
3557│ │ mov 0xf0(%rsp),%rcx
158 │ │ vfmadd (%rcx,%rax,1),%zmm14,%zmm0
3333│ │ mov 0xf8(%rsp),%rcx
143 │ │ vfmadd (%rcx,%rax,1),%zmm13,%zmm0
3004│ │ mov 0x100(%rsp),%rcx
177 │ │ vfmadd (%rcx,%rax,1),%zmm12,%zmm0
2876│ │ mov 0x108(%rsp),%rcx
144 │ │ vfmadd (%rcx,%rax,1),%zmm11,%zmm0
2838│ │ mov 0x110(%rsp),%rcx
168 │ │ vfmadd (%rcx,%rax,1),%zmm10,%zmm0
2503│ │ mov 0x118(%rsp),%rcx
203 │ │ vfmadd (%rcx,%rax,1),%zmm9,%zmm0
2471│ │ mov 0x120(%rsp),%rcx
185 │ │ vfmadd (%rcx,%rax,1),%zmm8,%zmm0
2153│ │ mov 0x128(%rsp),%rcx
152 │ │ vfmadd (%r12,%rax,1),%zmm7,%zmm0
2091│ │ vfmadd (%rbx,%rax,1),%zmm6,%zmm0
3049│ │ vfmadd (%r10,%rax,1),%zmm5,%zmm0
3737│ │ vfmadd (%r9,%rax,1),%zmm4,%zmm0
3665│ │ vfmadd (%r8,%rax,1),%zmm3,%zmm0
3627│ │ vfmadd (%rdi,%rax,1),%zmm2,%zmm0
3804│ │ vfmadd (%rcx,%rax,1),%zmm1,%zmm0
4052│ │ mov 0x130(%rsp),%rcx
160 │ │ cmp 0x138(%rsp),%edx
534 │ │ vmovup %zmm0,(%rcx,%rax,1)
3235│ │ lea 0x40(%rax),%rax
161 │ └──jb 8d0
Hot spot generated by ICC (annotated w/ perf hit counts):
344 │47a:┌─→vmulps 0x204c(%r11,%r14,4),%zmm27,%zmm2
821 │ │ vmulps 0x2050(%r11,%r14,4),%zmm4,%zmm1
318 │ │ vmulps 0x2040(%r11,%r14,4),%zmm6,%zmm29
818 │ │ vmulps 0x1840(%r11,%r14,4),%zmm7,%zmm31
275 │ │ vfmadd 0x1838(%r11,%r14,4),%zmm9,%zmm31
1234 │ │ vfmadd 0x183c(%r11,%r14,4),%zmm8,%zmm29
442 │ │ vfmadd 0x2044(%r11,%r14,4),%zmm5,%zmm2
1110 │ │ vfmadd 0x2048(%r11,%r14,4),%zmm28,%zmm1
337 │ │ vaddps %zmm29,%zmm31,%zmm0
1047 │ │ vaddps %zmm1,%zmm2,%zmm3
655 │ │ vmulps 0x1830(%r11,%r14,4),%zmm11,%zmm30
956 │ │ vmulps 0x1834(%r11,%r14,4),%zmm10,%zmm2
296 │ │ vmulps 0x1024(%r11,%r14,4),%zmm15,%zmm1
1050 │ │ vmulps 0x1028(%r11,%r14,4),%zmm14,%zmm31
294 │ │ vaddps %zmm0,%zmm3,%zmm3
1057 │ │ vfmadd 0x102c(%r11,%r14,4),%zmm13,%zmm30
344 │ │ vfmadd 0x1030(%r11,%r14,4),%zmm12,%zmm2
911 │ │ vfmadd 0x1020(%r11,%r14,4),%zmm16,%zmm31
332 │ │ vfmadd 0x820(%r11,%r14,4),%zmm17,%zmm1
885 │ │ vaddps %zmm2,%zmm30,%zmm29
486 │ │ vmulps 0x818(%r11,%r14,4),%zmm19,%zmm2
837 │ │ vaddps %zmm31,%zmm1,%zmm30
487 │ │ vmulps 0x81c(%r11,%r14,4),%zmm18,%zmm1
851 │ │ vfmadd 0x810(%r11,%r14,4),%zmm21,%zmm2
424 │ │ vfmadd 0x814(%r11,%r14,4),%zmm20,%zmm1
1123 │ │ vaddps %zmm30,%zmm29,%zmm29
389 │ │ vaddps %zmm1,%zmm2,%zmm31
1372 │ │ vmulps 0xc(%r11,%r14,4),%zmm23,%zmm2
311 │ │ vmulps 0x10(%r11,%r14,4),%zmm22,%zmm1
916 │ │ vaddps %zmm29,%zmm3,%zmm3
297 │ │ vfmadd (%r11,%r14,4),%zmm26,%zmm2
795 │ │ vfmadd 0x8(%r11,%r14,4),%zmm24,%zmm1
426 │ │ vaddps %zmm1,%zmm2,%zmm0
1275 │ │ vmulps 0x208c(%r11,%r14,4),%zmm27,%zmm1
364 │ │ vmulps 0x2080(%r11,%r14,4),%zmm6,%zmm30
1061 │ │ vfmadd 0x4(%r11,%r14,4),%zmm25,%zmm0
473 │ │ vfmadd 0x2084(%r11,%r14,4),%zmm5,%zmm1
1106 │ │ vaddps %zmm31,%zmm0,%zmm2
327 │ │ vmulps 0x2090(%r11,%r14,4),%zmm4,%zmm0
1410 │ │ vmulps 0x1880(%r11,%r14,4),%zmm7,%zmm29
274 │ │ vfmadd 0x2088(%r11,%r14,4),%zmm28,%zmm0
1317 │ │ vaddps %zmm2,%zmm3,%zmm2
364 │ │ vmulps 0x1874(%r11,%r14,4),%zmm10,%zmm3
1196 │ │ vaddps %zmm0,%zmm1,%zmm31
408 │ │ nop
9 │ │ vmulps 0x1870(%r11,%r14,4),%zmm11,%zmm0
374 │ │ vfmadd 0x1878(%r11,%r14,4),%zmm9,%zmm29
1515 │ │ vfmadd 0x187c(%r11,%r14,4),%zmm8,%zmm30
333 │ │ vfmadd 0x106c(%r11,%r14,4),%zmm13,%zmm0
1728 │ │ vfmadd 0x1070(%r11,%r14,4),%zmm12,%zmm3
306 │ │ vaddps %zmm30,%zmm29,%zmm1
1778 │ │ vmulps 0x1064(%r11,%r14,4),%zmm15,%zmm29
321 │ │ vaddps %zmm3,%zmm0,%zmm0
1826 │ │ vmulps 0x1068(%r11,%r14,4),%zmm14,%zmm3
347 │ │ vfmadd 0x860(%r11,%r14,4),%zmm17,%zmm29
1562 │ │ vaddps %zmm1,%zmm31,%zmm1
239 │ │ vfmadd 0x1060(%r11,%r14,4),%zmm16,%zmm3
1600 │ │ vmulps 0x85c(%r11,%r14,4),%zmm18,%zmm30
311 │ │ vaddps %zmm3,%zmm29,%zmm3
1776 │ │ vmulps 0x858(%r11,%r14,4),%zmm19,%zmm29
338 │ │ vfmadd 0x854(%r11,%r14,4),%zmm20,%zmm30
1588 │ │ vfmadd 0x850(%r11,%r14,4),%zmm21,%zmm29
292 │ │ vaddps %zmm3,%zmm0,%zmm0
1331 │ │ vaddps %zmm30,%zmm29,%zmm31
460 │ │ vmulps 0x4c(%r11,%r14,4),%zmm23,%zmm29
1365 │ │ vmulps 0x50(%r11,%r14,4),%zmm22,%zmm30
347 │ │ vaddps %zmm0,%zmm1,%zmm1
1461 │ │ vfmadd 0x40(%r11,%r14,4),%zmm26,%zmm29
489 │ │ vfmadd 0x48(%r11,%r14,4),%zmm24,%zmm30
1583 │ │ vaddps %zmm30,%zmm29,%zmm30
875 │ │ vfmadd 0x44(%r11,%r14,4),%zmm25,%zmm30
1912 │ │ vmovup %zmm2,0x1028(%r13,%r14,4)
1536 │ │ vaddps %zmm31,%zmm30,%zmm31
1472 │ │ vaddps %zmm31,%zmm1,%zmm0
1088 │ │ vmovup %zmm0,0x1068(%r13,%r14,4)
1644 │ │ add $0x20,%r14
182 │ │ cmp $0x200,%r14
10 │ └──jb 47a
The issue is that we not doing rebalancing of FMA calculations.
This issue might be reproduced on Haswell as well, although because
of shorter vector perf difference is about 30%
More information about the Gcc-bugs
mailing list