an introduction to amd optimizing c/c++ compilerllvm.org/devmtg/2018-04/slides/das-an introduction...

35
AMD COMPILER GROUP SPEAKER: DIBYENDU DAS An Introduction to AMD Optimizing C/C++ Compiler 2018 European LLVM Developers Meeting

Upload: hacong

Post on 27-Nov-2018

249 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: An Introduction to AMD Optimizing C/C++ Compilerllvm.org/devmtg/2018-04/slides/Das-An Introduction to AMD... · AMD COMPILER GROUP SPEAKER: DIBYENDU DAS An Introduction to AMD Optimizing

AMD COMPILER GROUPSPEAKER: DIBYENDU DAS

An Introduction to AMD Optimizing C/C++ Compiler

2018 European LLVM Developers Meeting

Page 2: An Introduction to AMD Optimizing C/C++ Compilerllvm.org/devmtg/2018-04/slides/Das-An Introduction to AMD... · AMD COMPILER GROUP SPEAKER: DIBYENDU DAS An Introduction to AMD Optimizing

2 | 2018 EUROPEAN LLVM DEVELOPERS MEETING

AMD Optimizing C/C++ Compiler (“AOCC”) overview

Optimizations

Results

‒ SPEC CPU® 2017 Rate‒ More information about SPEC CPU2017 available at www.spec.org

Conclusion

OVERVIEW OF TALK

Page 3: An Introduction to AMD Optimizing C/C++ Compilerllvm.org/devmtg/2018-04/slides/Das-An Introduction to AMD... · AMD COMPILER GROUP SPEAKER: DIBYENDU DAS An Introduction to AMD Optimizing

3 | 2018 EUROPEAN LLVM DEVELOPERS MEETING

AOCC Overview

Page 4: An Introduction to AMD Optimizing C/C++ Compilerllvm.org/devmtg/2018-04/slides/Das-An Introduction to AMD... · AMD COMPILER GROUP SPEAKER: DIBYENDU DAS An Introduction to AMD Optimizing

4 | 2018 EUROPEAN LLVM DEVELOPERS MEETING

AOCC is AMD’s Optimizing C/C++ (and Fortran using DragonEgg/Flang) compiler based on LLVM

First version released mid-2017

Targeted for AMD’s Zen and future processors

Multiple release every year based on latest LLVM releases

WHAT IS AOCC ?

Page 5: An Introduction to AMD Optimizing C/C++ Compilerllvm.org/devmtg/2018-04/slides/Das-An Introduction to AMD... · AMD COMPILER GROUP SPEAKER: DIBYENDU DAS An Introduction to AMD Optimizing

5 | 2018 EUROPEAN LLVM DEVELOPERS MEETING

OPTIMIZATIONS IN AOCC Many optimizations – in this talk, we cover the following

‒ Vectorization‒Strided‒Epilog‒SAD, AVG‒SLP (jumbled memory)

‒ Data layout optimization‒ Array remapping‒ AOS -> SOA

‒ Loop optimizations‒Loop-versioned LICM‒Path-invariance based loop un-switching‒Improved loop strength reduction

‒ Generic scalar optimizations‒Recursion inlining‒Dynamic cast removal

‒ LLC optimizations‒znver1 scheduler model

Page 6: An Introduction to AMD Optimizing C/C++ Compilerllvm.org/devmtg/2018-04/slides/Das-An Introduction to AMD... · AMD COMPILER GROUP SPEAKER: DIBYENDU DAS An Introduction to AMD Optimizing

6 | 2018 EUROPEAN LLVM DEVELOPERS MEETING

AOCCVectorization

Page 7: An Introduction to AMD Optimizing C/C++ Compilerllvm.org/devmtg/2018-04/slides/Das-An Introduction to AMD... · AMD COMPILER GROUP SPEAKER: DIBYENDU DAS An Introduction to AMD Optimizing

7 | 2018 EUROPEAN LLVM DEVELOPERS MEETING

LOOP VECTORIZATION – SAD GENERATION

Generation of SAD (Sum of Absolute Difference) instruction

Modified both the loop vectorizer and the SLP vectorizer

Inner loop of x264_pixel_sad_8x8() in pixel.c

for( int x = 0; x < lx; x++ )

{

i_sum += abs( pix1[x] - pix2[x] );

}

(lx=8, pix1 and pix2 are uint8 pointers and i_sum is of type ‘int’)

movq (%rdi),%xmm3

movq (%rdx),%xmm1

psadbw %xmm1,%xmm3

http://lists.llvm.org/pipermail/llvm-dev/2015-February/081561.html

Page 8: An Introduction to AMD Optimizing C/C++ Compilerllvm.org/devmtg/2018-04/slides/Das-An Introduction to AMD... · AMD COMPILER GROUP SPEAKER: DIBYENDU DAS An Introduction to AMD Optimizing

8 | 2018 EUROPEAN LLVM DEVELOPERS MEETING

EPILOG LOOP VECTORIZATION

Currently Loop Vectorizer inserts an epilogue loop for handling loops that are not multiples of the ‘vector factor(VF)’‒Executed as scalar code

Epilog vectorization aims to vectorize epilog loop where original loop is vectorized with large vector factor‒Ex: for VF=16, you may have up to 15 iterations in the epilog‒Try to vectorize that using a lower VF=8 or VF=4

http://llvm.1065342.n5.nabble.com/llvm-dev-Proposal-RFC-Epilog-loop-vectorization-td106322.html

Page 9: An Introduction to AMD Optimizing C/C++ Compilerllvm.org/devmtg/2018-04/slides/Das-An Introduction to AMD... · AMD COMPILER GROUP SPEAKER: DIBYENDU DAS An Introduction to AMD Optimizing

9 | 2018 EUROPEAN LLVM DEVELOPERS MEETING

STRIDED VECTORIZATION

Compilers may fail to vectorize loops with strided accesses

Vectorization of strided data may incur‒ An overhead of ‘consolidating’ data into an operable vector, refer Figure (a)

‒ An overhead of ‘distributing’ the data elements after the operations - refer Figure (b).

Designed improved strided vectorization‒ Uses ‘skip factor’

a b c d

a b c d

Figure (a) : Example with stride 2 - loading data into an operable vector

p q r s

p q r s

Figure (b) : Example with stride 2 - storing data to strided memory

for (int i = 0; i < len; i++)a[i*2] = b[i*2] + c[i*3];

Page 10: An Introduction to AMD Optimizing C/C++ Compilerllvm.org/devmtg/2018-04/slides/Das-An Introduction to AMD... · AMD COMPILER GROUP SPEAKER: DIBYENDU DAS An Introduction to AMD Optimizing

10 | 2018 EUROPEAN LLVM DEVELOPERS MEETING

STRIDED VECTORIZATION - MEMORY SKIPPING

Skip factor helps to minimize the number of loads and stores‒ Example: for stride = 3 and VF = 4, generally 3 loads are required‒ But by skipping memory locations we can do with 2 loads

Load with stride 3 (i.e. load for b [ 3 * i ])%5 = getelementptr inbounds i32, i32* %b, i64 %.induction

%6 = bitcast i32* %5 to <4 x i32>*

%stride.load27 = load <4 x i32>, <4 x i32>* %6, align 1

%7 = getelementptr i32, i32* %5, i64 6

%8 = bitcast i32* %7 to <4 x i32>*

%stride.load28 = load <4 x i32>, <4 x i32>* %8, align 1

%strided.vec29 = shufflevector <4 x i32> %stride.load27, <4 x i32> %stride.load28, <4 x i32> <i32 0, i32 3, i32 4, i32 7>

0 1 2 3 4 5 6 7 8 9 10 11

Load#1 Load#2 Load#3

Note: Next GEP offset by 6, from

previous load

http://llvm.1065342.n5.nabble.com/llvm-dev-Proposal-RFC-Strided-Memory-Access-Vectorization-td96860.html

Page 11: An Introduction to AMD Optimizing C/C++ Compilerllvm.org/devmtg/2018-04/slides/Das-An Introduction to AMD... · AMD COMPILER GROUP SPEAKER: DIBYENDU DAS An Introduction to AMD Optimizing

11 | 2018 EUROPEAN LLVM DEVELOPERS MEETING

SLP VECTORIZATION

Non-Consecutive Accesses

Non-Isomorphic ALU Ops

Non-consecutive memory accesses add overheads in vectorization‒ Memory accesses may be jumbled ‒ As a group they access consecutive

memory locations though

Non-isomorphic operations such as ADD-SUB, MUL-SHIFT prevent exploitation of SIMD ALU ops

We cater to these scenarios‒Memory accesses are made consecutive‒ Increasing isomorphism

Submitted as a patch -https://reviews.llvm.org/D36130

Page 12: An Introduction to AMD Optimizing C/C++ Compilerllvm.org/devmtg/2018-04/slides/Das-An Introduction to AMD... · AMD COMPILER GROUP SPEAKER: DIBYENDU DAS An Introduction to AMD Optimizing

12 | 2018 EUROPEAN LLVM DEVELOPERS MEETING

LOOP VECTORIZATION - VPAVGB

Generation of AVG (average) instruction

VPAVGB (VEX.128 encoded version)

Page 13: An Introduction to AMD Optimizing C/C++ Compilerllvm.org/devmtg/2018-04/slides/Das-An Introduction to AMD... · AMD COMPILER GROUP SPEAKER: DIBYENDU DAS An Introduction to AMD Optimizing

13 | 2018 EUROPEAN LLVM DEVELOPERS MEETING

AOCCData Layout

Page 14: An Introduction to AMD Optimizing C/C++ Compilerllvm.org/devmtg/2018-04/slides/Das-An Introduction to AMD... · AMD COMPILER GROUP SPEAKER: DIBYENDU DAS An Introduction to AMD Optimizing

14 | 2018 EUROPEAN LLVM DEVELOPERS MEETING

AOS -> SOA

struct { struct {

long a; arr_a [N];

float b; arr_b[N];

} arr[N]; } Ns;

main() {

...

for (i=0; i < N; i++)

... = Ns.arr_a[i];

...

for (i=0; i < N; i++)

... = Ns.arr_b[i];

…..

}

a a a a a a a a

b b b b b b b b

Less cache misses

a b a b a b a b

a b a b a b a b

New Layout

Page 15: An Introduction to AMD Optimizing C/C++ Compilerllvm.org/devmtg/2018-04/slides/Das-An Introduction to AMD... · AMD COMPILER GROUP SPEAKER: DIBYENDU DAS An Introduction to AMD Optimizing

15 | 2018 EUROPEAN LLVM DEVELOPERS MEETING

ARRAY REMAPPING Transforms array accesses in a single dimensional array for better cache

utilization

Better cache utilization

void LBM_performStreamCollide(

LBM_Grid srcGrid, LBM_Grid dstGrid ) {

int i;

double ux, uy, uz, u2, rho;

for( i = 0; i < 20*1300000; i += N_CELL_ENTRIES ) {

if( TEST_FLAG_SWEEP( srcGrid, OBSTACLE )) {

dstGrid[0 + i] = srcGrid[0 + i];

dstGrid[-1998 + i] = srcGrid[1 + i];

dstGrid[2001 + i] = srcGrid[2 + i];

dstGrid[-16 + i] = srcGrid[3 + i];

dstGrid[23 + i] = srcGrid[4 + i];

dstGrid[-199994 + i] = srcGrid[5 + i];

dstGrid[200005 + i] = srcGrid[6 + i];

dstGrid[-2010 + i] = srcGrid[7 + i];

dstGrid[-1971 + i] = srcGrid[8 + i];

dstGrid[1988 + i] = srcGrid[9 + i];

dstGrid[2027 + i] = srcGrid[10 + i];

dstGrid[-201986 + i] = srcGrid[11 + i];

dstGrid[198013 + i] = srcGrid[12 + i];

dstGrid[-197988 + i] = srcGrid[13 + i];

dstGrid[202011 + i] = srcGrid[14 + i];

dstGrid[-200002 + i] = srcGrid[15 + i];

dstGrid[199997 + i] = srcGrid[16 + i];

dstGrid[-199964 + i] = srcGrid[17 + i];

dstGrid[200035 + i] = srcGrid[18 + i];

continue;

}

iteration 0

iteration 1

iteration n-1

iteration 0

iteration 1

iteration n-1

field_1field_2field_3

…field_mfield_1field_2field_3

…field_m

…field_1field_2field_3

…field_m

field_1field_1field_1

…field_1field_2field_2field_2

…field_2

…field_mfield_mfield_m

…field_m

a[0]a[1]a[2]

…a[m-1]a[m]

a[m+1]a[m+2]

…a[2m-1]

…a[(n-1)m]

a[(n-1)m+1]a[(n-1)m+2]

…a[nm-1]

a[0]a[1]a[2]

…a[n-1]a[n]

a[n+1]a[n+2]

…a[2n-1]

…a[(m-1)n]

a[(m-1)n+1]a[(m-1)n+2]

…a[mn-1]

iteration 0iteration 1

iteration n-1

a[i] becomes a[(i%m)*n+(i/m)]

Page 16: An Introduction to AMD Optimizing C/C++ Compilerllvm.org/devmtg/2018-04/slides/Das-An Introduction to AMD... · AMD COMPILER GROUP SPEAKER: DIBYENDU DAS An Introduction to AMD Optimizing

16 | 2018 EUROPEAN LLVM DEVELOPERS MEETING

AOCCLoop Optimization

Page 17: An Introduction to AMD Optimizing C/C++ Compilerllvm.org/devmtg/2018-04/slides/Das-An Introduction to AMD... · AMD COMPILER GROUP SPEAKER: DIBYENDU DAS An Introduction to AMD Optimizing

17 | 2018 EUROPEAN LLVM DEVELOPERS MEETING

LOOP VERSIONING LICM

Aliasing decisions are made at runtime

Creates two versions of the loop

‒ One with aggressive aliasing assumptions

‒ The original loop with conservative aliasing assumptions

These two loops are preceded by a memory runtime check [upstreamed]

LICM

Page 18: An Introduction to AMD Optimizing C/C++ Compilerllvm.org/devmtg/2018-04/slides/Das-An Introduction to AMD... · AMD COMPILER GROUP SPEAKER: DIBYENDU DAS An Introduction to AMD Optimizing

18 | 2018 EUROPEAN LLVM DEVELOPERS MEETING

PARTIAL LOOP UNSWITCH Identifies partial-invariant condition for a path

Moves the conditional from inside the loop to outside of it by duplicating the loop's body

Places a loop version inside each of the if and else clauses of the conditional

The variant path has the full loop with all conditions

The partially invariant path has the improved version

Page 19: An Introduction to AMD Optimizing C/C++ Compilerllvm.org/devmtg/2018-04/slides/Das-An Introduction to AMD... · AMD COMPILER GROUP SPEAKER: DIBYENDU DAS An Introduction to AMD Optimizing

19 | 2018 EUROPEAN LLVM DEVELOPERS MEETING

OTHER LOOP OPTIMIZATIONS

Improved induction variable life time splitting

Improved loop strength reduction (LSR) in nested loop

Page 20: An Introduction to AMD Optimizing C/C++ Compilerllvm.org/devmtg/2018-04/slides/Das-An Introduction to AMD... · AMD COMPILER GROUP SPEAKER: DIBYENDU DAS An Introduction to AMD Optimizing

20 | 2018 EUROPEAN LLVM DEVELOPERS MEETING

Scalar Optimizations

Page 21: An Introduction to AMD Optimizing C/C++ Compilerllvm.org/devmtg/2018-04/slides/Das-An Introduction to AMD... · AMD COMPILER GROUP SPEAKER: DIBYENDU DAS An Introduction to AMD Optimizing

21 | 2018 EUROPEAN LLVM DEVELOPERS MEETING

DYNAMIC CAST OPTIMIZATION

A dynamic cast test in C++ is converted into a typeid comparisonwhen the cast involves a leaf class in the inheritance graph

if (dynamic_cast<EtherPauseFrame*>(frame)!=NULL)

{

}

This is transformed into:

If (typeid(*frame) == typeid(EtherPauseFrame *))

{

}

Page 22: An Introduction to AMD Optimizing C/C++ Compilerllvm.org/devmtg/2018-04/slides/Das-An Introduction to AMD... · AMD COMPILER GROUP SPEAKER: DIBYENDU DAS An Introduction to AMD Optimizing

22 | 2018 EUROPEAN LLVM DEVELOPERS MEETING

Enables the inlining of recursive function

Works up to a certain depth by generating function clones

RECURSION INLINING

Page 23: An Introduction to AMD Optimizing C/C++ Compilerllvm.org/devmtg/2018-04/slides/Das-An Introduction to AMD... · AMD COMPILER GROUP SPEAKER: DIBYENDU DAS An Introduction to AMD Optimizing

23 | 2018 EUROPEAN LLVM DEVELOPERS MEETING

LLC Optimizations

Page 24: An Introduction to AMD Optimizing C/C++ Compilerllvm.org/devmtg/2018-04/slides/Das-An Introduction to AMD... · AMD COMPILER GROUP SPEAKER: DIBYENDU DAS An Introduction to AMD Optimizing

24 | 2018 EUROPEAN LLVM DEVELOPERS MEETING

LLC OPTS

Register Pressure-aware LICM

Redundant Load/Store and MOV Elimination

Branch Fusion: Re-order code to place CMP and TEST instructions immediately preceding BRANCH instructions

Promote constant to register:Replace ADD R1 ← R2, k (where k is a constant) withMOV R3 ← k and ADD R1 ← R2, R3

Shorter instruction encoding

Reduced instruction path length

Enable hardware micro-op fusion

znver1 Scheduler Model

Page 25: An Introduction to AMD Optimizing C/C++ Compilerllvm.org/devmtg/2018-04/slides/Das-An Introduction to AMD... · AMD COMPILER GROUP SPEAKER: DIBYENDU DAS An Introduction to AMD Optimizing

25 | 2018 EUROPEAN LLVM DEVELOPERS MEETING

ZNVER1 SCHEDULER MODEL

Zen scheduler model is added for sub-target named "znver1"

File: …/lib/Target/X86/X86ScheduleZnver1.td

Covers all Zen supported ISAs. Instructions are grouped as per their nature(Integer, FP, Move, Arithmetic, Logic, Control Transfer)

Exhaustive model that covers both integer and floating point execution units

‒ Covers latencies and micro-op details of all modeled instructions

Microcoded instructions are marked as WriteMicrocoded with high latency

Upstreamed

Page 26: An Introduction to AMD Optimizing C/C++ Compilerllvm.org/devmtg/2018-04/slides/Das-An Introduction to AMD... · AMD COMPILER GROUP SPEAKER: DIBYENDU DAS An Introduction to AMD Optimizing

26 | 2018 EUROPEAN LLVM DEVELOPERS MEETING

AOCCResults

Page 27: An Introduction to AMD Optimizing C/C++ Compilerllvm.org/devmtg/2018-04/slides/Das-An Introduction to AMD... · AMD COMPILER GROUP SPEAKER: DIBYENDU DAS An Introduction to AMD Optimizing

27 | 2018 EUROPEAN LLVM DEVELOPERS MEETING

25

6

24

2

33

4

16

0

25

7

66

7

28

7

28

2

65

2

21

5

30

3

23

6

19

4

33

4

15

4

24

5

60

0

30

3

26

1

57

1

17

3

27

731

1

29

6 33

4

16

0

34

0

70

0

28

5

28

5

65

2

21

5

32

5

24

1 26

0

34

8

16

1

32

6

68

2

30

5

27

1

57

3

18

8

30

5

Rat

io

xeon 8180 base epyc 7601 base xeon 8180 peak epyc 7601 peak

SPEC CPU® 2017 Rate (INT)EPYC™ 7601 VS XEON PLATINUM 8180

EPYC 7601(Supermicro) + AOCC 1.0

XEON 8180(Asus) + icc 18.0.0.128 https://www.spec.org/cpu2017/results/res2018q1/cpu2017-20180108-02536.html

https://www.spec.org/cpu2017/results/res2018q1/cpu2017-20180121-02623.html

Page 28: An Introduction to AMD Optimizing C/C++ Compilerllvm.org/devmtg/2018-04/slides/Das-An Introduction to AMD... · AMD COMPILER GROUP SPEAKER: DIBYENDU DAS An Introduction to AMD Optimizing

28 | 2018 EUROPEAN LLVM DEVELOPERS MEETING

48

8

25

3 26

6

12

6

43

2

12

0

22

0

34

5

29

8

52

7

46

4

15

0

94

25

2

59

1

29

2

23

8

14

5

30

2

15

3

28

2

32

8

27

0

45

0

38

5

18

9

96

25

7

48

8

25

2 26

7

12

6

50

4

12

1

22

0

34

7

30

1

52

6

47

2

15

0

97

25

7

61

1

29

6

27

6

18

1

33

4

15

4

28

4

33

6

27

8

46

9

39

4

19

1

12

1

27

5

Rat

io

xeon 8180 base epyc 7601 base xeon 8180 peak epyc 7601 peak

https://www.spec.org/cpu2017/results/res2018q1/cpu2017-20180108-02537.html

https://www.spec.org/cpu2017/results/res2018q1/cpu2017-20180121-02625.html

EPYC 7601 (Supermicro) + AOCC 1.0

XEON 8180 (Asus) + icc 18.0.0.128

SPEC CPU® 2017 Rate (FP)EPYC™ 7601 VS XEON PLATINUM 8180

Page 29: An Introduction to AMD Optimizing C/C++ Compilerllvm.org/devmtg/2018-04/slides/Das-An Introduction to AMD... · AMD COMPILER GROUP SPEAKER: DIBYENDU DAS An Introduction to AMD Optimizing

29 | 2018 EUROPEAN LLVM DEVELOPERS MEETING

PHORONIX

https://www.phoronix.com/scan.php?page=article&item=amd-aocc-11&num=1

AMD AOCC 1.1 Shows Compiler Improvements vs. GCC vs. Clang

(Jan, 2018)

Page 30: An Introduction to AMD Optimizing C/C++ Compilerllvm.org/devmtg/2018-04/slides/Das-An Introduction to AMD... · AMD COMPILER GROUP SPEAKER: DIBYENDU DAS An Introduction to AMD Optimizing

30 | 2018 EUROPEAN LLVM DEVELOPERS MEETING

AOCCResources

Page 31: An Introduction to AMD Optimizing C/C++ Compilerllvm.org/devmtg/2018-04/slides/Das-An Introduction to AMD... · AMD COMPILER GROUP SPEAKER: DIBYENDU DAS An Introduction to AMD Optimizing

31 | 2018 EUROPEAN LLVM DEVELOPERS MEETING

AOCC WEB PAGE (developer.amd.com)

https://developer.amd.com/amd-aocc/

We have released AOCC 1.1 and will release AOCC 1.2 aligned with

LLVM 6.0 very soon

Page 32: An Introduction to AMD Optimizing C/C++ Compilerllvm.org/devmtg/2018-04/slides/Das-An Introduction to AMD... · AMD COMPILER GROUP SPEAKER: DIBYENDU DAS An Introduction to AMD Optimizing

32 | 2018 EUROPEAN LLVM DEVELOPERS MEETING

Conclusion

Page 33: An Introduction to AMD Optimizing C/C++ Compilerllvm.org/devmtg/2018-04/slides/Das-An Introduction to AMD... · AMD COMPILER GROUP SPEAKER: DIBYENDU DAS An Introduction to AMD Optimizing

33 | 2018 EUROPEAN LLVM DEVELOPERS MEETING

CONCLUSION

We have demonstrated a powerful optimizing compiler built on top of the latest LLVM

Introduced many optimizations in opt and llc‒Some of them upstreamed already

We want to upstream more aggressively

A BIG THANK YOU to the entire community for making this possible

Page 34: An Introduction to AMD Optimizing C/C++ Compilerllvm.org/devmtg/2018-04/slides/Das-An Introduction to AMD... · AMD COMPILER GROUP SPEAKER: DIBYENDU DAS An Introduction to AMD Optimizing

34 | 2018 EUROPEAN LLVM DEVELOPERS MEETING

ACKNOWLEDGEMENTS Abhilash Bhandari Anupama Rasale Ashutosh Nema Bala Rishi Bhogadi Bhargav Reddy Godala Deepak Porwal Deepali Rai Ganesh Gopalasubramanian Ganesh Prasad Md Asghar Ahmad Shahid Muthu Kumar Raj Nagarajan Nagajyothi Eggone Pradeep Rao Pratap Gadi Prathiba Kumar Pratik Dayanand Bhatu Rajasekhar Venkata Bhetala Ravindra Venkata Durgi Santosh Zanjurne Satish Kumar Narayanaswamy Shivarama Rao Suresh Mani Venkataramanan Kumar Venugopal Raghavan Vishwanath Prasad Sunil Anthony Jay Hiremath

Page 35: An Introduction to AMD Optimizing C/C++ Compilerllvm.org/devmtg/2018-04/slides/Das-An Introduction to AMD... · AMD COMPILER GROUP SPEAKER: DIBYENDU DAS An Introduction to AMD Optimizing

35 | 2018 EUROPEAN LLVM DEVELOPERS MEETING

DISCLAIMER & ATTRIBUTION

The information presented in this document is for informational purposes only and may contain technical inaccuracies, omissions and typographical errors.

The information contained herein is subject to change and may be rendered inaccurate for many reasons, including but not limited to product and roadmap changes, component and motherboard version changes, new model and/or product releases, product differences between differing manufacturers, software changes, BIOS flashes, firmware upgrades, or the like. AMD assumes no obligation to update or otherwise correct or revise this information. However, AMD reserves the right to revise this information and to make changes from time to time to the content hereof without obligation of AMD to notify any person of such revisions or changes.

AMD MAKES NO REPRESENTATIONS OR WARRANTIES WITH RESPECT TO THE CONTENTS HEREOF AND ASSUMES NO RESPONSIBILITY FOR ANY INACCURACIES, ERRORS OR OMISSIONS THAT MAY APPEAR IN THIS INFORMATION.

AMD SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE. IN NO EVENT WILL AMD BE LIABLE TO ANY PERSON FOR ANY DIRECT, INDIRECT, SPECIAL OR OTHER CONSEQUENTIAL DAMAGES ARISING FROM THE USE OF ANY INFORMATION CONTAINED HEREIN, EVEN IF AMD IS EXPRESSLY ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

ATTRIBUTION

© 2018 Advanced Micro Devices, Inc. All rights reserved. AMD, the AMD Arrow logo and combinations thereof are trademarks of Advanced Micro Devices, Inc. in the United States and/or other jurisdictions. Other names are for informational purposes only and may be trademarks of their respective owners.