[harvard cs264] 03 - introduction to gpu computing, cuda basics

258
Lecture #3: GPU Programming with CUDA | February 8th, 2011 Nicolas Pinto (MIT, Harvard) [email protected] Massively Parallel Computing CS 264 / CSCI E-292

Upload: npinto

Post on 16-Apr-2017

2.509 views

Category:

Education


2 download

TRANSCRIPT

Lecture #3: GPU Programming with CUDA | February 8th, 2011

Nicolas Pinto (MIT, Harvard) [email protected]

Massively Parallel ComputingCS 264 / CSCI E-292

Administrivia• New here? Welcome!

• HW0: Forum, RSS, Survey

• Lecture 1 & 2 slides posted

• Project teams allowed (up to 2 students)

• innocentive-like / challenge-driven ?

• HW1: out tonight/tomorrow, due Fri 2/18/11

• New guest lecturers!

• Wen-mei Hwu (UIUC/NCSA), Cyrus Omar (CMU), Cliff Wooley (NVIDIA), Richard Lethin (Reservoir Labs), James Malcom (Accelereyes), David Cox (Harvard)

During this course,

we’ll try to

and use existing material ;-)

“ ”

adapted for CS264

Todayyey!!

Objectives

• Get your started with GPU Programming

• Introduce CUDA

• “20,000 foot view”

• Get used to the jargon...

• ...with just enough details

• Point to relevant external resources

Outline

• Thinking Parallel (review)

• Why GPUs ?

• CUDA Overview

• Programming Model

• Threading/Execution Hierarchy

• Memory/Communication Hierarchy

• CUDA Programming

Outline

• Thinking Parallel (review)

• Why GPUs ?

• CUDA Overview

• Programming Model

• Threading/Execution Hierarchy

• Memory/Communication Hierarchy

• CUDA Programming

Thinking Parallel(last week)

Review

Getting your feet wet

• Common scenario: “I want to make the algorithm X run faster, help me!”

• Q: How do you approach the problem?

How?

How?

• Option 1: wait

• Option 2: gcc -O3 -msse4.2

• Option 3: xlc -O5

• Option 4: use parallel libraries (e.g. (cu)blas)

• Option 5: hand-optimize everything!

• Option 6: wait more

What else ?

How about analysis ?

Getting your feet wet

0

25

50

75

100

load_data() foo() bar() yey()

50

1110

29

time

(s)

Algorithm X v1.0 Profiling Analysis on Input 10x10x10

sequential in nature

100% parallelizable

Q: What is the maximum speed up ?

Getting your feet wet

0

25

50

75

100

load_data() foo() bar() yey()

50

1110

29

time

(s)

Algorithm X v1.0 Profiling Analysis on Input 10x10x10

sequential in nature

100% parallelizable

A: 2X ! :-(

You need to...

• ... understand the problem (duh!)

• ... study the current (sequential?) solutions and their constraints

• ... know the input domain

• ... profile accordingly

• ... “refactor” based on new constraints (hw/sw)

9 Some Perspective

Technical Problem to be Analyzed

Direct elimination equation solver

Discretization "A"

Scientific Model "A"

Sequential implementationParallel implementation

Iterative equation solver

Discretization "B"

Consultation with experts

Model "B"

Experiments

Theoretical analysis

Figure 11: The “problem tree” for scientific problem solving. There are many

options to try to achieve the same goal.

56

from Scott et al. “Scientific Parallel Computing” (2005)

Some PerspectiveThe “problem tree” for scientific problem solving

There are many options to try to achieve the same goal.

Computational Thinking

• translate/formulate domain problems into computational models that can be solved efficiently by available computing resources

• requires a deep understanding of their relationships

adapted from Hwu & Kirk (PASI 2011)

Architecture Algorithms

ParallelComputing

Languages

APPLICATIONS

Figure 3: Knowledge of algorithms, architecture, and languages contributes to ef-

fective use of parallel computers in practical applications.

9

adapted from Scott et al. “Scientific Parallel Computing” (2005)

Getting ready...

CompilersPatterns

Programming Models

Parallel Thinking

You can do it!

• thinking parallel is not as hard as you may think

• many techniques have been thoroughly explained...

• ... and are now “accessible” to non-experts !

Outline

• Thinking Parallel (review)

• Why GPUs ?

• CUDA Overview

• Programming Model

• Threading/Execution Hierarchy

• Memory/Communication Hierarchy

• CUDA Programming

Why GPUs?

!"#$$%&$'()*+,-.(/$$0

1+2*3+24(56(738892:(;<=,89<>(?<9-@(A<*B,-@(C-,D2+@,86

/E#E/$$0

F

!"#$%&"'()'*+&+,,",'-./0%$123

!"#"$$%$&'()*+,-./&-0&"&1(#)&(1&'()*+,-./&-.&

23-'3&)".4&-.0,#+',-(.0&"#%&'"##-%5&(+,&

0-)+$,".%(+0$441510"61+

! 7&+61$1.2+,,8)',+&3"9'":0"2;1<"9';0"#1+,1="6

! >:.$1#'?%0"&#./0%$"&;'@>3)'-&+8A

! B1;$&1C%$"6'?8;$"/;'@>3)'D?-E'4F1$"9'G,%"H"2"A'

! *+&+,,",'#./0%$123'I+;'$&+61$1.2+,,8'

12+##";;1C,"'$.'$F"'#.//.61$8'/+&5"$0,+#"

!"#$%&'()*$+,-.%/'0%(,1,(2(%&'()'1$1-%&'3-3%#43%

-.'#%"0%5&",&"&#",%&(1&#(+/3$4&"&1"',(#&(1&,2(&*%#&4%"#&666&

7%#,"-.$4&(8%#&,3%&03(#,&,%#)&,3-0&#",%&'".&9%&%:*%',%5&,(&

'(.,-.+%;&-1&.(,&,(&-.'#%"0%6&<8%#&,3%&$(./%#&,%#);&,3%&

#",%&(1&-.'#%"0%&-0&"&9-,&)(#%&+.'%#,"-.;&"$,3(+/3&,3%#%&-0&

.(&#%"0(.&,(&9%$-%8%&-,&2-$$&.(,&#%)"-.&.%"#$4&'(.0,".,&1(#&

",&$%"0,&=>&4%"#06&?3",&)%".0&94&=@AB;&,3%&.+)9%#&(1&

'()*(.%.,0&*%#&-.,%/#",%5&'-#'+-,&1(#&)-.-)+)&'(0,&2-$$&

9%&CB;>>>6&D&9%$-%8%&,3",&0+'3&"&$"#/%&'-#'+-,&'".&9%&9+-$,&

'1%4%3,15*$%64/$07

H.&6.2'J..&"9'>,"#$&.21#;'J+3+=12"9'KL'D0&1,'KLMN

! 7F"'/.;$'"#.2./1#'2%/C"&'.O'#./0.2"2$;'

12'+2'E-'I1,,'6.%C,"'"<"&8'8"+&

! P1;$.&1#+,,8'!-*Q;'3"$'O+;$"&

"P+&6I+&"'&"+#F123'O&"R%"2#8',1/1$+$1.2;

! S.I'!-*Q;'3"$'I16"&

! T+$F"&'$F+2'":0"#$123'-*Q;'$.'3"$'$I1#"'+;'

O+;$9'":0"#$'$.'F+<"'$I1#"'+;'/+28U

! *+&+,,",'0&.#";;123'O.&'$F"'/+;;";

! Q2O.&$%2+$",8)'*+&+,,",'0&.3&+//123'1;'F+&6V''

"D,3.&1$F/;'+26'B+$+'?$&%#$%&";'/%;$'C"'O%26+/"2$+,,8'&"6";132"6

slide by Matthew Bolitho

Motivation

GPUs

Motivation?

Motivation

CPU

GPU

GFL

OP

S !"#!"#$#%&'()*%&+,-.-/0-&1234567.&89*:;)

$"##<=4>&+234&?@&6.A

0&12345,-/&89*:;)

Fact: nobody cares about theoretical peak

Challenge: harness GPU power for real application performance

Motivation

!"#$$%&$'()*+,-.(/$$0

1+2*3+24(56(738892:(;<=,89<>(?<9-@(A<*B,-@(C-,D2+@,86

/E#E/$$0

F

!"#$%&"'()'*+&+,,",'-./0%$123

!"#"$$%$&'()*+,-./&-0&"&1(#)&(1&'()*+,-./&-.&

23-'3&)".4&-.0,#+',-(.0&"#%&'"##-%5&(+,&

0-)+$,".%(+0$441510"61+

! 7&+61$1.2+,,8)',+&3"9'":0"2;1<"9';0"#1+,1="6

! >:.$1#'?%0"&#./0%$"&;'@>3)'-&+8A

! B1;$&1C%$"6'?8;$"/;'@>3)'D?-E'4F1$"9'G,%"H"2"A'

! *+&+,,",'#./0%$123'I+;'$&+61$1.2+,,8'

12+##";;1C,"'$.'$F"'#.//.61$8'/+&5"$0,+#"

!"#$%&'()*$+,-.%/'0%(,1,(2(%&'()'1$1-%&'3-3%#43%

-.'#%"0%5&",&"&#",%&(1&#(+/3$4&"&1"',(#&(1&,2(&*%#&4%"#&666&

7%#,"-.$4&(8%#&,3%&03(#,&,%#)&,3-0&#",%&'".&9%&%:*%',%5&,(&

'(.,-.+%;&-1&.(,&,(&-.'#%"0%6&<8%#&,3%&$(./%#&,%#);&,3%&

#",%&(1&-.'#%"0%&-0&"&9-,&)(#%&+.'%#,"-.;&"$,3(+/3&,3%#%&-0&

.(&#%"0(.&,(&9%$-%8%&-,&2-$$&.(,&#%)"-.&.%"#$4&'(.0,".,&1(#&

",&$%"0,&=>&4%"#06&?3",&)%".0&94&=@AB;&,3%&.+)9%#&(1&

'()*(.%.,0&*%#&-.,%/#",%5&'-#'+-,&1(#&)-.-)+)&'(0,&2-$$&

9%&CB;>>>6&D&9%$-%8%&,3",&0+'3&"&$"#/%&'-#'+-,&'".&9%&9+-$,&

'1%4%3,15*$%64/$07

H.&6.2'J..&"9'>,"#$&.21#;'J+3+=12"9'KL'D0&1,'KLMN

! 7F"'/.;$'"#.2./1#'2%/C"&'.O'#./0.2"2$;'

12'+2'E-'I1,,'6.%C,"'"<"&8'8"+&

! P1;$.&1#+,,8'!-*Q;'3"$'O+;$"&

"P+&6I+&"'&"+#F123'O&"R%"2#8',1/1$+$1.2;

! S.I'!-*Q;'3"$'I16"&

! T+$F"&'$F+2'":0"#$123'-*Q;'$.'3"$'$I1#"'+;'

O+;$9'":0"#$'$.'F+<"'$I1#"'+;'/+28U

! *+&+,,",'0&.#";;123'O.&'$F"'/+;;";

! Q2O.&$%2+$",8)'*+&+,,",'0&.3&+//123'1;'F+&6V''

"D,3.&1$F/;'+26'B+$+'?$&%#$%&";'/%;$'C"'O%26+/"2$+,,8'&"6";132"6

Motivation

slide by Matthew Bolitho

Task vs Data ParallelismCPUs vs GPUs

Task parallelism

• Distribute the tasks across processors based on dependency

• Coarse-grain parallelism

30

Task 1Task 2

Task 4Task 5 Task 6

Task 7 Task 8Task 9

Task 3

Task dependency graph

Task assignment across 3 processors

Task 1

Task 4

Task 7

Task 5

Task 8

Task 2

Task 6

Task 3

Task 9

P1

P2

P3

Time

Data parallelism

• Run a single kernel over many elements–Each element is independently updated–Same operation is applied on each element

• Fine-grain parallelism–Many lightweight threads, easy to switch context–Maps well to ALU heavy architecture : GPU

31

Kernel P1 P2 P3 P4 P5 Pn…….

…….Data

4

Task vs. Data parallelismTask vs. Data parallelism

• Task parallel

– Independent processes with little communication

– Easy to use

• “Free” on modern operating systems with SMP

• Data parallel

– Lots of data on which the same computation is being

executed

– No dependencies between data elements in each

step in the computation

– Can saturate many ALUs

– But often requires redesign of traditional algorithms

slide by Mike Houston

5

CPU vs. GPUCPU vs. GPU

• CPU

– Really fast caches (great for data reuse)

– Fine branching granularity

– Lots of different processes/threads

– High performance on a single thread of execution

• GPU

– Lots of math units

– Fast access to onboard memory

– Run a program on each fragment/vertex

– High throughput on parallel tasks

• CPUs are great for task parallelism

• GPUs are great for data parallelismslide by Mike Houston

GPU Computing?

• Design target for CPUs:• Make a single thread very fast• Take control away from

programmer

• GPU Computing takes adifferent approach:

• Throughput matters—single threads do not

• Give explicit control toprogrammer

Discuss HW1 Intro to GPU Computing

!"#$$%&$'()*+,-.(/$$0

1+2*3+24(56(738892:(;<=,89<>(?<9-@(A<*B,-@(C-,D2+@,86

EFG$F/$$0

&

! !"#$%&$'()*(+,-.'/

!012('&.*2(3'45&*)&6,7'&"2'89':&%;<=&;>6?&;*2(4'& !012('&.*2(3'45&*)&6,7'&"2'89':&%;<=&;>6?&;*2(4'&

! 6'401-'@&)*(&+,3AB0-3'-407':&C,(,DD'D&

C(*8D'+4/

! E*('&3(,-4043*(4&@'@0.,3'@&3*&?">&3A,-&)D*F&

.*-3(*D&,-@&@,3,&.,.A'

! GA,3&,('&3A'&.*-4'H2'-.'4I

! GA,3&,('&3A'&.*-4'H2'-.'4I

! $(*1(,+&+243&8'&+*('&C('@0.3,8D'/

! 6,3,&,..'44&.*A'('-.5

! $(*1(,+&)D*F

GPUs ?

slide by Matthew Bolitho

From CPUs to GPUs(how did we end up there?)

Intro PyOpenCL What and Why? OpenCL

“CPU-style” Cores

SIGGRAPH 2009: Beyond Programmable Shading: http://s09.idav.ucdavis.edu/

CPU-“style” cores

ALU (Execute)

Fetch/ Decode

Execution Context

Out-of-order control logic

Fancy branch predictor

Memory pre-fetcher

Data cache (A big one)

13

Credit: Kayvon Fatahalian (Stanford)

Andreas Klockner GPU-Python with PyOpenCL and PyCUDA

Intro PyOpenCL What and Why? OpenCL

Slimming down

SIGGRAPH 2009: Beyond Programmable Shading: http://s09.idav.ucdavis.edu/

Slimming down

ALU (Execute)

Fetch/ Decode

Execution Context

Idea #1:

Remove components that help a single instruction stream run fast

14

Credit: Kayvon Fatahalian (Stanford)

Andreas Klockner GPU-Python with PyOpenCL and PyCUDAslide by

Intro PyOpenCL What and Why? OpenCL

More Space: Double the Number of Cores

SIGGRAPH 2009: Beyond Programmable Shading: http://s09.idav.ucdavis.edu/

Two cores (two fragments in parallel)

ALU (Execute)

Fetch/ Decode

Execution Context

ALU (Execute)

Fetch/ Decode

Execution Context

!"#$$%&'()*"'+,-.

&*/01'.+23.453.623.&2.

/%1..+73.423.892:2;.

/*"".+73.4<3.892:<;3.+7.

/*"".+73.4=3.892:=;3.+7.

81/0.+73.+73.1>[email protected]><?2@.

/%1..A23.+23.+7.

/%1..A<3.+<3.+7.

/%1..A=3.+=3.+7.

/A4..A73.1><?2@.

fragment 1

!"#$$%&'()*"'+,-.

&*/01'.+23.453.623.&2.

/%1..+73.423.892:2;.

/*"".+73.4<3.892:<;3.+7.

/*"".+73.4=3.892:=;3.+7.

81/0.+73.+73.1>[email protected]><?2@.

/%1..A23.+23.+7.

/%1..A<3.+<3.+7.

/%1..A=3.+=3.+7.

/A4..A73.1><?2@.

fragment 2

15

Credit: Kayvon Fatahalian (Stanford)

Andreas Klockner GPU-Python with PyOpenCL and PyCUDAslide by

Intro PyOpenCL What and Why? OpenCL

. . . again

SIGGRAPH 2009: Beyond Programmable Shading: http://s09.idav.ucdavis.edu/

Four cores (four fragments in parallel)

ALU (Execute)

Fetch/ Decode

Execution Context

ALU (Execute)

Fetch/ Decode

Execution Context

ALU (Execute)

Fetch/ Decode

Execution Context

ALU (Execute)

Fetch/ Decode

Execution Context

16

Credit: Kayvon Fatahalian (Stanford)

Andreas Klockner GPU-Python with PyOpenCL and PyCUDAslide by

Intro PyOpenCL What and Why? OpenCL

. . . and again

SIGGRAPH 2009: Beyond Programmable Shading: http://s09.idav.ucdavis.edu/

Sixteen cores (sixteen fragments in parallel)

ALU ALU

ALU ALU

ALU ALU

ALU ALU

ALU ALU

ALU ALU

ALU ALU

ALU ALU

16 cores = 16 simultaneous instruction streams 17 Credit: Kayvon Fatahalian (Stanford)

→ 16 independent instruction streams

Reality: instruction streams not actuallyvery different/independent

Andreas Klockner GPU-Python with PyOpenCL and PyCUDAslide by

Intro PyOpenCL What and Why? OpenCL

. . . and again

SIGGRAPH 2009: Beyond Programmable Shading: http://s09.idav.ucdavis.edu/

Sixteen cores (sixteen fragments in parallel)

ALU ALU

ALU ALU

ALU ALU

ALU ALU

ALU ALU

ALU ALU

ALU ALU

ALU ALU

16 cores = 16 simultaneous instruction streams 17 Credit: Kayvon Fatahalian (Stanford)

→ 16 independent instruction streams

Reality: instruction streams not actuallyvery different/independent

Andreas Klockner GPU-Python with PyOpenCL and PyCUDAslide by

Intro PyOpenCL What and Why? OpenCL

Saving Yet More Space

SIGGRAPH 2009: Beyond Programmable Shading: http://s09.idav.ucdavis.edu/

Recall: simple processing core

Fetch/ Decode

ALU (Execute)

Execution Context

19 SIGGRAPH 2009: Beyond Programmable Shading: http://s09.idav.ucdavis.edu/

Recall: simple processing core

Fetch/ Decode

ALU (Execute)

Execution Context

19

Idea #2

Amortize cost/complexity ofmanaging an instruction streamacross many ALUs

→ SIMD

Credit: Kayvon Fatahalian (Stanford)

Andreas Klockner GPU-Python with PyOpenCL and PyCUDAslide by

Intro PyOpenCL What and Why? OpenCL

Saving Yet More Space

SIGGRAPH 2009: Beyond Programmable Shading: http://s09.idav.ucdavis.edu/

Recall: simple processing core

Fetch/ Decode

ALU (Execute)

Execution Context

19 SIGGRAPH 2009: Beyond Programmable Shading: http://s09.idav.ucdavis.edu/

Recall: simple processing core

Fetch/ Decode

ALU (Execute)

Execution Context

19

Idea #2

Amortize cost/complexity ofmanaging an instruction streamacross many ALUs

→ SIMD

Credit: Kayvon Fatahalian (Stanford)

Andreas Klockner GPU-Python with PyOpenCL and PyCUDAslide by

Intro PyOpenCL What and Why? OpenCL

Saving Yet More Space

SIGGRAPH 2009: Beyond Programmable Shading: http://s09.idav.ucdavis.edu/

Add ALUs

Fetch/ Decode

Idea #2:

Amortize cost/complexity of managing an instruction stream across many ALUs

ALU 1 ALU 2 ALU 3 ALU 4

ALU 5 ALU 6 ALU 7 ALU 8

SIMD processing Ctx Ctx Ctx Ctx

Ctx Ctx Ctx Ctx

Shared Ctx Data

20 SIGGRAPH 2009: Beyond Programmable Shading: http://s09.idav.ucdavis.edu/

Recall: simple processing core

Fetch/ Decode

ALU (Execute)

Execution Context

19

Idea #2

Amortize cost/complexity ofmanaging an instruction streamacross many ALUs

→ SIMD

Credit: Kayvon Fatahalian (Stanford)

Andreas Klockner GPU-Python with PyOpenCL and PyCUDAslide by

Intro PyOpenCL What and Why? OpenCL

Saving Yet More Space

SIGGRAPH 2009: Beyond Programmable Shading: http://s09.idav.ucdavis.edu/

Add ALUs

Fetch/ Decode

Idea #2:

Amortize cost/complexity of managing an instruction stream across many ALUs

ALU 1 ALU 2 ALU 3 ALU 4

ALU 5 ALU 6 ALU 7 ALU 8

SIMD processing Ctx Ctx Ctx Ctx

Ctx Ctx Ctx Ctx

Shared Ctx Data

20 SIGGRAPH 2009: Beyond Programmable Shading: http://s09.idav.ucdavis.edu/

Add ALUs

Fetch/ Decode

Idea #2:

Amortize cost/complexity of managing an instruction stream across many ALUs

ALU 1 ALU 2 ALU 3 ALU 4

ALU 5 ALU 6 ALU 7 ALU 8

SIMD processing Ctx Ctx Ctx Ctx

Ctx Ctx Ctx Ctx

Shared Ctx Data

20

Idea #2

Amortize cost/complexity ofmanaging an instruction streamacross many ALUs

→ SIMD

Credit: Kayvon Fatahalian (Stanford)

Andreas Klockner GPU-Python with PyOpenCL and PyCUDAslide by

Intro PyOpenCL What and Why? OpenCL

Gratuitous Amounts of Parallelism!

SIGGRAPH 2009: Beyond Programmable Shading: http://s09.idav.ucdavis.edu/

128 fragments in parallel

= 16 simultaneous instruction streams 16 cores = 128 ALUs

24 Credit: Kayvon Fatahalian (Stanford)

Example:

128 instruction streams in parallel16 independent groups of 8 synchronized streams

Andreas Klockner GPU-Python with PyOpenCL and PyCUDAslide by

http://www.youtube.com/watch?v=1yH_j8-VVLo

Intro PyOpenCL What and Why? OpenCL

Gratuitous Amounts of Parallelism!

SIGGRAPH 2009: Beyond Programmable Shading: http://s09.idav.ucdavis.edu/

128 fragments in parallel

= 16 simultaneous instruction streams 16 cores = 128 ALUs

24 Credit: Kayvon Fatahalian (Stanford)

Example:

128 instruction streams in parallel16 independent groups of 8 synchronized streams

Andreas Klockner GPU-Python with PyOpenCL and PyCUDA

http://www.youtube.com/watch?v=1yH_j8-VVLo

slide by

Intro PyOpenCL What and Why? OpenCL

Remaining Problem: Slow Memory

Problem

Memory still has very high latency. . .. . . but we’ve removed most of thehardware that helps us deal with that.

We’ve removed

caches

branch prediction

out-of-order execution

So what now?

Idea #3

Even more parallelism+ Some extra memory= A solution!

Andreas Klockner GPU-Python with PyOpenCL and PyCUDAslide by

Intro PyOpenCL What and Why? OpenCL

Remaining Problem: Slow Memory

Problem

Memory still has very high latency. . .. . . but we’ve removed most of thehardware that helps us deal with that.

We’ve removed

caches

branch prediction

out-of-order execution

So what now?SIGGRAPH 2009: Beyond Programmable Shading: http://s09.idav.ucdavis.edu/

Hiding shader stalls Time

(clocks) Frag 1 … 8

Fetch/ Decode

Ctx Ctx Ctx Ctx

Ctx Ctx Ctx Ctx

Shared Ctx Data

ALU ALU ALU ALU

ALU ALU ALU ALU

33

Idea #3

Even more parallelism+ Some extra memory= A solution!

Andreas Klockner GPU-Python with PyOpenCL and PyCUDAslide by

Intro PyOpenCL What and Why? OpenCL

Remaining Problem: Slow Memory

Problem

Memory still has very high latency. . .. . . but we’ve removed most of thehardware that helps us deal with that.

We’ve removed

caches

branch prediction

out-of-order execution

So what now?SIGGRAPH 2009: Beyond Programmable Shading: http://s09.idav.ucdavis.edu/

Hiding shader stalls Time

(clocks)

Fetch/ Decode

ALU ALU ALU ALU

ALU ALU ALU ALU

1 2

3 4

1 2 3 4

Frag 1 … 8 Frag 9… 16 Frag 17 … 24 Frag 25 … 32

34

Idea #3

Even more parallelism+ Some extra memory= A solution!

Andreas Klockner GPU-Python with PyOpenCL and PyCUDAslide by

Hiding Memory Latency

SIGGRAPH 2009: Beyond Programmable Shading: http://s09.idav.ucdavis.edu/

Hiding shader stalls Time

(clocks)

Fetch/ Decode

ALU ALU ALU ALU

ALU ALU ALU ALU

1 2

3 4

1 2 3 4

Frag 1 … 8 Frag 9… 16 Frag 17 … 24 Frag 25 … 32

34

Credit: Kayvon Fatahalian (Stanford)

Discuss HW1 Intro to GPU Computing

Hiding Memory Latency

SIGGRAPH 2009: Beyond Programmable Shading: http://s09.idav.ucdavis.edu/

Hiding shader stalls Time

(clocks)

Stall

Runnable

1 2 3 4

Frag 1 … 8 Frag 9… 16 Frag 17 … 24 Frag 25 … 32

35

Credit: Kayvon Fatahalian (Stanford)

Discuss HW1 Intro to GPU Computing

Hiding Memory Latency

SIGGRAPH 2009: Beyond Programmable Shading: http://s09.idav.ucdavis.edu/

Hiding shader stalls Time

(clocks)

Stall

Runnable

1 2 3 4

Frag 1 … 8 Frag 9… 16 Frag 17 … 24 Frag 25 … 32

36

Credit: Kayvon Fatahalian (Stanford)

Discuss HW1 Intro to GPU Computing

Hiding Memory Latency

SIGGRAPH 2009: Beyond Programmable Shading: http://s09.idav.ucdavis.edu/

Hiding shader stalls Time

(clocks)

1 2 3 4

Stall

Stall

Stall

Stall

Runnable

Runnable

Runnable

Frag 1 … 8 Frag 9… 16 Frag 17 … 24 Frag 25 … 32

37

Credit: Kayvon Fatahalian (Stanford)

Discuss HW1 Intro to GPU Computing

Intro PyOpenCL What and Why? OpenCL

GPU Architecture Summary

Core Ideas:

1 Many slimmed down cores→ lots of parallelism

2 More ALUs, Fewer Control Units

3 Avoid memory stalls by interleavingexecution of SIMD groups(“warps”)

Credit: Kayvon Fatahalian (Stanford)

Andreas Klockner GPU-Python with PyOpenCL and PyCUDAslide by

!"#$$%&$'()*+,-.(/$$0

1+2*3+24(56(738892:(;<=,89<>(?<9-@(A<*B,-@(C-,D2+@,86

EFG$F/$$0

&

! !"#$%&$'()*(+,-.'/

!012('&.*2(3'45&*)&6,7'&"2'89':&%;<=&;>6?&;*2(4'& !012('&.*2(3'45&*)&6,7'&"2'89':&%;<=&;>6?&;*2(4'&

! 6'401-'@&)*(&+,3AB0-3'-407':&C,(,DD'D&

C(*8D'+4/

! E*('&3(,-4043*(4&@'@0.,3'@&3*&?">&3A,-&)D*F&

.*-3(*D&,-@&@,3,&.,.A'

! GA,3&,('&3A'&.*-4'H2'-.'4I

! GA,3&,('&3A'&.*-4'H2'-.'4I

! $(*1(,+&+243&8'&+*('&C('@0.3,8D'/

! 6,3,&,..'44&.*A'('-.5

! $(*1(,+&)D*F

slide by Matthew Bolitho

Is it free?

Outline

• Thinking Parallel (review)

• Why GPUs ?

• CUDA Overview

• Programming Model

• Threading/Execution Hierarchy

• Memory/Communication Hierarchy

• CUDA Programming

CUDA Overview

!

"#!"#$%&'()%*+,-.,/012+%3./456'1(%7'6)%389:

*,.;<+/$%=*=*8*,.;<+/$%=*=*8

>?9$ !"!"# @ 6,'2A%6)+%=*8%'16.%(+1+,0<B45,4.C+%

2./456'1(%;D%20C6'1(%4,.;<+/%0C%(,04)'2C

E5,1%F060%'16.%'/0(+C%GH6+I65,+%/04CJK

E5,1%0<(.,'6)/C%'16.%'/0(+%CD16)+C'C%GH,+1F+,'1(%40CC+CJK

*,./'C'1(%,+C5<6CL%;56$

E.5()%<+0,1'1(%25,M+L%40,6'25<0,<D%-.,%1.1B(,04)'2C%+I4+,6C

*.6+16'0<<D%)'()%.M+,)+0F%.-%(,04)'2C%:*N

&'()<D%2.1C6,0'1+F%/+/.,D%<0D.56%O%022+CC%/.F+<

P++F%-.,%/01D%40CC+C%F,'M+C%54%;01F7'F6)%2.1C5/46'.1

"$!"#$%&'()%*+,-.,/012+%3./456'1(%7'6)%389:

!.<56'.1$%=*8%3./456'1(!.<56'.1$%=*8%3./456'1(

PQR$ !"#$%&'()*+,-$7'6)%389:

389:%S%%&'()*.$#,+/+.0$12+3.2$4256+*.5*)2.

3.BF+C'(1+F%)0,F70,+%O%C.-670,+%-.,%F',+26%=*8%2./456'1(

&0,F70,+$%-5<<D%(+1+,0<%F060B40,0<<+<%0,2)'6+265,+

!.-670,+$%4,.(,0/%6)+%=*8%'1%3

=+1+,0<%6),+0F%<0512)

=<.;0<%<.0FBC6.,+

*0,0<<+<%F060%202)+

!20<0,%0,2)'6+265,+

N16+(+,CL%;'6%.4+,06'.1C

9.5;<+%4,+2'C'.1%GC..1K

!20<0;<+%F060B40,0<<+<%

+I+256'.1T/+/.,D%/.F+<

3%7'6)%/'1'/0<%D+6%

4.7+,-5<%+I6+1C'.1C

GPGPU...

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

E

!"#$%&"'()'*+$&,-%#$.,+'/,'0%-1

! !"#$$%&'()*+$+,#'-./0&'1234')$5'3234

! 21+-13'145"-'16,%$'789:

! 1634'7'81.$-"0'69+-9),:'3;"<.="0'4)<)>

! 2&'3234';$509'!"#$$%&'<)*+$+,#:'?;<@

! 9,4$'3.5"'7*9:;'"<="#$'+,'.+4$&%#$.,+'3,#54$"=

! >&1=?.#4'@1&-A1&"'@.4$,&B'CDC

! 0E:F'@1&-A1&"'F&#?.$"#$%&"'GH"&H."A

! 0E:F'9"I,&B'9,-"3

! 0E:F'J<"#%$.,+'9,-"3

! @,I"A,&5'G+"

! !"#$)'0,I=%$"'E+.K."-':"H.#"'F&#?.$"#$%&"

! 0&"1$"-'6B'LM*:*F

! F'A1B'$,'="&K,&I'#,I=%$1$.,+',+'$?"'>8E

! 7="#.K.#1$.,+'K,&)

! F'#,I=%$"&'1&#?.$"#$%&"

! F'31+N%1N"

! F+'1==3.#1$.,+'.+$"&K1#"'OF8*P

! 0E:F'?1&-A1&"'1&#?.$"#$%&"'.4'614"-',+'

")<0&<'A9)=B.C&'69+C0&&.$-'D$.<&'EA6D%&F

slide by Matthew Bolitho

© NVIDIA Corporation 2006 9

CUDA Advantages over Legacy GPGPU

Random access to memoryThread can access any memory location

Unlimited access to memory

Thread can read/write as many locations as needed

User-managed cache (per block)

Threads can cooperatively load data into SMEM

Any thread can then access any SMEM location

Low learning curve

Just a few extensions to C

No knowledge of graphics is required

No graphics API overhead

NVIDIA Confidential

CUDA Parallel Paradigm

Scale to 100s of cores, 1000s of parallel threadsTransparently with one source and same binary

Let programmers focus on parallel algorithmsNot mechanics of a parallel programming language

Enable CPU+GPU Co-ProcessingCPU & GPU are separate devices with separate memories

NVIDIA Confidential

C with CUDA Extensions: C with a few keywords

!"#$%&'()*+&,-#'./#01%02%3."'1%'2%3."'1%4(2%3."'1%4*5

6

3"- /#01%#%7%89%# : 09%;;#5

*<#=%7%'4(<#=%;%*<#=9

>

??%@0!"A,%&,-#'. BCDEF%A,-0,.

&'()*+&,-#'./02%GH82%(2%*59

++I."J'.++%!"#$%&'()*+)'-'..,./#01%02%3."'1%'2%3."'1%4(2%3."'1%4*5

6

#01%#%7%J."KA@$(H(4J."KAL#MH(%;%1N-,'$@$(H(9

#3 /# : 05%%*<#=%7%'4(<#=%;%*<#=9

>

??%@0!"A,%)'-'..,. BCDEF%A,-0,. O#1N%GPQ%1N-,'$&?J."KA

#01%0J."KA&%7%/0%;%GPP5%?%GPQ9

&'()*+)'-'..,.:::0J."KA&2%GPQRRR/02%GH82%(2%*59

Standard C Code

Parallel C Code

NVIDIA Confidential

Compiling C with CUDA Applications

!!!

"

#$%&'$()*+,-./0(%$/1%/('!!!'2'3

!!!

"

#$%&'45678,4*+%591-9$5('!!!'2'3

-$+ 1%/('%':';<'% = /<'>>%2

8?%@':'5A6?%@'>'8?%@<

"

#$%&'B5%/1'2'3

-9$5('6<

45678,4*+%591!!2<

!!!

"

NVCC(Open64) CPU Compiler

C CUDAKey Kernels

CUDA objectfiles

Rest of CApplication

CPU objectfilesLinker

CPU-GPUExecutable

Modify into Parallel

CUDA code

© 2008 NVIDIA Corporation.

Compiling CUDA Code

NVCC

C/C++ CUDAApplication

PTX to Target

Compiler

G80 … GPU

Target code

PTX Code Virtual

Physical

CPU Code

© 2008 NVIDIA Corporation.

CUDA Software Development

NVIDIA C Compiler

NVIDIA Assemblyfor Computing (PTX)

CPU Host Code

Integrated CPU + GPUC Source Code

CUDA Optimized Libraries:math.h, FFT, BLAS, …

CUDADriver

Profiler Standard C Compiler

GPU CPU

© NVIDIA Corporation 2009

CUDA-gdb

Integrated into gdbSupports CUDA CSeamless CPU+GPU development experienceEnabled on all CUDA supported 32/64bit Linux distrosSet breakpoint and single step any source line Access and print all CUDA memory allocs, local, global, constant and shared vars.

CUDA Development Tools: cuda-gdb

© NVIDIA Corporation 2009

CUDA-GDB in emacs

Parallel Source Debugging

CUDA-gdb in emacs

© NVIDIA Corporation 2009

Parallel Source Debugging

CUDA-gdb in DDD

© NVIDIA Corporation 2009

CUDA-MemCheck

Coming with CUDA 3.0 Release

Track out of bounds and misaligned accesses

Supports CUDA C

Integrated into the CUDA-GDB debugger

Available as standalone tool on all OS platforms.

CUDA Development Tools: cuda-memcheck

© NVIDIA Corporation 2009

Parallel Source Memory CheckerCUDA-

MemCheck

© NVIDIA Corporation 2009 42

CUDA Visual ProfilerCUDA Development Tools: (Visual) Profiler

Outline

• Thinking Parallel (review)

• Why GPUs ?

• CUDA Overview

• Programming Model

• Threading/Execution Hierarchy

• Memory/Communication Hierarchy

• CUDA Programming

Programming Model

GPU Architecture

CUDA Programming Model

Intro PyOpenCL What and Why? OpenCL

Connection: Hardware ↔ Programming Model

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Who cares ho

w

manycore

s?

Idea:

Program as if there were“infinitely” many cores

Program as if there were“infinitely” many ALUs percore

Consider: Which is easy to do automatically?

Parallel program → sequential hardware

or

Sequential program → parallel hardware?

Axis 0

Axis1

HardwareSoftware representation

?

Really: Group providespool of parallelism to drawfrom.

X,Y,Z order within groupmatters. (Not amonggroups, though.)

Grids can be 1,2,3-dimensional.

Andreas Klockner GPU-Python with PyOpenCL and PyCUDAslide by

Intro PyOpenCL What and Why? OpenCL

Connection: Hardware ↔ Programming Model

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Who cares ho

w

manycore

s?

Idea:

Program as if there were“infinitely” many cores

Program as if there were“infinitely” many ALUs percore

Consider: Which is easy to do automatically?

Parallel program → sequential hardware

or

Sequential program → parallel hardware?

Axis 0

Axis1

HardwareSoftware representation

?

Really: Group providespool of parallelism to drawfrom.

X,Y,Z order within groupmatters. (Not amonggroups, though.)

Grids can be 1,2,3-dimensional.

Andreas Klockner GPU-Python with PyOpenCL and PyCUDAslide by

Intro PyOpenCL What and Why? OpenCL

Connection: Hardware ↔ Programming Model

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Who cares ho

w

manycore

s?

Idea:

Program as if there were“infinitely” many cores

Program as if there were“infinitely” many ALUs percore

Consider: Which is easy to do automatically?

Parallel program → sequential hardware

or

Sequential program → parallel hardware?

Axis 0

Axis1

HardwareSoftware representation

?

Really: Group providespool of parallelism to drawfrom.

X,Y,Z order within groupmatters. (Not amonggroups, though.)

Grids can be 1,2,3-dimensional.

Andreas Klockner GPU-Python with PyOpenCL and PyCUDAslide by

Intro PyOpenCL What and Why? OpenCL

Connection: Hardware ↔ Programming Model

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Who cares ho

w

manycore

s?

Idea:

Program as if there were“infinitely” many cores

Program as if there were“infinitely” many ALUs percore

Consider: Which is easy to do automatically?

Parallel program → sequential hardware

or

Sequential program → parallel hardware?

Axis 0

Axis1

HardwareSoftware representation

?

Really: Group providespool of parallelism to drawfrom.

X,Y,Z order within groupmatters. (Not amonggroups, though.)

Grids can be 1,2,3-dimensional.

Andreas Klockner GPU-Python with PyOpenCL and PyCUDAslide by

Intro PyOpenCL What and Why? OpenCL

Connection: Hardware ↔ Programming Model

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Who cares ho

w

manycore

s?

Idea:

Program as if there were“infinitely” many cores

Program as if there were“infinitely” many ALUs percore

Consider: Which is easy to do automatically?

Parallel program → sequential hardware

or

Sequential program → parallel hardware?

Axis 0

Axis1

HardwareSoftware representation

Grid

(Kernel: Func-

tion on Grid)

(Work) Group

(Work) Item

?

Really: Group providespool of parallelism to drawfrom.

X,Y,Z order within groupmatters. (Not amonggroups, though.)

Grids can be 1,2,3-dimensional.

Andreas Klockner GPU-Python with PyOpenCL and PyCUDAslide by

or “Block”

or “Thread”

Intro PyOpenCL What and Why? OpenCL

Connection: Hardware ↔ Programming Model

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Who cares ho

w

manycore

s?

Idea:

Program as if there were“infinitely” many cores

Program as if there were“infinitely” many ALUs percore

Consider: Which is easy to do automatically?

Parallel program → sequential hardware

or

Sequential program → parallel hardware?

Axis 0

Axis1

HardwareSoftware representation

Grid

(Kernel: Func-

tion on Grid)

?

Really: Group providespool of parallelism to drawfrom.

X,Y,Z order within groupmatters. (Not amonggroups, though.)

Grids can be 1,2,3-dimensional.

Andreas Klockner GPU-Python with PyOpenCL and PyCUDAslide by

Intro PyOpenCL What and Why? OpenCL

Connection: Hardware ↔ Programming Model

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Who cares ho

w

manycore

s?

Idea:

Program as if there were“infinitely” many cores

Program as if there were“infinitely” many ALUs percore

Consider: Which is easy to do automatically?

Parallel program → sequential hardware

or

Sequential program → parallel hardware?

Axis 0

Axis1

HardwareSoftware representation

Grid

(Kernel: Func-

tion on Grid)

(Work) Group

?

Really: Group providespool of parallelism to drawfrom.

X,Y,Z order within groupmatters. (Not amonggroups, though.)

Grids can be 1,2,3-dimensional.

Andreas Klockner GPU-Python with PyOpenCL and PyCUDAslide by

or “Block”

Intro PyOpenCL What and Why? OpenCL

Connection: Hardware ↔ Programming Model

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Who cares ho

w

manycore

s?

Idea:

Program as if there were“infinitely” many cores

Program as if there were“infinitely” many ALUs percore

Consider: Which is easy to do automatically?

Parallel program → sequential hardware

or

Sequential program → parallel hardware?

Axis 0

Axis1

HardwareSoftware representation

?

Really: Group providespool of parallelism to drawfrom.

X,Y,Z order within groupmatters. (Not amonggroups, though.)

Grids can be 1,2,3-dimensional.

Andreas Klockner GPU-Python with PyOpenCL and PyCUDAslide by

Intro PyOpenCL What and Why? OpenCL

Connection: Hardware ↔ Programming Model

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Who cares ho

w

manycore

s?

Idea:

Program as if there were“infinitely” many cores

Program as if there were“infinitely” many ALUs percore

Consider: Which is easy to do automatically?

Parallel program → sequential hardware

or

Sequential program → parallel hardware?

Axis 0

Axis1

HardwareSoftware representation

?

Really: Group providespool of parallelism to drawfrom.

X,Y,Z order within groupmatters. (Not amonggroups, though.)

Grids can be 1,2,3-dimensional.

Andreas Klockner GPU-Python with PyOpenCL and PyCUDAslide by

Intro PyOpenCL What and Why? OpenCL

Connection: Hardware ↔ Programming Model

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Who cares ho

w

manycore

s?

Idea:

Program as if there were“infinitely” many cores

Program as if there were“infinitely” many ALUs percore

Consider: Which is easy to do automatically?

Parallel program → sequential hardware

or

Sequential program → parallel hardware?

Axis 0

Axis1

HardwareSoftware representation

?

Really: Group providespool of parallelism to drawfrom.

X,Y,Z order within groupmatters. (Not amonggroups, though.)

Grids can be 1,2,3-dimensional.

Andreas Klockner GPU-Python with PyOpenCL and PyCUDAslide by

Intro PyOpenCL What and Why? OpenCL

Connection: Hardware ↔ Programming Model

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Who cares ho

w

manycore

s?

Idea:

Program as if there were“infinitely” many cores

Program as if there were“infinitely” many ALUs percore

Consider: Which is easy to do automatically?

Parallel program → sequential hardware

or

Sequential program → parallel hardware?

Axis 0

Axis1

HardwareSoftware representation

?

Really: Group providespool of parallelism to drawfrom.

X,Y,Z order within groupmatters. (Not amonggroups, though.)

Grids can be 1,2,3-dimensional.

Andreas Klockner GPU-Python with PyOpenCL and PyCUDAslide by

Intro PyOpenCL What and Why? OpenCL

Connection: Hardware ↔ Programming Model

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Who cares ho

w

manycore

s?

Idea:

Program as if there were“infinitely” many cores

Program as if there were“infinitely” many ALUs percore

Consider: Which is easy to do automatically?

Parallel program → sequential hardware

or

Sequential program → parallel hardware?

Axis 0

Axis1

HardwareSoftware representation

?

Really: Group providespool of parallelism to drawfrom.

X,Y,Z order within groupmatters. (Not amonggroups, though.)

Grids can be 1,2,3-dimensional.

Andreas Klockner GPU-Python with PyOpenCL and PyCUDAslide by

Intro PyOpenCL What and Why? OpenCL

Connection: Hardware ↔ Programming Model

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Who cares ho

w

manycore

s?

Idea:

Program as if there were“infinitely” many cores

Program as if there were“infinitely” many ALUs percore

Consider: Which is easy to do automatically?

Parallel program → sequential hardware

or

Sequential program → parallel hardware?

Axis 0

Axis1

HardwareSoftware representation

?

Really: Group providespool of parallelism to drawfrom.

X,Y,Z order within groupmatters. (Not amonggroups, though.)

Grids can be 1,2,3-dimensional.

Andreas Klockner GPU-Python with PyOpenCL and PyCUDAslide by

Intro PyOpenCL What and Why? OpenCL

Connection: Hardware ↔ Programming Model

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Who cares ho

w

manycore

s?

Idea:

Program as if there were“infinitely” many cores

Program as if there were“infinitely” many ALUs percore

Consider: Which is easy to do automatically?

Parallel program → sequential hardware

or

Sequential program → parallel hardware?

Axis 0

Axis1

HardwareSoftware representation

?

Really: Group providespool of parallelism to drawfrom.

X,Y,Z order within groupmatters. (Not amonggroups, though.)

Grids can be 1,2,3-dimensional.

Andreas Klockner GPU-Python with PyOpenCL and PyCUDAslide by

Intro PyOpenCL What and Why? OpenCL

Connection: Hardware ↔ Programming Model

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Who cares ho

w

manycore

s?

Idea:

Program as if there were“infinitely” many cores

Program as if there were“infinitely” many ALUs percore

Consider: Which is easy to do automatically?

Parallel program → sequential hardware

or

Sequential program → parallel hardware?

Axis 0

Axis1

HardwareSoftware representation

?

Really: Group providespool of parallelism to drawfrom.

X,Y,Z order within groupmatters. (Not amonggroups, though.)

Grids can be 1,2,3-dimensional.

Andreas Klockner GPU-Python with PyOpenCL and PyCUDAslide by

Intro PyOpenCL What and Why? OpenCL

Connection: Hardware ↔ Programming Model

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Who cares ho

w

manycore

s?

Idea:

Program as if there were“infinitely” many cores

Program as if there were“infinitely” many ALUs percore

Consider: Which is easy to do automatically?

Parallel program → sequential hardware

or

Sequential program → parallel hardware?

Axis 0

Axis1

HardwareSoftware representation

?

Really: Group providespool of parallelism to drawfrom.

X,Y,Z order within groupmatters. (Not amonggroups, though.)

Grids can be 1,2,3-dimensional.

Andreas Klockner GPU-Python with PyOpenCL and PyCUDAslide by

Intro PyOpenCL What and Why? OpenCL

Connection: Hardware ↔ Programming Model

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Who cares ho

w

manycore

s?

Idea:

Program as if there were“infinitely” many cores

Program as if there were“infinitely” many ALUs percore

Consider: Which is easy to do automatically?

Parallel program → sequential hardware

or

Sequential program → parallel hardware?

Axis 0

Axis1

HardwareSoftware representation

?

Really: Group providespool of parallelism to drawfrom.

X,Y,Z order within groupmatters. (Not amonggroups, though.)

Grids can be 1,2,3-dimensional.

Andreas Klockner GPU-Python with PyOpenCL and PyCUDAslide by

Block

block

Intro PyOpenCL What and Why? OpenCL

Connection: Hardware ↔ Programming Model

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Fetch/Decode

32 kiB CtxPrivate

(“Registers”)

16 kiB CtxShared

Who cares ho

w

manycore

s?

Idea:

Program as if there were“infinitely” many cores

Program as if there were“infinitely” many ALUs percore

Consider: Which is easy to do automatically?

Parallel program → sequential hardware

or

Sequential program → parallel hardware?

Axis 0

Axis1

HardwareSoftware representation

?

Really: Group providespool of parallelism to drawfrom.

X,Y,Z order within groupmatters. (Not amonggroups, though.)

Grids can be 1,2,3-dimensional.

Andreas Klockner GPU-Python with PyOpenCL and PyCUDAslide by

Need a pause?

Outline

• Thinking Parallel (review)

• Why GPUs ?

• CUDA Overview

• Programming Model

• Threading/Execution Hierarchy

• Memory/Communication Hierarchy

• CUDA Programming

Threading Hierarchy

• Kernel– GPU program that runs on a thread grid

• Thread hierarchy– Grid : a set of blocks– Block : a set of warps– Warp : a SIMD group of 32 threads– Grid size * block size = total # of threads

Grid

Block 1 Block 2 Block n<diffuseShader>:

sample  r0,  v4,  t0,  s0

mul    r3,  v0,  cb0[0]

madd  r3,  v1,  cb0[1],  r3

madd  r3,  v2,  cb0[2],  r3

clmp  r3,  r3,  l(0.0),  l(1.0)

mul    o0,  r0,  r3

mul    o1,  r1,  r3

mul    o2,  r2,  r3

mov    o3,  l(1.0)

Kernelwarp

. . . . .

warp warp warp warp warp

Some definitions

© 2008 NVIDIA Corporation.

CUDA Kernels and Threads

Parallel portions of an application are executed on the device as kernels

One kernel is executed at a time

Many threads execute each kernel

Differences between CUDA and CPU threads CUDA threads are extremely lightweight

Very little creation overhead

Instant switching

CUDA uses 1000s of threads to achieve efficiencyMulti-core CPUs can use only a few

Definitions Device = GPU

Host = CPU

Kernel = function that runs on the device

© 2008 NVIDIA Corporation.

Arrays of Parallel Threads

A CUDA kernel is executed by an array of threadsAll threads run the same code

Each thread has an ID that it uses to compute memory addresses and make control decisions

0 1 2 3 4 5 6 7

float x = input[threadID];

float y = func(x);

output[threadID] = y;

threadID

© 2008 NVIDIA Corporation.

Thread Batching

Kernel launches a grid of thread blocksThreads within a block cooperate via shared memory

Threads within a block can synchronize

Threads in different blocks cannot cooperate

Allows programs to transparently scale to different GPUs

Grid

Thread Block 0

Shared Memory

Thread Block 1

Shared Memory

Thread Block N-1

Shared Memory

© 2008 NVIDIA Corporation.

Transparent Scalability

Kernel grid

Block 2 Block 3

Block 4 Block 5

Block 6 Block 7

Device Device

Block 0 Block 1 Block 2 Block 3

Block 4 Block 5 Block 6 Block 7

Block 0 Block 1

Block 2 Block 3

Block 4 Block 5

Block 6 Block 7

Block 0 Block 1

Hardware is free to schedule thread blocks on any processor

A kernel scales across parallel multiprocessors

© 2008 NVIDIA Corporation.

Transparent Scalability

Kernel grid

Block 2 Block 3

Block 4 Block 5

Block 6 Block 7

Device Device

Block 0 Block 1 Block 2 Block 3

Block 4 Block 5 Block 6 Block 7

Block 0 Block 1

Block 2 Block 3

Block 4 Block 5

Block 6 Block 7

Block 0 Block 1

Hardware is free to schedule thread blocks on any processor

A kernel scales across parallel multiprocessors

Gratuitous amount of parallelism !

© 2008 NVIDIA Corporation.

Transparent Scalability

Kernel grid

Block 2 Block 3

Block 4 Block 5

Block 6 Block 7

Device Device

Block 0 Block 1 Block 2 Block 3

Block 4 Block 5 Block 6 Block 7

Block 0 Block 1

Block 2 Block 3

Block 4 Block 5

Block 6 Block 7

Block 0 Block 1

Hardware is free to schedule thread blocks on any processor

A kernel scales across parallel multiprocessors

© 2008 NVIDIA Corporation.

8-Series Architecture (G80)

128 thread processors execute kernel threads

16 multiprocessors, each contains

8 thread processors

Shared memory enables thread cooperation

SharedMemory

SharedMemory

SharedMemory

SharedMemory

SharedMemory

SharedMemory

SharedMemory

SharedMemory

SharedMemory

SharedMemory

SharedMemory

SharedMemory

SharedMemory

SharedMemory

SharedMemory

SharedMemory

Multiprocessor

Thread

Processors

SharedMemory

© 2008 NVIDIA Corporation.

10-Series Architecture

240 thread processors execute kernel threads

30 multiprocessors, each contains

8 thread processors

One double-precision unit

Shared memory enables thread cooperation

ThreadProcessors

Multiprocessor

SharedMemory

Double

• !"#$%&'()*$+',-(..,'.$/',0+(*$12%,$34$.%'()512/$506%1+',-(..,'.$789.:$,;$<=$-,'(.$()-&

• >+$%,$4?#$@A$,;$@BBCD$BCE9

• FGG$9(5,'H$80++,'%

I J3$G)-&($

I J=$G)-&($7K4"$LA:

Fermi Architecture

e.g. GTX 480:

Note: GTX 580 has now 512 processors!

39M02: High Performance Computing with CUDA

Hardware MultithreadingHardware Multithreading

Hardware allocates resources to blocks

blocks need: thread slots, registers, shared

memory

blocks don’t run until resources are available

Hardware schedules threads

threads have their own registers

any thread not waiting for something can run

context switching is free – every cycle

Hardware relies on threads to hide latency

i.e., parallelism is necessary for performance

SP

SharedMemory

MT IU

SM

Hardware Multithreading

39M02: High Performance Computing with CUDA

Hardware MultithreadingHardware Multithreading

Hardware allocates resources to blocks

blocks need: thread slots, registers, shared

memory

blocks don’t run until resources are available

Hardware schedules threads

threads have their own registers

any thread not waiting for something can run

context switching is free – every cycle

Hardware relies on threads to hide latency

i.e., parallelism is necessary for performance

SP

SharedMemory

MT IU

SM

Hardware Multithreading

Hardware allocates resources to blocks

blocks need: thread slots, registers, shared

memory

blocks don’t run until resources are available

39M02: High Performance Computing with CUDA

Hardware MultithreadingHardware Multithreading

Hardware allocates resources to blocks

blocks need: thread slots, registers, shared

memory

blocks don’t run until resources are available

Hardware schedules threads

threads have their own registers

any thread not waiting for something can run

context switching is free – every cycle

Hardware relies on threads to hide latency

i.e., parallelism is necessary for performance

SP

SharedMemory

MT IU

SM

Hardware Multithreading

Hardware allocates resources to blocks

blocks need: thread slots, registers, shared

memory

blocks don’t run until resources are available

Hardware schedules threads

threads have their own registers

any thread not waiting for something can run

Hiding Memory Latency

SIGGRAPH 2009: Beyond Programmable Shading: http://s09.idav.ucdavis.edu/

Hiding shader stalls Time

(clocks)

1 2 3 4

Stall

Stall

Stall

Stall

Runnable

Runnable

Runnable

Frag 1 … 8 Frag 9… 16 Frag 17 … 24 Frag 25 … 32

37

Credit: Kayvon Fatahalian (Stanford)

Discuss HW1 Intro to GPU Computing

© 2008 NVIDIA Corporation.

Execution Model

Software Hardware

Threads are executed by thread processors

Thread

Thread Processor

Thread Block Multiprocessor

Thread blocks are executed on multiprocessors

Thread blocks do not migrate

Several concurrent thread blocks can reside on one multiprocessor - limited by multiprocessor resources (shared memory and register file)

...

Grid Device

A kernel is launched as a grid of thread blocks

Only one kernel can execute on a device at one time

Summary

Outline

• Thinking Parallel (review)

• Why GPUs ?

• CUDA Overview

• Programming Model

• Threading/Execution Hierarchy

• Memory/Communication Hierarchy

• CUDA Programming

Memory/Communication Hierarchy

Example...

The Memory Hierarchy

Hierarchy of increasingly bigger, slower memories:

Registers

L1 Cache

L2 Cache

DRAM

Virtual Memory

(hard drive)

1 kB, 1 cycle

10 kB, 10 cycles

1 MB, 100 cycles

1 GB, 1000 cycles

1 TB, 1 M cycles

How might data localityfactor into this?

What is a working set?

Intro Basics Assembly Memory Pipelinesadapted from Berger & Klöckner (NYU 2010)

faster

bigger

Example

GPU in PC Architecture

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

F

!"#$%&'()*+,-

! !"#$%&'(")*+,-".'/"$'0&"12"#+"345"#$%&'(6

! !**"#$%&'(6"78"'"#$%&'(")*+,-"'%&"%18"+8"#$&"

6'.&".1*#792%+,&66+%

! :$16",'8",+..187,'#&"07'"6$'%&(".&.+%/

! !8("6/8,$%+87;&"

! :$%&'(6"+<"'")*+,-"'%&".1*#72*&=&("+8#+"'"

.1*#792%+,&66+%"'6"!"#$%

>?@

A+%#$)%7(B&

CD!E

F+1#$)%7(B&

F!:! G#$&%8&#

H%'2$7,6">'%("I"

>@C!

J%+8#"F7(&"K16

E&.+%/"K16 ?>L"K16

?>L9G=2

%&66"K16

!

! ./012 +%"./0$! D&2*',&("!H?

! ?5?M"J1**"C12*&="F&%7'*M"F/..&#%7,"K16! 53NEKI6")'8(O7(#$"78"&',$"(7%&,#7+8

! "#$$#%&'()#$*+%,-(+%.#($/&.+0&,(1&2%,3(,+8<7B1%'#7+86P""GPBQ! ?>L9G"4R="S"4R"*'8&6

! 4R"#7.&6"#$&")'8(O7(#$"TUHKI6V

! :$&">@C!"62&,7<7,'#7+8"$'6")&&8"12('#&(! W&%67+8"4PN"4 L87#7'*"%&*&'6&M"N4INX

! W&%67+8"4P4"4@2('#&"O7#$"8&O&%"$'%(O'%&M"NUINX

! K',-O'%(6",+.2'#7)*&

! G=2&,#&("12('#&6"78"8&'%"<1#1%&Q! W&%67+8"4P5"I"5PN

! RY9)7#"<*+'#78B"2+78#"6122+%#"T7P&P"(+1)*&V

! W&%67+8"4P4"'((&("6+.&"7.2+%#'8#"16&<1*"

<&'#1%&6Q

3*456%#$

! !6/8,$%+8+16".&.+%/",+27&6

! !6/8,$%+8+16"H?@"2%+B%'."*'18,$

7%#&6%#$

! !#+.7,".&.+%/"786#%1,#7+86

3+ Gb/s

8 GB/s

25+ GB/s

160+ GB/sto

VRAM

PC Architecture

modified from Matthew Bolitho

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

F

!"#$%&'()*+,-

! !"#$%&'(")*+,-".'/"$'0&"12"#+"345"#$%&'(6

! !**"#$%&'(6"78"'"#$%&'(")*+,-"'%&"%18"+8"#$&"

6'.&".1*#792%+,&66+%

! :$16",'8",+..187,'#&"07'"6$'%&(".&.+%/

! !8("6/8,$%+87;&"

! :$%&'(6"+<"'")*+,-"'%&".1*#72*&=&("+8#+"'"

.1*#792%+,&66+%"'6"!"#$%

>?@

A+%#$)%7(B&

CD!E

F+1#$)%7(B&

F!:! G#$&%8&#

H%'2$7,6">'%("I"

>@C!

J%+8#"F7(&"K16

E&.+%/"K16 ?>L"K16

?>L9G=2

%&66"K16

!

! ./012 +%"./0$! D&2*',&("!H?

! ?5?M"J1**"C12*&="F&%7'*M"F/..&#%7,"K16! 53NEKI6")'8(O7(#$"78"&',$"(7%&,#7+8

! "#$$#%&'()#$*+%,-(+%.#($/&.+0&,(1&2%,3(,+8<7B1%'#7+86P""GPBQ! ?>L9G"4R="S"4R"*'8&6

! 4R"#7.&6"#$&")'8(O7(#$"TUHKI6V

! :$&">@C!"62&,7<7,'#7+8"$'6")&&8"12('#&(! W&%67+8"4PN"4 L87#7'*"%&*&'6&M"N4INX

! W&%67+8"4P4"4@2('#&"O7#$"8&O&%"$'%(O'%&M"NUINX

! K',-O'%(6",+.2'#7)*&

! G=2&,#&("12('#&6"78"8&'%"<1#1%&Q! W&%67+8"4P5"I"5PN

! RY9)7#"<*+'#78B"2+78#"6122+%#"T7P&P"(+1)*&V

! W&%67+8"4P4"'((&("6+.&"7.2+%#'8#"16&<1*"

<&'#1%&6Q

3*456%#$

! !6/8,$%+8+16".&.+%/",+27&6

! !6/8,$%+8+16"H?@"2%+B%'."*'18,$

7%#&6%#$

! !#+.7,".&.+%/"786#%1,#7+86

modified from Matthew Bolitho

PCI not-so-Express Bus

Back to the GPU...

© NVIDIA 2010 18

Multiple Memory ScopesPer-thread private memory

Each thread has its own local memoryStacks, other private data

Per-thread-block shared memory

Small memory close to the processor, low latencyAllocated per thread block

Main memoryGPU frame bufferCan be accessed by any thread in any thread block

Thread

Per-threadLocal Memory

Block

Per-blockSharedMemory

Kernel 0

.

.

.Per-device

GlobalMemory

. . .

Kernel 1

SequentialBlocks

© NVIDIA 2010 18

Multiple Memory ScopesPer-thread private memory

Each thread has its own local memoryStacks, other private data

Per-thread-block shared memory

Small memory close to the processor, low latencyAllocated per thread block

Main memoryGPU frame bufferCan be accessed by any thread in any thread block

Thread

Per-threadLocal Memory

Block

Per-blockSharedMemory

Kernel 0

.

.

.Per-device

GlobalMemory

. . .

Kernel 1

SequentialBlocks

© 2008 NVIDIA Corporation.

Thread Cooperation

The Missing Piece: threads may need to cooperate

Thread cooperation is valuable

Share results to avoid redundant computation

Share memory accesses

Drastic bandwidth reduction

Thread cooperation is a powerful feature of CUDA

Cooperation between a monolithic array of threads is not scalable

Cooperation within smaller batches of threads is scalable

© NVIDIA 2010 18

Multiple Memory ScopesPer-thread private memory

Each thread has its own local memoryStacks, other private data

Per-thread-block shared memory

Small memory close to the processor, low latencyAllocated per thread block

Main memoryGPU frame bufferCan be accessed by any thread in any thread block

Thread

Per-threadLocal Memory

Block

Per-blockSharedMemory

Kernel 0

.

.

.Per-device

GlobalMemory

. . .

Kernel 1

SequentialBlocks

© NVIDIA 2010 18

Multiple Memory ScopesPer-thread private memory

Each thread has its own local memoryStacks, other private data

Per-thread-block shared memory

Small memory close to the processor, low latencyAllocated per thread block

Main memoryGPU frame bufferCan be accessed by any thread in any thread block

Thread

Per-threadLocal Memory

Block

Per-blockSharedMemory

Kernel 0

.

.

.Per-device

GlobalMemory

. . .

Kernel 1

SequentialBlocks

Per-thread private memoryEach thread has its own local memoryStacks, other private data

Thread

Per-threadLocal Memory

Per-thread-block shared memory

Small memory close to the processor, low latencyAllocated per thread block

Block

Per-blockSharedMemory

© NVIDIA 2010 18

Multiple Memory ScopesPer-thread private memory

Each thread has its own local memoryStacks, other private data

Per-thread-block shared memory

Small memory close to the processor, low latencyAllocated per thread block

Main memoryGPU frame bufferCan be accessed by any thread in any thread block

Thread

Per-threadLocal Memory

Block

Per-blockSharedMemory

Kernel 0

.

.

.Per-device

GlobalMemory

. . .

Kernel 1

SequentialBlocks

Per-thread private memoryEach thread has its own local memoryStacks, other private data

Thread

Per-threadLocal Memory

© NVIDIA 2010 18

Multiple Memory ScopesPer-thread private memory

Each thread has its own local memoryStacks, other private data

Per-thread-block shared memory

Small memory close to the processor, low latencyAllocated per thread block

Main memoryGPU frame bufferCan be accessed by any thread in any thread block

Thread

Per-threadLocal Memory

Block

Per-blockSharedMemory

Kernel 0

.

.

.Per-device

GlobalMemory

. . .

Kernel 1

SequentialBlocks

© 2008 NVIDIA Corporation.

Kernel Memory Access

Per-thread

Per-block

Per-device

ThreadRegisters

Local Memory

SharedMemory

Block

...Kernel 0

...Kernel 1

GlobalMemory

Time

On-chip

Off-chip, uncached

• On-chip, small

• Fast

• Off-chip, large

• Uncached

• Persistent across kernel launches

• Kernel I/O

Kernel Memory Access

© 2008 NVIDIA Corporation.

Kernel Memory Access

Per-thread

Per-block

Per-device

ThreadRegisters

Local Memory

SharedMemory

Block

...Kernel 0

...Kernel 1

GlobalMemory

Time

On-chip

Off-chip, uncached

• On-chip, small

• Fast

• Off-chip, large

• Uncached

• Persistent across kernel launches

• Kernel I/O

Global Memory

Per-thread

Per-block

Per-device

ThreadRegisters

Local Memory

SharedMemory

Block

...Kernel 0

...Kernel 1

GlobalMemory

Time

On-chip

Off-chip, uncached

• On-chip, small

• Fast

• Off-chip, large

• Uncached

• Persistent across kernel launches

• Kernel I/O

© 2008 NVIDIA Corporation.

Kernel Memory Access

Per-thread

Per-block

Per-device

ThreadRegisters

Local Memory

SharedMemory

Block

...Kernel 0

...Kernel 1

GlobalMemory

Time

On-chip

Off-chip, uncached

• On-chip, small

• Fast

• Off-chip, large

• Uncached

• Persistent across kernel launches

• Kernel I/O

Global Memory

Per-device

...Kernel 0

...Kernel 1

GlobalMemory

Time

• Off-chip, large

• Uncached

• Persistent across kernel launches

• Kernel I/O

• Different types of “global memory”

• Linear Memory

• Texture Memory

• Constant Memory

© NVIDIA Corporation 2009 12

Memory Architecture

Memory Location Cached Access Scope Lifetime

Register On-chip N/A R/W One thread Thread

Local Off-chip No R/W One thread Thread

Shared On-chip N/A R/W All threads in a block Block

Global Off-chip No R/W All threads + host Application

Constant Off-chip Yes R All threads + host Application

Texture Off-chip Yes R All threads + host Application

© 2008 NVIDIA Corporation.

Managing Memory

CPU and GPU have separate memory spaces

Host (CPU) code manages device (GPU) memory:Allocate / free

Copy data to and from device

Applies to global device memory (DRAM)

Multiprocessor

Host

CPU

ChipsetDRAM

Device

DRAM

Local Memory

GlobalMemory

GPU

Multiprocessor

Multiprocessor

Registers

Shared Memory

© NVIDIA 2010 24

Caches

Configurable L1 cache per SM16KB L1$ / 48KB Shared Memory48KB L1$ / 16KB Shared Memory

Shared 768KB L2 cache

Compute motivation:Caching captures locality, amplifies bandwidthCaching more effective than Shared Memory RAM for irregular or unpredictable access

Ray tracing, sparse matrix

Caching helps latency sensitive cases

Register File

DRAM

Thread

Register File

DRAM

Thread

L1 Cache / Shared Memory

L2 Cache

Tesla Memory Hiearchy

Shar

ed

Mem

ory

Fermi Memory Hiearchy

... how do I program these &#*@ GPUs ??

Outline

• Thinking Parallel (review)

• Why GPUs ?

• CUDA Overview

• Programming Model

• Threading/Execution Hierarchy

• Memory/Communication Hierarchy

• CUDA Programming

CUDA Programming

Managing Memory in CUDA

© 2008 NVIDIA Corporation.

Kernel Memory Access

Per-thread

Per-block

Per-device

ThreadRegisters

Local Memory

SharedMemory

Block

...Kernel 0

...Kernel 1

GlobalMemory

Time

On-chip

Off-chip, uncached

• On-chip, small

• Fast

• Off-chip, large

• Uncached

• Persistent across kernel launches

• Kernel I/O

Kernel Memory AccessReview

© 2008 NVIDIA Corporation.

Kernel Memory Access

Per-thread

Per-block

Per-device

ThreadRegisters

Local Memory

SharedMemory

Block

...Kernel 0

...Kernel 1

GlobalMemory

Time

On-chip

Off-chip, uncached

• On-chip, small

• Fast

• Off-chip, large

• Uncached

• Persistent across kernel launches

• Kernel I/O

Global Memory

Per-device

...Kernel 0

...Kernel 1

GlobalMemory

Time

• Off-chip, large

• Uncached

• Persistent across kernel launches

• Kernel I/O

• Different types of “global memory”

• Linear Memory

• Texture Memory

• Constant Memory

Review

© 2008 NVIDIA Corporation.

Managing Memory

CPU and GPU have separate memory spaces

Host (CPU) code manages device (GPU) memory:Allocate / free

Copy data to and from device

Applies to global device memory (DRAM)

Multiprocessor

Host

CPU

ChipsetDRAM

Device

DRAM

Local Memory

GlobalMemory

GPU

Multiprocessor

Multiprocessor

Registers

Shared Memory

Review

© 2008 NVIDIA Corporation

CUDA Variable Type Qualifiers

!   “automatic” scalar variables without qualifier reside in a register !   compiler will spill to thread local memory

!   “automatic” array variables without qualifier reside in thread-local memory

Variable declaration Memory Scope Lifetime int var; register thread thread

int array_var[10]; local thread thread

__shared__ int shared_var; shared block block

__device__ int global_var; global grid application

__constant__ int constant_var; constant grid application

© 2008 NVIDIA Corporation

CUDA Variable Type Performance

!   scalar variables reside in fast, on-chip registers !   shared variables reside in fast, on-chip memories !   thread-local arrays & global variables reside in

uncached off-chip memory !   constant variables reside in cached off-chip memory

Variable declaration Memory Penalty int var; register 1x

int array_var[10]; local 100x

__shared__ int shared_var; shared 1x

__device__ int global_var; global 100x

__constant__ int constant_var; constant 1x

© 2008 NVIDIA Corporation

CUDA Variable Type Scale

!   100Ks per-thread variables, R/W by 1 thread !   100s shared variables, each R/W by 100s of threads !   1 global variable is R/W by 100Ks threads !   1 constant variable is readable by 100Ks threads

Variable declaration Instances Visibility int var; 100,000s 1

int array_var[10]; 100,000s 1

__shared__ int shared_var; 100s 100s

__device__ int global_var; 1 100,000s

__constant__ int constant_var; 1 100,000s

© 2008 NVIDIA Corporation.

GPU Memory Allocation / Release

cudaMalloc(void ** pointer, size_t nbytes)

cudaMemset(void * pointer, int value, size_t count)

cudaFree(void* pointer)

int n = 1024;

int nbytes = 1024*sizeof(int);

int *a_d = 0;

cudaMalloc( (void**)&a_d, nbytes );

cudaMemset( a_d, 0, nbytes);

cudaFree(a_d);

© 2008 NVIDIA Corporation.

Data Copies

cudaMemcpy(void *dst, void *src, size_t nbytes, enum cudaMemcpyKind direction);

direction specifies locations (host or device) of src and dst

Blocks CPU thread: returns after the copy is complete

Doesn’t start copying until previous CUDA calls complete

enum cudaMemcpyKindcudaMemcpyHostToDevice

cudaMemcpyDeviceToHost

cudaMemcpyDeviceToDevice

© 2008 NVIDIA Corporation.

Data Movement Example

int main(void)

{

float *a_h, *b_h; // host data

float *a_d, *b_d; // device data

int N = 14, nBytes, i ;

nBytes = N*sizeof(float);

a_h = (float *)malloc(nBytes);

b_h = (float *)malloc(nBytes);

cudaMalloc((void **) &a_d, nBytes);

cudaMalloc((void **) &b_d, nBytes);

for (i=0, i<N; i++) a_h[i] = 100.f + i;

cudaMemcpy(a_d, a_h, nBytes, cudaMemcpyHostToDevice);

cudaMemcpy(b_d, a_d, nBytes, cudaMemcpyDeviceToDevice);

cudaMemcpy(b_h, b_d, nBytes, cudaMemcpyDeviceToHost);

for (i=0; i< N; i++) assert( a_h[i] == b_h[i] );

free(a_h); free(b_h); cudaFree(a_d); cudaFree(b_d);

return 0;

}

© 2008 NVIDIA Corporation.

Data Movement Example

int main(void)

{

float *a_h, *b_h; // host data

float *a_d, *b_d; // device data

int N = 14, nBytes, i ;

nBytes = N*sizeof(float);

a_h = (float *)malloc(nBytes);

b_h = (float *)malloc(nBytes);

cudaMalloc((void **) &a_d, nBytes);

cudaMalloc((void **) &b_d, nBytes);

for (i=0, i<N; i++) a_h[i] = 100.f + i;

cudaMemcpy(a_d, a_h, nBytes, cudaMemcpyHostToDevice);

cudaMemcpy(b_d, a_d, nBytes, cudaMemcpyDeviceToDevice);

cudaMemcpy(b_h, b_d, nBytes, cudaMemcpyDeviceToHost);

for (i=0; i< N; i++) assert( a_h[i] == b_h[i] );

free(a_h); free(b_h); cudaFree(a_d); cudaFree(b_d);

return 0;

}

Host

a_h

b_h

© 2008 NVIDIA Corporation.

Data Movement Example

int main(void)

{

float *a_h, *b_h; // host data

float *a_d, *b_d; // device data

int N = 14, nBytes, i ;

nBytes = N*sizeof(float);

a_h = (float *)malloc(nBytes);

b_h = (float *)malloc(nBytes);

cudaMalloc((void **) &a_d, nBytes);

cudaMalloc((void **) &b_d, nBytes);

for (i=0, i<N; i++) a_h[i] = 100.f + i;

cudaMemcpy(a_d, a_h, nBytes, cudaMemcpyHostToDevice);

cudaMemcpy(b_d, a_d, nBytes, cudaMemcpyDeviceToDevice);

cudaMemcpy(b_h, b_d, nBytes, cudaMemcpyDeviceToHost);

for (i=0; i< N; i++) assert( a_h[i] == b_h[i] );

free(a_h); free(b_h); cudaFree(a_d); cudaFree(b_d);

return 0;

}

Host Device

a_h

b_h

a_d

b_d

© 2008 NVIDIA Corporation.

Data Movement Example

int main(void)

{

float *a_h, *b_h; // host data

float *a_d, *b_d; // device data

int N = 14, nBytes, i ;

nBytes = N*sizeof(float);

a_h = (float *)malloc(nBytes);

b_h = (float *)malloc(nBytes);

cudaMalloc((void **) &a_d, nBytes);

cudaMalloc((void **) &b_d, nBytes);

for (i=0, i<N; i++) a_h[i] = 100.f + i;

cudaMemcpy(a_d, a_h, nBytes, cudaMemcpyHostToDevice);

cudaMemcpy(b_d, a_d, nBytes, cudaMemcpyDeviceToDevice);

cudaMemcpy(b_h, b_d, nBytes, cudaMemcpyDeviceToHost);

for (i=0; i< N; i++) assert( a_h[i] == b_h[i] );

free(a_h); free(b_h); cudaFree(a_d); cudaFree(b_d);

return 0;

}

Host Device

a_h

b_h

a_d

b_d

© 2008 NVIDIA Corporation.

Data Movement Example

int main(void)

{

float *a_h, *b_h; // host data

float *a_d, *b_d; // device data

int N = 14, nBytes, i ;

nBytes = N*sizeof(float);

a_h = (float *)malloc(nBytes);

b_h = (float *)malloc(nBytes);

cudaMalloc((void **) &a_d, nBytes);

cudaMalloc((void **) &b_d, nBytes);

for (i=0, i<N; i++) a_h[i] = 100.f + i;

cudaMemcpy(a_d, a_h, nBytes, cudaMemcpyHostToDevice);

cudaMemcpy(b_d, a_d, nBytes, cudaMemcpyDeviceToDevice);

cudaMemcpy(b_h, b_d, nBytes, cudaMemcpyDeviceToHost);

for (i=0; i< N; i++) assert( a_h[i] == b_h[i] );

free(a_h); free(b_h); cudaFree(a_d); cudaFree(b_d);

return 0;

}

Host Device

a_h

b_h

a_d

b_d

© 2008 NVIDIA Corporation.

Data Movement Example

int main(void)

{

float *a_h, *b_h; // host data

float *a_d, *b_d; // device data

int N = 14, nBytes, i ;

nBytes = N*sizeof(float);

a_h = (float *)malloc(nBytes);

b_h = (float *)malloc(nBytes);

cudaMalloc((void **) &a_d, nBytes);

cudaMalloc((void **) &b_d, nBytes);

for (i=0, i<N; i++) a_h[i] = 100.f + i;

cudaMemcpy(a_d, a_h, nBytes, cudaMemcpyHostToDevice);

cudaMemcpy(b_d, a_d, nBytes, cudaMemcpyDeviceToDevice);

cudaMemcpy(b_h, b_d, nBytes, cudaMemcpyDeviceToHost);

for (i=0; i< N; i++) assert( a_h[i] == b_h[i] );

free(a_h); free(b_h); cudaFree(a_d); cudaFree(b_d);

return 0;

}

Host Device

a_h

b_h

a_d

b_d

© 2008 NVIDIA Corporation.

Data Movement Example

int main(void)

{

float *a_h, *b_h; // host data

float *a_d, *b_d; // device data

int N = 14, nBytes, i ;

nBytes = N*sizeof(float);

a_h = (float *)malloc(nBytes);

b_h = (float *)malloc(nBytes);

cudaMalloc((void **) &a_d, nBytes);

cudaMalloc((void **) &b_d, nBytes);

for (i=0, i<N; i++) a_h[i] = 100.f + i;

cudaMemcpy(a_d, a_h, nBytes, cudaMemcpyHostToDevice);

cudaMemcpy(b_d, a_d, nBytes, cudaMemcpyDeviceToDevice);

cudaMemcpy(b_h, b_d, nBytes, cudaMemcpyDeviceToHost);

for (i=0; i< N; i++) assert( a_h[i] == b_h[i] );

free(a_h); free(b_h); cudaFree(a_d); cudaFree(b_d);

return 0;

}

Host Device

a_h

b_h

a_d

b_d

© 2008 NVIDIA Corporation.

Data Movement Example

int main(void)

{

float *a_h, *b_h; // host data

float *a_d, *b_d; // device data

int N = 14, nBytes, i ;

nBytes = N*sizeof(float);

a_h = (float *)malloc(nBytes);

b_h = (float *)malloc(nBytes);

cudaMalloc((void **) &a_d, nBytes);

cudaMalloc((void **) &b_d, nBytes);

for (i=0, i<N; i++) a_h[i] = 100.f + i;

cudaMemcpy(a_d, a_h, nBytes, cudaMemcpyHostToDevice);

cudaMemcpy(b_d, a_d, nBytes, cudaMemcpyDeviceToDevice);

cudaMemcpy(b_h, b_d, nBytes, cudaMemcpyDeviceToHost);

for (i=0; i< N; i++) assert( a_h[i] == b_h[i] );

free(a_h); free(b_h); cudaFree(a_d); cudaFree(b_d);

return 0;

}

Host Device

a_h

b_h

a_d

b_d

© 2008 NVIDIA Corporation.

Data Movement Example

int main(void)

{

float *a_h, *b_h; // host data

float *a_d, *b_d; // device data

int N = 14, nBytes, i ;

nBytes = N*sizeof(float);

a_h = (float *)malloc(nBytes);

b_h = (float *)malloc(nBytes);

cudaMalloc((void **) &a_d, nBytes);

cudaMalloc((void **) &b_d, nBytes);

for (i=0, i<N; i++) a_h[i] = 100.f + i;

cudaMemcpy(a_d, a_h, nBytes, cudaMemcpyHostToDevice);

cudaMemcpy(b_d, a_d, nBytes, cudaMemcpyDeviceToDevice);

cudaMemcpy(b_h, b_d, nBytes, cudaMemcpyDeviceToHost);

for (i=0; i< N; i++) assert( a_h[i] == b_h[i] );

free(a_h); free(b_h); cudaFree(a_d); cudaFree(b_d);

return 0;

}

Host Device

Execution in CUDA

© 2008 NVIDIA Corporation.

Executing Code on the GPU

Kernels are C functions with some restrictions

Cannot access host memoryMust have void return type

No variable number of arguments (“varargs”)Not recursiveNo static variables

Function arguments automatically copied from host to device

© 2008 NVIDIA Corporation.

Function Qualifiers

Kernels designated by function qualifier:__global__

Function called from host and executed on deviceMust return void

Other CUDA function qualifiers__device__

Function called from device and run on deviceCannot be called from host code

__host__

Function called from host and executed on host (default)__host__ and __device__ qualifiers can be combined to generate both CPU and GPU code

© 2008 NVIDIA Corporation.

CUDA Built-in Device Variables

All __global__ and __device__ functions have access to these automatically defined variables

dim3 gridDim;

Dimensions of the grid in blocks (at most 2D)

dim3 blockDim;

Dimensions of the block in threads

dim3 blockIdx;

Block index within the grid

dim3 threadIdx;

Thread index within the block

© 2008 NVIDIA Corporation.

Launching Kernels

Modified C function call syntax:

kernel<<<dim3 dG, dim3 dB>>>(…)

Execution Configuration (“<<< >>>”)

dG - dimension and size of grid in blocks

Two-dimensional: x and y

Blocks launched in the grid: dG.x * dG.y

dB - dimension and size of blocks in threads:

Three-dimensional: x, y, and z

Threads per block: dB.x * dB.y * dB.z

Unspecified dim3 fields initialize to 1

© 2008 NVIDIA Corporation.

Execution Configuration Examples

kernel<<<32,512>>>(...);

dim3 grid, block;grid.x = 2; grid.y = 4;block.x = 8; block.y = 16;

kernel<<<grid, block>>>(...);

dim3 grid(2, 4), block(8,16);

kernel<<<grid, block>>>(...);

Equivalent assignment using constructor functions

© 2008 NVIDIA Corporation.

Unique Thread IDs

Built-in variables are used to determine unique thread IDs

Map from local thread ID (threadIdx) to a global ID which can be used as array indices

0

0 1 2 3 4

1

0 1 2 3 4

2

0 1 2 3 4

blockIdx.x

blockDim.x = 5

threadIdx.x

blockIdx.x*blockDim.x

+ threadIdx.x

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

Grid

© 2008 NVIDIA Corporation.

Minimal Kernels

__global__ void minimal( int* a_d, int value)

{

*a_d = value;

}

__global__ void assign( int* a_d, int value)

{

int idx = blockDim.x * blockIdx.x + threadIdx.x;

a_d[idx] = value;

}

Basics

© 2008 NVIDIA Corporation.

Increment Array Example

CPU program CUDA program

void inc_cpu(int *a, int N)

{

int idx;

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

a[idx] = a[idx] + 1;

}

int main()

{

...

inc_cpu(a, N);

}

__global__ void inc_gpu(int *a, int N)

{

int idx = blockIdx.x * blockDim.x

+ threadIdx.x;

if (idx < N)

a[idx] = a[idx] + 1;

}

int main()

{

dim3 dimBlock (blocksize);

dim3 dimGrid( ceil( N / (float)blocksize) );

inc_gpu<<<dimGrid, dimBlock>>>(a, N);

}

Synchronization in CUDA

© 2008 NVIDIA Corporation.

Host Synchronization

All kernel launches are asynchronouscontrol returns to CPU immediately

kernel executes after all previous CUDA calls have completed

cudaMemcpy() is synchronouscontrol returns to CPU after copy completes

copy starts after all previous CUDA calls have completed

cudaThreadSynchronize()blocks until all previous CUDA calls complete

© 2008 NVIDIA Corporation.

Host Synchronization Example

// copy data from host to device

cudaMemcpy(a_d, a_h, numBytes, cudaMemcpyHostToDevice);

// execute the kernel

inc_gpu<<<ceil(N/(float)blocksize), blocksize>>>(a_d, N);

// run independent CPU code

run_cpu_stuff();

// copy data from device back to host

cudaMemcpy(a_h, a_d, numBytes, cudaMemcpyDeviceToHost);

Thread Synchronization• __syncthreads()

• barrier for threads within their block

• e.g. to avoid “memory hazard” when accessing shared memory

• __threadfence()

• interblock synchronization

• flushes global memory writes to make them visible to all threads

More?

• CUDA C Programming Guide 

• CUDA C Best Practices Guide 

• CUDA Reference Manual 

• API Reference, PTX ISA 2.2 

• CUDA-GDB User Manual 

• Visual Profiler Manual  

• User Guides: CUBLAS, CUFFT, CUSPARSE, CURAND

http://developer.nvidia.com/object/gpucomputing.html

More?

iPhD one more thingor two...

Life/Code Hacking #1Getting Things Done

Phase 1: Organize

Phase 2: DO

Phase 3: Review

Tools

• Notepad + Pen ;-)

• Gmail: labels, shorcuts, quick links and advanced search

• Lists: e.g. Remember the Milk

• Many more: Google “gtd tools”

COME

slide by David Cox

Back pocket slides

GPUHistory

not true!

History

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

/

!""#$%&'$()

*(++&),

-.(+.'/0

1&2'./$3&'$()

4.5'6/.

7/&8+.)'

9$2"#&0

4:.;'/&,$'$()&#;+(,.#;<(/;=>9;1.),./$)8

!"#$%! ?./'$%.2;&),;@/$+$'$A.2

! 4/&)2<(/+&'$()2! !"#$%"&#'()*)+,%,*-.',%/0

&$%#$%! B9;C+&8.;<(/;,$2"#&0

!""#$%&'$()

*(++&),

-.(+.'/0

1&2'./$3&'$()

4.5'6/.

7/&8+.)'

9$2"#&0

'()*"%+,##()-.%)/"++

! @/."&/.;&),;#(&,;,&'&! C226.2;%(++&),2;A$&;&);!@C;D.E8E;

F".)-G;(/;9$/.%'HI

!""#$%&'$()

*(++&),

-.(+.'/0

1&2'./$3&'$()

4.5'6/.

7/&8+.)'

9$2"#&0

01/-*22)"3+-/44."5265.%.+71/4+%8*.##()-.%)/"

! 4/$&)86#&'.;@(#08()2

! @/."&/.;A./'.5;,&'&;2'/.&+2! 0

!""#$%&'$()

*(++&),

-.(+.'/0

1&2'./$3&'$()

4.5'6/.

7/&8+.)'

9$2"#&0

01/-*22)"3+9*1%)-*2

! J(,.#$)8;4/&)2<(/+&'$()2! ?$.K$)8;4/&)2<(/+&'$()2

! ?./'.5>L&2.,;G$8:'$)8;*(+"6'&'$()! @./2".%'$A.;4/&)2<(/+&'$()

!""#$%&'$()

*(++&),

-.(+.'/0

1&2'./$3&'$()

4.5'6/.

7/&8+.)'

9$2"#&0

'/":*1%)"3+;*/4*%1<+%/+=1.34*"%2

! 7(/+&'$();(<;'/$&)8#.2;K$':;"/(%.22.,;A./'$%.2

! C)'./"(#&'$();(<;A./'.5;&''/$L6'.2;&%/(22;'/$&)8#.2

! 1(,*-2,/%"3,'4"3"5,6

! */.&'$)8;7/&8+.)'2;</(+;':.;4/$&)8#.2! *#$""$)8

!""#$%&'$()

*(++&),

-.(+.'/0

1&2'./$3&'$()

4.5'6/.

7/&8+.)'

9$2"#&0

>*?%$1*+4.##)"3+/7+=1.34*"%2

! !77892'1%,:%9*,'+,+7*;6

! @./<(/+;'.5'6/.;<$#'./$)8

slide by Matthew Bolitho

History

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

F

!""#$%&'$()

*(++&),

-.(+.'/0

1&2'./$3&'$()

4.5'6/.

7/&8+.)'

9$2"#&0

!"#$%&'()*"+,&--.'$

! :./;7/&8+.)';<$8='$)8! >+&8.?@&2.,;.AA.%'2

! !)'$?!#$&2$)8! !#"=&;B#.),$)8! !

!""#$%&'$()

*(++&),

-.(+.'/0

1&2'./$3&'$()

4.5'6/.

7/&8+.)'

9$2"#&0

/+'0&"(.'$)!"#$%&'(-)(+)*.1&2-

! 9."'=;B6AA./;4.2'! C'.)%$#;B6AA./;4.2'

! !%%6+6#&'$();B6AA./;D"./&'$()! E/$'.;7/&8+.)'2;'(;7/&+.@6AA./

! 1.),./;.'(&"#,(.0&F;/.&#$2'$%;%(+"6'./;

8.)./&'.,;2%.).2

! G&%=;A/&+.;$2;%(+"#.5

! H..,;IJ;A/&+.2;"./;2.%(),

! "#$%&'()*)'+,,'&-,(.

"3&4.,#(&4)5#"46#"&

!""#$%&'$()

*(++&),

-.(+.'/0

1&2'./$3&'$()

4.5'6/.

7/&8+.)'

9$2"#&0

! 4(;$+"/(K.;"./A(/+&)%.F;+(K.;2(+.;L(/M;'(;,.,$%&'.,;=&/,L&/.

! N&/,L&/.;%(6#,;"/(%.22;.&%=;K./'.5;

&),;.&%=;A/&8+.)';$),.".),.)'#0;"7.$528)*#"#22&2

*:O;P;N(2'

-/&"=$%2;N&/,L&/.

! /0)'1*23045&'#43)-46)'(2&'7!"#$%&!'()*"+(8

" N&/,L&/.;L&2;=&/,L$/.,;'(;"./A(/+;'=.;("./&'$()2;$);'=.;"$".#$).

! GK.)'6&##0F;"$".#$).;@.%&+.;+(/.;"/(8/&++&@#.

!""#$%&'$()

*(++&),

-.(+.'/0

1&2'./$3&'$()

4.5'6/.

7/&8+.)'

9$2"#&0

! 94*&+'&+2:)'+,';)'73*,:*2<<2;-)8'()*)'

4.5'6/.;&),;7/&8+.)';2'&8.2

! !@#.;'(;2".%$A0;&;,$2%/.'.;2.';(A;'.5'6/.;

@#.),$)8;("./&'$()2;;! *(6#,;%(+@$).;/.26#'2;A/(+;Q;'.5'6/.;

#((M6"2R;;GR8R;;

!SBT;;U!VW!FBXT;!;9D4;BT;!YB

! H(;%$/%6#&'$();(A;,&'&;$);"$".#$).

*:O;P;N(2'

-/&"=$%2;N&/,L&/.

slide by Matthew Bolitho

History

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

F

!""#$%&'$()

*(++&),

-.(+.'/0

1&2'./$3&'$()

4.5'6/.

7/&8+.)'

9$2"#&0

!"#$%&'()*"+,&--.'$

! :./;7/&8+.)';<$8='$)8! >+&8.?@&2.,;.AA.%'2

! !)'$?!#$&2$)8! !#"=&;B#.),$)8! !

!""#$%&'$()

*(++&),

-.(+.'/0

1&2'./$3&'$()

4.5'6/.

7/&8+.)'

9$2"#&0

/+'0&"(.'$)!"#$%&'(-)(+)*.1&2-

! 9."'=;B6AA./;4.2'! C'.)%$#;B6AA./;4.2'

! !%%6+6#&'$();B6AA./;D"./&'$()! E/$'.;7/&8+.)'2;'(;7/&+.@6AA./

! 1.),./;.'(&"#,(.0&F;/.&#$2'$%;%(+"6'./;

8.)./&'.,;2%.).2

! G&%=;A/&+.;$2;%(+"#.5

! H..,;IJ;A/&+.2;"./;2.%(),

! "#$%&'()*)'+,,'&-,(.

"3&4.,#(&4)5#"46#"&

!""#$%&'$()

*(++&),

-.(+.'/0

1&2'./$3&'$()

4.5'6/.

7/&8+.)'

9$2"#&0

! 4(;$+"/(K.;"./A(/+&)%.F;+(K.;2(+.;L(/M;'(;,.,$%&'.,;=&/,L&/.

! N&/,L&/.;%(6#,;"/(%.22;.&%=;K./'.5;

&),;.&%=;A/&8+.)';$),.".),.)'#0;"7.$528)*#"#22&2

*:O;P;N(2'

-/&"=$%2;N&/,L&/.

! /0)'1*23045&'#43)-46)'(2&'7!"#$%&!'()*"+(8

" N&/,L&/.;L&2;=&/,L$/.,;'(;"./A(/+;'=.;("./&'$()2;$);'=.;"$".#$).

! GK.)'6&##0F;"$".#$).;@.%&+.;+(/.;"/(8/&++&@#.

!""#$%&'$()

*(++&),

-.(+.'/0

1&2'./$3&'$()

4.5'6/.

7/&8+.)'

9$2"#&0

! 94*&+'&+2:)'+,';)'73*,:*2<<2;-)8'()*)'

4.5'6/.;&),;7/&8+.)';2'&8.2

! !@#.;'(;2".%$A0;&;,$2%/.'.;2.';(A;'.5'6/.;

@#.),$)8;("./&'$()2;;! *(6#,;%(+@$).;/.26#'2;A/(+;Q;'.5'6/.;

#((M6"2R;;GR8R;;

!SBT;;U!VW!FBXT;!;9D4;BT;!YB

! H(;%$/%6#&'$();(A;,&'&;$);"$".#$).

*:O;P;N(2'

-/&"=$%2;N&/,L&/.

slide by Matthew Bolitho

History

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

F

!""#$%&'$()

*(++&),

-.(+.'/0

1&2'./$3&'$()

4.5'6/.

7/&8+.)'

9$2"#&0

!"#$%&'()*"+,&--.'$

! :./;7/&8+.)';<$8='$)8! >+&8.?@&2.,;.AA.%'2

! !)'$?!#$&2$)8! !#"=&;B#.),$)8! !

!""#$%&'$()

*(++&),

-.(+.'/0

1&2'./$3&'$()

4.5'6/.

7/&8+.)'

9$2"#&0

/+'0&"(.'$)!"#$%&'(-)(+)*.1&2-

! 9."'=;B6AA./;4.2'! C'.)%$#;B6AA./;4.2'

! !%%6+6#&'$();B6AA./;D"./&'$()! E/$'.;7/&8+.)'2;'(;7/&+.@6AA./

! 1.),./;.'(&"#,(.0&F;/.&#$2'$%;%(+"6'./;

8.)./&'.,;2%.).2

! G&%=;A/&+.;$2;%(+"#.5

! H..,;IJ;A/&+.2;"./;2.%(),

! "#$%&'()*)'+,,'&-,(.

"3&4.,#(&4)5#"46#"&

!""#$%&'$()

*(++&),

-.(+.'/0

1&2'./$3&'$()

4.5'6/.

7/&8+.)'

9$2"#&0

! 4(;$+"/(K.;"./A(/+&)%.F;+(K.;2(+.;L(/M;'(;,.,$%&'.,;=&/,L&/.

! N&/,L&/.;%(6#,;"/(%.22;.&%=;K./'.5;

&),;.&%=;A/&8+.)';$),.".),.)'#0;"7.$528)*#"#22&2

*:O;P;N(2'

-/&"=$%2;N&/,L&/.

! /0)'1*23045&'#43)-46)'(2&'7!"#$%&!'()*"+(8

" N&/,L&/.;L&2;=&/,L$/.,;'(;"./A(/+;'=.;("./&'$()2;$);'=.;"$".#$).

! GK.)'6&##0F;"$".#$).;@.%&+.;+(/.;"/(8/&++&@#.

!""#$%&'$()

*(++&),

-.(+.'/0

1&2'./$3&'$()

4.5'6/.

7/&8+.)'

9$2"#&0

! 94*&+'&+2:)'+,';)'73*,:*2<<2;-)8'()*)'

4.5'6/.;&),;7/&8+.)';2'&8.2

! !@#.;'(;2".%$A0;&;,$2%/.'.;2.';(A;'.5'6/.;

@#.),$)8;("./&'$()2;;! *(6#,;%(+@$).;/.26#'2;A/(+;Q;'.5'6/.;

#((M6"2R;;GR8R;;

!SBT;;U!VW!FBXT;!;9D4;BT;!YB

! H(;%$/%6#&'$();(A;,&'&;$);"$".#$).

*:O;P;N(2'

-/&"=$%2;N&/,L&/.

slide by Matthew Bolitho

History

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

&

!""#$%&'$()

*(++&),

-.(+.'/0

1&2'./$3&'$()

4.5'6/.

7/&8+.)'

9$2"#&0

! 4.5'6/.:&),:7/&8+.)':2'&8.2:;.%&+.:+(/.:"/(8/&++&;#.<:%(+;$).,:$)'(:

!"#$%&'()*+(,)-*=>:?:@(2'

-/&"A$%2:@&/,B&/.

!""#$%&'$()

*(++&),

-.(+.'/0

1&2'./$3&'$()

7/&8+.)':>)$'

9$2"#&0

! 4.5'6/.:&),:7/&8+.)':2'&8.2:;.%&+.:+(/.:"/(8/&++&;#.<:%(+;$).,:$)'(:

!"#$%&'()*+(,)-

! =/(8/&++&;#.:C$&:&22.+;#0:#&)86&8.! D.+(/0:/.&,2:C$&:'.5'6/.:#((E6"2! !.'/'(0$()-*)'1)2#'*34452/6

! F$+$'.,:=/(8/&+:2$3.

! G(:/.&#:;/&)%A$)8:H'A62:#(("$)8I

*=>:?:@(2'

-/&"A$%2:@&/,B&/.

!""#$%&'$()

*(++&),

J./'.5:>)$'

1&2'./$3&'$()

7/&8+.)':>)$'

9$2"#&0

! -.(+.'/0:2'&8.:;.%&+.:/#4%#$&&$73'8*9$33'0*!:'#)'1*+(,)-

! =/(8/&++&;#.:C$&:&22.+;#0:#&)86&8.

! G(:+.+(/0:/.&,2K

! F$+$'.,:=/(8/&+:2$3.

! G(:/.&#:;/&)%A$)8:H'A62:#(("$)8I

*=>:?:@(2'

-/&"A$%2:@&/,B&/.

!""#$%&'$()

*(++&),

J./'.5:>)$'

1&2'./$3&'$()

7/&8+.)':>)$'

9$2"#&0

! 4A$)82:$+"/(C.,:(C./:'$+.L

! J./'.5:6)$':%&):,(:+.+(/0:/.&,2! D&5$+6+:=/(8/&+:2$3.:$)%/.&2.,! M/&)%A$)8:26""(/'! @$8A./:#.C.#:#&)86&8.2:H.N8N:@FOF<:*8I

! G.$'A./:'A.:J./'.5:(/:7/&8+.)':6)$'2:%(6#,:B/$'.:'(:+.+(/0N::*&):()#0:B/$'.:'(:P/&+.:;6PP./

! G(:$)'.8./:+&'A! G(:;$'B$2.:("./&'(/2

*=>:?:@(2'

-/&"A$%2:@&/,B&/.

!""#$%&'$()

*(++&),*=>:?:@(2'

1&2'./$3&

'$()

9$2"#&0

!"#$"%&'()$*#+,-"($&

'()$

4.5'6/.:D.+(/0 4.5'6/.:D.+(/0

-/&"A$%2:@&/,B&/.

! ;(*<==>*?@+A6*7'9$&'*&46)3B*/#4%#$&&$73'8*

! !C23),Q/$66-*$3%4#,)D&6*$334E'0*E#,)'6*)4*

+.+(/0L

! R):"&22:S:B/$'.:'(:P/&+.;6PP./

! 1.;$),:'A.:P/&+.;6PP./ &2:&:'.5'6/.

! 1.&,:$':$):"&22:T<:.'%N

! M6':B./.:$).PP$%$.)'

slide by Matthew Bolitho

History

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

&

!""#$%&'$()

*(++&),

-.(+.'/0

1&2'./$3&'$()

4.5'6/.

7/&8+.)'

9$2"#&0

! 4.5'6/.:&),:7/&8+.)':2'&8.2:;.%&+.:+(/.:"/(8/&++&;#.<:%(+;$).,:$)'(:

!"#$%&'()*+(,)-*=>:?:@(2'

-/&"A$%2:@&/,B&/.

!""#$%&'$()

*(++&),

-.(+.'/0

1&2'./$3&'$()

7/&8+.)':>)$'

9$2"#&0

! 4.5'6/.:&),:7/&8+.)':2'&8.2:;.%&+.:+(/.:"/(8/&++&;#.<:%(+;$).,:$)'(:

!"#$%&'()*+(,)-

! =/(8/&++&;#.:C$&:&22.+;#0:#&)86&8.! D.+(/0:/.&,2:C$&:'.5'6/.:#((E6"2! !.'/'(0$()-*)'1)2#'*34452/6

! F$+$'.,:=/(8/&+:2$3.

! G(:/.&#:;/&)%A$)8:H'A62:#(("$)8I

*=>:?:@(2'

-/&"A$%2:@&/,B&/.

!""#$%&'$()

*(++&),

J./'.5:>)$'

1&2'./$3&'$()

7/&8+.)':>)$'

9$2"#&0

! -.(+.'/0:2'&8.:;.%&+.:/#4%#$&&$73'8*9$33'0*!:'#)'1*+(,)-

! =/(8/&++&;#.:C$&:&22.+;#0:#&)86&8.

! G(:+.+(/0:/.&,2K

! F$+$'.,:=/(8/&+:2$3.

! G(:/.&#:;/&)%A$)8:H'A62:#(("$)8I

*=>:?:@(2'

-/&"A$%2:@&/,B&/.

!""#$%&'$()

*(++&),

J./'.5:>)$'

1&2'./$3&'$()

7/&8+.)':>)$'

9$2"#&0

! 4A$)82:$+"/(C.,:(C./:'$+.L

! J./'.5:6)$':%&):,(:+.+(/0:/.&,2! D&5$+6+:=/(8/&+:2$3.:$)%/.&2.,! M/&)%A$)8:26""(/'! @$8A./:#.C.#:#&)86&8.2:H.N8N:@FOF<:*8I

! G.$'A./:'A.:J./'.5:(/:7/&8+.)':6)$'2:%(6#,:B/$'.:'(:+.+(/0N::*&):()#0:B/$'.:'(:P/&+.:;6PP./

! G(:$)'.8./:+&'A! G(:;$'B$2.:("./&'(/2

*=>:?:@(2'

-/&"A$%2:@&/,B&/.

!""#$%&'$()

*(++&),*=>:?:@(2'

1&2'./$3&

'$()

9$2"#&0

!"#$"%&'()$*#+,-"($&

'()$

4.5'6/.:D.+(/0 4.5'6/.:D.+(/0

-/&"A$%2:@&/,B&/.

! ;(*<==>*?@+A6*7'9$&'*&46)3B*/#4%#$&&$73'8*

! !C23),Q/$66-*$3%4#,)D&6*$334E'0*E#,)'6*)4*

+.+(/0L

! R):"&22:S:B/$'.:'(:P/&+.;6PP./

! 1.;$),:'A.:P/&+.;6PP./ &2:&:'.5'6/.

! 1.&,:$':$):"&22:T<:.'%N

! M6':B./.:$).PP$%$.)'

slide by Matthew Bolitho

History

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

&

!""#$%&'$()

*(++&),

-.(+.'/0

1&2'./$3&'$()

4.5'6/.

7/&8+.)'

9$2"#&0

! 4.5'6/.:&),:7/&8+.)':2'&8.2:;.%&+.:+(/.:"/(8/&++&;#.<:%(+;$).,:$)'(:

!"#$%&'()*+(,)-*=>:?:@(2'

-/&"A$%2:@&/,B&/.

!""#$%&'$()

*(++&),

-.(+.'/0

1&2'./$3&'$()

7/&8+.)':>)$'

9$2"#&0

! 4.5'6/.:&),:7/&8+.)':2'&8.2:;.%&+.:+(/.:"/(8/&++&;#.<:%(+;$).,:$)'(:

!"#$%&'()*+(,)-

! =/(8/&++&;#.:C$&:&22.+;#0:#&)86&8.! D.+(/0:/.&,2:C$&:'.5'6/.:#((E6"2! !.'/'(0$()-*)'1)2#'*34452/6

! F$+$'.,:=/(8/&+:2$3.

! G(:/.&#:;/&)%A$)8:H'A62:#(("$)8I

*=>:?:@(2'

-/&"A$%2:@&/,B&/.

!""#$%&'$()

*(++&),

J./'.5:>)$'

1&2'./$3&'$()

7/&8+.)':>)$'

9$2"#&0

! -.(+.'/0:2'&8.:;.%&+.:/#4%#$&&$73'8*9$33'0*!:'#)'1*+(,)-

! =/(8/&++&;#.:C$&:&22.+;#0:#&)86&8.

! G(:+.+(/0:/.&,2K

! F$+$'.,:=/(8/&+:2$3.

! G(:/.&#:;/&)%A$)8:H'A62:#(("$)8I

*=>:?:@(2'

-/&"A$%2:@&/,B&/.

!""#$%&'$()

*(++&),

J./'.5:>)$'

1&2'./$3&'$()

7/&8+.)':>)$'

9$2"#&0

! 4A$)82:$+"/(C.,:(C./:'$+.L

! J./'.5:6)$':%&):,(:+.+(/0:/.&,2! D&5$+6+:=/(8/&+:2$3.:$)%/.&2.,! M/&)%A$)8:26""(/'! @$8A./:#.C.#:#&)86&8.2:H.N8N:@FOF<:*8I

! G.$'A./:'A.:J./'.5:(/:7/&8+.)':6)$'2:%(6#,:B/$'.:'(:+.+(/0N::*&):()#0:B/$'.:'(:P/&+.:;6PP./

! G(:$)'.8./:+&'A! G(:;$'B$2.:("./&'(/2

*=>:?:@(2'

-/&"A$%2:@&/,B&/.

!""#$%&'$()

*(++&),*=>:?:@(2'

1&2'./$3&

'$()

9$2"#&0

!"#$"%&'()$*#+,-"($&

'()$

4.5'6/.:D.+(/0 4.5'6/.:D.+(/0

-/&"A$%2:@&/,B&/.

! ;(*<==>*?@+A6*7'9$&'*&46)3B*/#4%#$&&$73'8*

! !C23),Q/$66-*$3%4#,)D&6*$334E'0*E#,)'6*)4*

+.+(/0L

! R):"&22:S:B/$'.:'(:P/&+.;6PP./

! 1.;$),:'A.:P/&+.;6PP./ &2:&:'.5'6/.

! 1.&,:$':$):"&22:T<:.'%N

! M6':B./.:$).PP$%$.)'

slide by Matthew Bolitho

History

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

&

!""#$%&'$()

*(++&),

-.(+.'/0

1&2'./$3&'$()

4.5'6/.

7/&8+.)'

9$2"#&0

! 4.5'6/.:&),:7/&8+.)':2'&8.2:;.%&+.:+(/.:"/(8/&++&;#.<:%(+;$).,:$)'(:

!"#$%&'()*+(,)-*=>:?:@(2'

-/&"A$%2:@&/,B&/.

!""#$%&'$()

*(++&),

-.(+.'/0

1&2'./$3&'$()

7/&8+.)':>)$'

9$2"#&0

! 4.5'6/.:&),:7/&8+.)':2'&8.2:;.%&+.:+(/.:"/(8/&++&;#.<:%(+;$).,:$)'(:

!"#$%&'()*+(,)-

! =/(8/&++&;#.:C$&:&22.+;#0:#&)86&8.! D.+(/0:/.&,2:C$&:'.5'6/.:#((E6"2! !.'/'(0$()-*)'1)2#'*34452/6

! F$+$'.,:=/(8/&+:2$3.

! G(:/.&#:;/&)%A$)8:H'A62:#(("$)8I

*=>:?:@(2'

-/&"A$%2:@&/,B&/.

!""#$%&'$()

*(++&),

J./'.5:>)$'

1&2'./$3&'$()

7/&8+.)':>)$'

9$2"#&0

! -.(+.'/0:2'&8.:;.%&+.:/#4%#$&&$73'8*9$33'0*!:'#)'1*+(,)-

! =/(8/&++&;#.:C$&:&22.+;#0:#&)86&8.

! G(:+.+(/0:/.&,2K

! F$+$'.,:=/(8/&+:2$3.

! G(:/.&#:;/&)%A$)8:H'A62:#(("$)8I

*=>:?:@(2'

-/&"A$%2:@&/,B&/.

!""#$%&'$()

*(++&),

J./'.5:>)$'

1&2'./$3&'$()

7/&8+.)':>)$'

9$2"#&0

! 4A$)82:$+"/(C.,:(C./:'$+.L

! J./'.5:6)$':%&):,(:+.+(/0:/.&,2! D&5$+6+:=/(8/&+:2$3.:$)%/.&2.,! M/&)%A$)8:26""(/'! @$8A./:#.C.#:#&)86&8.2:H.N8N:@FOF<:*8I

! G.$'A./:'A.:J./'.5:(/:7/&8+.)':6)$'2:%(6#,:B/$'.:'(:+.+(/0N::*&):()#0:B/$'.:'(:P/&+.:;6PP./

! G(:$)'.8./:+&'A! G(:;$'B$2.:("./&'(/2

*=>:?:@(2'

-/&"A$%2:@&/,B&/.

!""#$%&'$()

*(++&),*=>:?:@(2'

1&2'./$3&

'$()

9$2"#&0

!"#$"%&'()$*#+,-"($&

'()$

4.5'6/.:D.+(/0 4.5'6/.:D.+(/0

-/&"A$%2:@&/,B&/.

! ;(*<==>*?@+A6*7'9$&'*&46)3B*/#4%#$&&$73'8*

! !C23),Q/$66-*$3%4#,)D&6*$334E'0*E#,)'6*)4*

+.+(/0L

! R):"&22:S:B/$'.:'(:P/&+.;6PP./

! 1.;$),:'A.:P/&+.;6PP./ &2:&:'.5'6/.

! 1.&,:$':$):"&22:T<:.'%N

! M6':B./.:$).PP$%$.)'

slide by Matthew Bolitho

History

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

&

!""#$%&'$()

*(++&),

-.(+.'/0

1&2'./$3&'$()

4.5'6/.

7/&8+.)'

9$2"#&0

! 4.5'6/.:&),:7/&8+.)':2'&8.2:;.%&+.:+(/.:"/(8/&++&;#.<:%(+;$).,:$)'(:

!"#$%&'()*+(,)-*=>:?:@(2'

-/&"A$%2:@&/,B&/.

!""#$%&'$()

*(++&),

-.(+.'/0

1&2'./$3&'$()

7/&8+.)':>)$'

9$2"#&0

! 4.5'6/.:&),:7/&8+.)':2'&8.2:;.%&+.:+(/.:"/(8/&++&;#.<:%(+;$).,:$)'(:

!"#$%&'()*+(,)-

! =/(8/&++&;#.:C$&:&22.+;#0:#&)86&8.! D.+(/0:/.&,2:C$&:'.5'6/.:#((E6"2! !.'/'(0$()-*)'1)2#'*34452/6

! F$+$'.,:=/(8/&+:2$3.

! G(:/.&#:;/&)%A$)8:H'A62:#(("$)8I

*=>:?:@(2'

-/&"A$%2:@&/,B&/.

!""#$%&'$()

*(++&),

J./'.5:>)$'

1&2'./$3&'$()

7/&8+.)':>)$'

9$2"#&0

! -.(+.'/0:2'&8.:;.%&+.:/#4%#$&&$73'8*9$33'0*!:'#)'1*+(,)-

! =/(8/&++&;#.:C$&:&22.+;#0:#&)86&8.

! G(:+.+(/0:/.&,2K

! F$+$'.,:=/(8/&+:2$3.

! G(:/.&#:;/&)%A$)8:H'A62:#(("$)8I

*=>:?:@(2'

-/&"A$%2:@&/,B&/.

!""#$%&'$()

*(++&),

J./'.5:>)$'

1&2'./$3&'$()

7/&8+.)':>)$'

9$2"#&0

! 4A$)82:$+"/(C.,:(C./:'$+.L

! J./'.5:6)$':%&):,(:+.+(/0:/.&,2! D&5$+6+:=/(8/&+:2$3.:$)%/.&2.,! M/&)%A$)8:26""(/'! @$8A./:#.C.#:#&)86&8.2:H.N8N:@FOF<:*8I

! G.$'A./:'A.:J./'.5:(/:7/&8+.)':6)$'2:%(6#,:B/$'.:'(:+.+(/0N::*&):()#0:B/$'.:'(:P/&+.:;6PP./

! G(:$)'.8./:+&'A! G(:;$'B$2.:("./&'(/2

*=>:?:@(2'

-/&"A$%2:@&/,B&/.

!""#$%&'$()

*(++&),*=>:?:@(2'

1&2'./$3&

'$()

9$2"#&0

!"#$"%&'()$*#+,-"($&

'()$

4.5'6/.:D.+(/0 4.5'6/.:D.+(/0

-/&"A$%2:@&/,B&/.

! ;(*<==>*?@+A6*7'9$&'*&46)3B*/#4%#$&&$73'8*

! !C23),Q/$66-*$3%4#,)D&6*$334E'0*E#,)'6*)4*

+.+(/0L

! R):"&22:S:B/$'.:'(:P/&+.;6PP./

! 1.;$),:'A.:P/&+.;6PP./ &2:&:'.5'6/.

! 1.&,:$':$):"&22:T<:.'%N

! M6':B./.:$).PP$%$.)'

slide by Matthew Bolitho

History

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

F

! !"#$%&"'(%)%&*&%+,#-'././0'1+))2,%&3'45"67././0'8'.","5*('/25$+#"'9+)$2&*&%+,'+,'&:"'./0;

!"!"#$"%&'%()*

! !"#$%&'()&*)+%),&-#.%

! /(*1"'<*&*'%,'&"=&25"#

! !5*6'*'>(*&'?2*<'7+>>@#15"",;

! A5%&"')2(&%@$*##'*(4+5%&:)'2#%,4'B5*4)",&'0,%&'

&+'$"5>+5)'12#&+)'$5+1"##%,4

! 0,<"5@2&%(%C"<':*5<6*5"

! D,(3'2&%(%C"<'B5*4)",&'0,%&

! D>&",')")+53'E*,<6%<&:'(%)%&"<

! .*&:"5@E*#"<'*(4+5%&:)#'+,(3'7,+'#1*&&"5;

! 0#"<'&:"'.5*$:%1#'F/G

F$$(%1*&%+,

9+))*,<9/0'H'I+#&

J*#&"5%C*

&%+,

!%#$(*3

+,%-,.$#/0-1%('),/-$

#/0-

K")+53 K")+53

.5*$:%1#'I*5<6*5"

!,&),-%2$

#/0-

K")+53

! ."+)"&53'0,%&'+$"5*&"#'+,'*'$5%)%&%L"-'1*,'

65%&"'E*1M'&+')")+53

! 9:*,4"#'&+'2,<"5(3%,4':*5<6*5"N

! FE%(%&3'&+'65%&"'&+')")+53

! /-#.0.)12&3+"4)((.#5&'#.%(

! 90!F'%#'&:"',"6'6*3'&+'$"5>+5)'

1+)$2&*&%+,'+,'&:"'./0

! !")(#$%&'()&6+738.4(&9:;

! F5E%&5*53'*11"##'&+')")+53'7#1*&&"5'+5'

4*&:"5;! 0#"#'*(('*L*%(*E("'$5+1"##%,4'2,%&#

! I*#'G,&"4"5')*&:-'O%&6%#"'+$"5*&+5#

slide by Matthew Bolitho

History

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

F

! !"#$%&"'(%)%&*&%+,#-'././0'1+))2,%&3'45"67././0'8'.","5*('/25$+#"'9+)$2&*&%+,'+,'&:"'./0;

!"!"#$"%&'%()*

! !"#$%&'()&*)+%),&-#.%

! /(*1"'<*&*'%,'&"=&25"#

! !5*6'*'>(*&'?2*<'7+>>@#15"",;

! A5%&"')2(&%@$*##'*(4+5%&:)'2#%,4'B5*4)",&'0,%&'

&+'$"5>+5)'12#&+)'$5+1"##%,4

! 0,<"5@2&%(%C"<':*5<6*5"

! D,(3'2&%(%C"<'B5*4)",&'0,%&

! D>&",')")+53'E*,<6%<&:'(%)%&"<

! .*&:"5@E*#"<'*(4+5%&:)#'+,(3'7,+'#1*&&"5;

! 0#"<'&:"'.5*$:%1#'F/G

F$$(%1*&%+,

9+))*,<9/0'H'I+#&

J*#&"5%C*

&%+,

!%#$(*3

+,%-,.$#/0-1%('),/-$

#/0-

K")+53 K")+53

.5*$:%1#'I*5<6*5"

!,&),-%2$

#/0-

K")+53

! ."+)"&53'0,%&'+$"5*&"#'+,'*'$5%)%&%L"-'1*,'

65%&"'E*1M'&+')")+53

! 9:*,4"#'&+'2,<"5(3%,4':*5<6*5"N

! FE%(%&3'&+'65%&"'&+')")+53

! /-#.0.)12&3+"4)((.#5&'#.%(

! 90!F'%#'&:"',"6'6*3'&+'$"5>+5)'

1+)$2&*&%+,'+,'&:"'./0

! !")(#$%&'()&6+738.4(&9:;

! F5E%&5*53'*11"##'&+')")+53'7#1*&&"5'+5'

4*&:"5;! 0#"#'*(('*L*%(*E("'$5+1"##%,4'2,%&#

! I*#'G,&"4"5')*&:-'O%&6%#"'+$"5*&+5#

slide by Matthew Bolitho

History

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

F

! !"#$%&"'(%)%&*&%+,#-'././0'1+))2,%&3'45"67././0'8'.","5*('/25$+#"'9+)$2&*&%+,'+,'&:"'./0;

!"!"#$"%&'%()*

! !"#$%&'()&*)+%),&-#.%

! /(*1"'<*&*'%,'&"=&25"#

! !5*6'*'>(*&'?2*<'7+>>@#15"",;

! A5%&"')2(&%@$*##'*(4+5%&:)'2#%,4'B5*4)",&'0,%&'

&+'$"5>+5)'12#&+)'$5+1"##%,4

! 0,<"5@2&%(%C"<':*5<6*5"

! D,(3'2&%(%C"<'B5*4)",&'0,%&

! D>&",')")+53'E*,<6%<&:'(%)%&"<

! .*&:"5@E*#"<'*(4+5%&:)#'+,(3'7,+'#1*&&"5;

! 0#"<'&:"'.5*$:%1#'F/G

F$$(%1*&%+,

9+))*,<9/0'H'I+#&

J*#&"5%C*

&%+,

!%#$(*3

+,%-,.$#/0-1%('),/-$

#/0-

K")+53 K")+53

.5*$:%1#'I*5<6*5"

!,&),-%2$

#/0-

K")+53

! ."+)"&53'0,%&'+$"5*&"#'+,'*'$5%)%&%L"-'1*,'

65%&"'E*1M'&+')")+53

! 9:*,4"#'&+'2,<"5(3%,4':*5<6*5"N

! FE%(%&3'&+'65%&"'&+')")+53

! /-#.0.)12&3+"4)((.#5&'#.%(

! 90!F'%#'&:"',"6'6*3'&+'$"5>+5)'

1+)$2&*&%+,'+,'&:"'./0

! !")(#$%&'()&6+738.4(&9:;

! F5E%&5*53'*11"##'&+')")+53'7#1*&&"5'+5'

4*&:"5;! 0#"#'*(('*L*%(*E("'$5+1"##%,4'2,%&#

! I*#'G,&"4"5')*&:-'O%&6%#"'+$"5*&+5#

slide by Matthew Bolitho

History

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

F

! !"#$%&"'(%)%&*&%+,#-'././0'1+))2,%&3'45"67././0'8'.","5*('/25$+#"'9+)$2&*&%+,'+,'&:"'./0;

!"!"#$"%&'%()*

! !"#$%&'()&*)+%),&-#.%

! /(*1"'<*&*'%,'&"=&25"#

! !5*6'*'>(*&'?2*<'7+>>@#15"",;

! A5%&"')2(&%@$*##'*(4+5%&:)'2#%,4'B5*4)",&'0,%&'

&+'$"5>+5)'12#&+)'$5+1"##%,4

! 0,<"5@2&%(%C"<':*5<6*5"

! D,(3'2&%(%C"<'B5*4)",&'0,%&

! D>&",')")+53'E*,<6%<&:'(%)%&"<

! .*&:"5@E*#"<'*(4+5%&:)#'+,(3'7,+'#1*&&"5;

! 0#"<'&:"'.5*$:%1#'F/G

F$$(%1*&%+,

9+))*,<9/0'H'I+#&

J*#&"5%C*

&%+,

!%#$(*3

+,%-,.$#/0-1%('),/-$

#/0-

K")+53 K")+53

.5*$:%1#'I*5<6*5"

!,&),-%2$

#/0-

K")+53

! ."+)"&53'0,%&'+$"5*&"#'+,'*'$5%)%&%L"-'1*,'

65%&"'E*1M'&+')")+53

! 9:*,4"#'&+'2,<"5(3%,4':*5<6*5"N

! FE%(%&3'&+'65%&"'&+')")+53

! /-#.0.)12&3+"4)((.#5&'#.%(

! 90!F'%#'&:"',"6'6*3'&+'$"5>+5)'

1+)$2&*&%+,'+,'&:"'./0

! !")(#$%&'()&6+738.4(&9:;

! F5E%&5*53'*11"##'&+')")+53'7#1*&&"5'+5'

4*&:"5;! 0#"#'*(('*L*%(*E("'$5+1"##%,4'2,%&#

! I*#'G,&"4"5')*&:-'O%&6%#"'+$"5*&+5#

slide by Matthew Bolitho

History

CUDA Language

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DEFD/$$0

G

! !"#$%&'()*'+%,%-,*./,.'%01,0%)+%+)2)-,3%04%

!5!66

! $--47+%834.3,22'3+%04%',+)-9%24:'%';)+0)*.%

<4&'%04%!"#$

! ='++'*+%-',3*)*.%</3:'

! !"#$%&'()*'+%,%-,*./,.'%01,0%)+%+)2)-,3%04%

!5!66

! !"#$%&$'()*$'+',,$-%../0/12$.0"3$$

&241-40-$'+',,5

! !"#$%&'()*'+%,%-,*./,.'%01,0%)+%+)2)-,3%04%

!5!66

! >9*0,<0)<%';0'*+)4*+?

! #'<-,3,0)4*%@/,-)()'3+

! A/)-0B)*%C,3),D-'+

! A/)-0B)*%E98'+

! F;'</0)4*%!4*()./3,0)4*

! #'<-+8'< G%&'<-,3,0)4*%+8'<)()'3 5%&'<-,3,0)4*%

H/,-)()'3

! $%24&)()'3%,88-)'&%04%&'<-,3,0)4*+%4(?

! C,3),D-'+

! I/*<0)4*+

! F;,28-'+?%%!"#$%J%&'%&(#J%$%)%*!

! !"#$%/+'+%01'%(4--47)*.%&'<-,3,0)4*%

H/,-)()'3+%(43%:,3),D-'+?

! ++,&-*!&++

! ++$.)(&,++

! ++!"#$%)#%++

! K*-9%,88-9%04%.-4D,-%:,3),D-'+

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

#

! !"#$!%&'()*'+),-./'+0'1(2*'('3014*+-./'

4)0563+7''890:*'"0'+;*'%*+(9

! <-):+')*9*(:*'=>?$>@A'B01B*5

! C*30.5')*9*(:*'-.'D?$>@')*EF)-++*.

! G4*.'C06)3*

! H0+',*+'('I-(B9*':096+-0.

&*I-3*

%69+-EJ)03*::0) %69+-EJ)03*::0)

!

!"#$%&'()"*+ !"#$%&'()"*+

,(-.#(&'()"*+

/0 /0

/0 /0

/0 /0

! !

/0 /0

/0 /0

/0 /0

! !

%69+-EJ)03*::0)

!"#$%&'()"*+

/0 /0

/0 /0

/0 /0

! !

! ";*'K6.5(1*.+(9'6.-+'-:'+;*'!"#$%&'(#)*$!!)#

! !':3(9()L'1.23%(45*(#.1."2 K90(+-./'40-.+'!MN

! G.*'%69+-49,$!55'4*)'39032'3,39*

! 678 #OOOE@PQ'30149-(.+

! C+)*(1'4)03*::0):'()*'/)064*5'-.+0'&+,"-.

(#)*$!!)#!

! %69+-E4)03*::0):')6.'-.'/9',&%"#:1;(5

! !'.61B*)'0K'169+-E4)03*::0):'K0)1'('/$0-*$

%69+-EJ)03*::0)

<(3.1;(*1!"#$%&

'()"*+

!

/;*($)&0*"#(11"*

/=$*(>&'()"*+

?%"@$%&'()"*+

A"21;$2;&'()"*+

8(B;C*(&'()"*+

/;*($)&0*"#(11"*1&=$-(&$##(11&;"D

'()"*+&8+5( E##(11 /=$*.23

R*/-:+*): R*(5$S)-+* J)-I(+*

M03(9'%*10), R*(5$S)-+* J)-I(+*

C;()*5'%*10), R*(5$S)-+* %69+-EJ)03*::0)

T90B(9'%*10), R*(5$S)-+* &*I-3*

80.:+(.+'%*10), R*(5 &*I-3*

"*U+6)*'%*10), R*(5 &*I-3*

Language

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DEFD/$$0

G

! !"#$%&'()*'+%,%-,*./,.'%01,0%)+%+)2)-,3%04%

!5!66

! $--47+%834.3,22'3+%04%',+)-9%24:'%';)+0)*.%

<4&'%04%!"#$

! ='++'*+%-',3*)*.%</3:'

! !"#$%&'()*'+%,%-,*./,.'%01,0%)+%+)2)-,3%04%

!5!66

! !"#$%&$'()*$'+',,$-%../0/12$.0"3$$

&241-40-$'+',,5

! !"#$%&'()*'+%,%-,*./,.'%01,0%)+%+)2)-,3%04%

!5!66

! >9*0,<0)<%';0'*+)4*+?

! #'<-,3,0)4*%@/,-)()'3+

! A/)-0B)*%C,3),D-'+

! A/)-0B)*%E98'+

! F;'</0)4*%!4*()./3,0)4*

! #'<-+8'< G%&'<-,3,0)4*%+8'<)()'3 5%&'<-,3,0)4*%

H/,-)()'3

! $%24&)()'3%,88-)'&%04%&'<-,3,0)4*+%4(?

! C,3),D-'+

! I/*<0)4*+

! F;,28-'+?%%!"#$%J%&'%&(#J%$%)%*!

! !"#$%/+'+%01'%(4--47)*.%&'<-,3,0)4*%

H/,-)()'3+%(43%:,3),D-'+?

! ++,&-*!&++

! ++$.)(&,++

! ++!"#$%)#%++

! K*-9%,88-9%04%.-4D,-%:,3),D-'+

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

#

! !"#$!%&'()*'+),-./'+0'1(2*'('3014*+-./'

4)0563+7''890:*'"0'+;*'%*+(9

! <-):+')*9*(:*'=>?$>@A'B01B*5

! C*30.5')*9*(:*'-.'D?$>@')*EF)-++*.

! G4*.'C06)3*

! H0+',*+'('I-(B9*':096+-0.

&*I-3*

%69+-EJ)03*::0) %69+-EJ)03*::0)

!

!"#$%&'()"*+ !"#$%&'()"*+

,(-.#(&'()"*+

/0 /0

/0 /0

/0 /0

! !

/0 /0

/0 /0

/0 /0

! !

%69+-EJ)03*::0)

!"#$%&'()"*+

/0 /0

/0 /0

/0 /0

! !

! ";*'K6.5(1*.+(9'6.-+'-:'+;*'!"#$%&'(#)*$!!)#

! !':3(9()L'1.23%(45*(#.1."2 K90(+-./'40-.+'!MN

! G.*'%69+-49,$!55'4*)'39032'3,39*

! 678 #OOOE@PQ'30149-(.+

! C+)*(1'4)03*::0):'()*'/)064*5'-.+0'&+,"-.

(#)*$!!)#!

! %69+-E4)03*::0):')6.'-.'/9',&%"#:1;(5

! !'.61B*)'0K'169+-E4)03*::0):'K0)1'('/$0-*$

%69+-EJ)03*::0)

<(3.1;(*1!"#$%&

'()"*+

!

/;*($)&0*"#(11"*

/=$*(>&'()"*+

?%"@$%&'()"*+

A"21;$2;&'()"*+

8(B;C*(&'()"*+

/;*($)&0*"#(11"*1&=$-(&$##(11&;"D

'()"*+&8+5( E##(11 /=$*.23

R*/-:+*): R*(5$S)-+* J)-I(+*

M03(9'%*10), R*(5$S)-+* J)-I(+*

C;()*5'%*10), R*(5$S)-+* %69+-EJ)03*::0)

T90B(9'%*10), R*(5$S)-+* &*I-3*

80.:+(.+'%*10), R*(5 &*I-3*

"*U+6)*'%*10), R*(5 &*I-3*

Language

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DEFD/$$0

G

! !"#$%&'()*'+%,%-,*./,.'%01,0%)+%+)2)-,3%04%

!5!66

! $--47+%834.3,22'3+%04%',+)-9%24:'%';)+0)*.%

<4&'%04%!"#$

! ='++'*+%-',3*)*.%</3:'

! !"#$%&'()*'+%,%-,*./,.'%01,0%)+%+)2)-,3%04%

!5!66

! !"#$%&$'()*$'+',,$-%../0/12$.0"3$$

&241-40-$'+',,5

! !"#$%&'()*'+%,%-,*./,.'%01,0%)+%+)2)-,3%04%

!5!66

! >9*0,<0)<%';0'*+)4*+?

! #'<-,3,0)4*%@/,-)()'3+

! A/)-0B)*%C,3),D-'+

! A/)-0B)*%E98'+

! F;'</0)4*%!4*()./3,0)4*

! #'<-+8'< G%&'<-,3,0)4*%+8'<)()'3 5%&'<-,3,0)4*%

H/,-)()'3

! $%24&)()'3%,88-)'&%04%&'<-,3,0)4*+%4(?

! C,3),D-'+

! I/*<0)4*+

! F;,28-'+?%%!"#$%J%&'%&(#J%$%)%*!

! !"#$%/+'+%01'%(4--47)*.%&'<-,3,0)4*%

H/,-)()'3+%(43%:,3),D-'+?

! ++,&-*!&++

! ++$.)(&,++

! ++!"#$%)#%++

! K*-9%,88-9%04%.-4D,-%:,3),D-'+

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

#

! !"#$!%&'()*'+),-./'+0'1(2*'('3014*+-./'

4)0563+7''890:*'"0'+;*'%*+(9

! <-):+')*9*(:*'=>?$>@A'B01B*5

! C*30.5')*9*(:*'-.'D?$>@')*EF)-++*.

! G4*.'C06)3*

! H0+',*+'('I-(B9*':096+-0.

&*I-3*

%69+-EJ)03*::0) %69+-EJ)03*::0)

!

!"#$%&'()"*+ !"#$%&'()"*+

,(-.#(&'()"*+

/0 /0

/0 /0

/0 /0

! !

/0 /0

/0 /0

/0 /0

! !

%69+-EJ)03*::0)

!"#$%&'()"*+

/0 /0

/0 /0

/0 /0

! !

! ";*'K6.5(1*.+(9'6.-+'-:'+;*'!"#$%&'(#)*$!!)#

! !':3(9()L'1.23%(45*(#.1."2 K90(+-./'40-.+'!MN

! G.*'%69+-49,$!55'4*)'39032'3,39*

! 678 #OOOE@PQ'30149-(.+

! C+)*(1'4)03*::0):'()*'/)064*5'-.+0'&+,"-.

(#)*$!!)#!

! %69+-E4)03*::0):')6.'-.'/9',&%"#:1;(5

! !'.61B*)'0K'169+-E4)03*::0):'K0)1'('/$0-*$

%69+-EJ)03*::0)

<(3.1;(*1!"#$%&

'()"*+

!

/;*($)&0*"#(11"*

/=$*(>&'()"*+

?%"@$%&'()"*+

A"21;$2;&'()"*+

8(B;C*(&'()"*+

/;*($)&0*"#(11"*1&=$-(&$##(11&;"D

'()"*+&8+5( E##(11 /=$*.23

R*/-:+*): R*(5$S)-+* J)-I(+*

M03(9'%*10), R*(5$S)-+* J)-I(+*

C;()*5'%*10), R*(5$S)-+* %69+-EJ)03*::0)

T90B(9'%*10), R*(5$S)-+* &*I-3*

80.:+(.+'%*10), R*(5 &*I-3*

"*U+6)*'%*10), R*(5 &*I-3*

Language

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DEFD/$$0

G

! !"#$%&'()*'+%,%-,*./,.'%01,0%)+%+)2)-,3%04%

!5!66

! $--47+%834.3,22'3+%04%',+)-9%24:'%';)+0)*.%

<4&'%04%!"#$

! ='++'*+%-',3*)*.%</3:'

! !"#$%&'()*'+%,%-,*./,.'%01,0%)+%+)2)-,3%04%

!5!66

! !"#$%&$'()*$'+',,$-%../0/12$.0"3$$

&241-40-$'+',,5

! !"#$%&'()*'+%,%-,*./,.'%01,0%)+%+)2)-,3%04%

!5!66

! >9*0,<0)<%';0'*+)4*+?

! #'<-,3,0)4*%@/,-)()'3+

! A/)-0B)*%C,3),D-'+

! A/)-0B)*%E98'+

! F;'</0)4*%!4*()./3,0)4*

! #'<-+8'< G%&'<-,3,0)4*%+8'<)()'3 5%&'<-,3,0)4*%

H/,-)()'3

! $%24&)()'3%,88-)'&%04%&'<-,3,0)4*+%4(?

! C,3),D-'+

! I/*<0)4*+

! F;,28-'+?%%!"#$%J%&'%&(#J%$%)%*!

! !"#$%/+'+%01'%(4--47)*.%&'<-,3,0)4*%

H/,-)()'3+%(43%:,3),D-'+?

! ++,&-*!&++

! ++$.)(&,++

! ++!"#$%)#%++

! K*-9%,88-9%04%.-4D,-%:,3),D-'+

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

#

! !"#$!%&'()*'+),-./'+0'1(2*'('3014*+-./'

4)0563+7''890:*'"0'+;*'%*+(9

! <-):+')*9*(:*'=>?$>@A'B01B*5

! C*30.5')*9*(:*'-.'D?$>@')*EF)-++*.

! G4*.'C06)3*

! H0+',*+'('I-(B9*':096+-0.

&*I-3*

%69+-EJ)03*::0) %69+-EJ)03*::0)

!

!"#$%&'()"*+ !"#$%&'()"*+

,(-.#(&'()"*+

/0 /0

/0 /0

/0 /0

! !

/0 /0

/0 /0

/0 /0

! !

%69+-EJ)03*::0)

!"#$%&'()"*+

/0 /0

/0 /0

/0 /0

! !

! ";*'K6.5(1*.+(9'6.-+'-:'+;*'!"#$%&'(#)*$!!)#

! !':3(9()L'1.23%(45*(#.1."2 K90(+-./'40-.+'!MN

! G.*'%69+-49,$!55'4*)'39032'3,39*

! 678 #OOOE@PQ'30149-(.+

! C+)*(1'4)03*::0):'()*'/)064*5'-.+0'&+,"-.

(#)*$!!)#!

! %69+-E4)03*::0):')6.'-.'/9',&%"#:1;(5

! !'.61B*)'0K'169+-E4)03*::0):'K0)1'('/$0-*$

%69+-EJ)03*::0)

<(3.1;(*1!"#$%&

'()"*+

!

/;*($)&0*"#(11"*

/=$*(>&'()"*+

?%"@$%&'()"*+

A"21;$2;&'()"*+

8(B;C*(&'()"*+

/;*($)&0*"#(11"*1&=$-(&$##(11&;"D

'()"*+&8+5( E##(11 /=$*.23

R*/-:+*): R*(5$S)-+* J)-I(+*

M03(9'%*10), R*(5$S)-+* J)-I(+*

C;()*5'%*10), R*(5$S)-+* %69+-EJ)03*::0)

T90B(9'%*10), R*(5$S)-+* &*I-3*

80.:+(.+'%*10), R*(5 &*I-3*

"*U+6)*'%*10), R*(5 &*I-3*

Language

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DEFD/$$0

G

! !"#$%&'()*'+%,%-,*./,.'%01,0%)+%+)2)-,3%04%

!5!66

! $--47+%834.3,22'3+%04%',+)-9%24:'%';)+0)*.%

<4&'%04%!"#$

! ='++'*+%-',3*)*.%</3:'

! !"#$%&'()*'+%,%-,*./,.'%01,0%)+%+)2)-,3%04%

!5!66

! !"#$%&$'()*$'+',,$-%../0/12$.0"3$$

&241-40-$'+',,5

! !"#$%&'()*'+%,%-,*./,.'%01,0%)+%+)2)-,3%04%

!5!66

! >9*0,<0)<%';0'*+)4*+?

! #'<-,3,0)4*%@/,-)()'3+

! A/)-0B)*%C,3),D-'+

! A/)-0B)*%E98'+

! F;'</0)4*%!4*()./3,0)4*

! #'<-+8'< G%&'<-,3,0)4*%+8'<)()'3 5%&'<-,3,0)4*%

H/,-)()'3

! $%24&)()'3%,88-)'&%04%&'<-,3,0)4*+%4(?

! C,3),D-'+

! I/*<0)4*+

! F;,28-'+?%%!"#$%J%&'%&(#J%$%)%*!

! !"#$%/+'+%01'%(4--47)*.%&'<-,3,0)4*%

H/,-)()'3+%(43%:,3),D-'+?

! ++,&-*!&++

! ++$.)(&,++

! ++!"#$%)#%++

! K*-9%,88-9%04%.-4D,-%:,3),D-'+

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

#

! !"#$!%&'()*'+),-./'+0'1(2*'('3014*+-./'

4)0563+7''890:*'"0'+;*'%*+(9

! <-):+')*9*(:*'=>?$>@A'B01B*5

! C*30.5')*9*(:*'-.'D?$>@')*EF)-++*.

! G4*.'C06)3*

! H0+',*+'('I-(B9*':096+-0.

&*I-3*

%69+-EJ)03*::0) %69+-EJ)03*::0)

!

!"#$%&'()"*+ !"#$%&'()"*+

,(-.#(&'()"*+

/0 /0

/0 /0

/0 /0

! !

/0 /0

/0 /0

/0 /0

! !

%69+-EJ)03*::0)

!"#$%&'()"*+

/0 /0

/0 /0

/0 /0

! !

! ";*'K6.5(1*.+(9'6.-+'-:'+;*'!"#$%&'(#)*$!!)#

! !':3(9()L'1.23%(45*(#.1."2 K90(+-./'40-.+'!MN

! G.*'%69+-49,$!55'4*)'39032'3,39*

! 678 #OOOE@PQ'30149-(.+

! C+)*(1'4)03*::0):'()*'/)064*5'-.+0'&+,"-.

(#)*$!!)#!

! %69+-E4)03*::0):')6.'-.'/9',&%"#:1;(5

! !'.61B*)'0K'169+-E4)03*::0):'K0)1'('/$0-*$

%69+-EJ)03*::0)

<(3.1;(*1!"#$%&

'()"*+

!

/;*($)&0*"#(11"*

/=$*(>&'()"*+

?%"@$%&'()"*+

A"21;$2;&'()"*+

8(B;C*(&'()"*+

/;*($)&0*"#(11"*1&=$-(&$##(11&;"D

'()"*+&8+5( E##(11 /=$*.23

R*/-:+*): R*(5$S)-+* J)-I(+*

M03(9'%*10), R*(5$S)-+* J)-I(+*

C;()*5'%*10), R*(5$S)-+* %69+-EJ)03*::0)

T90B(9'%*10), R*(5$S)-+* &*I-3*

80.:+(.+'%*10), R*(5 &*I-3*

"*U+6)*'%*10), R*(5 &*I-3*

Language

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DEFD/$$0

&

! !"#$%&"'()*%)(%(+$,-%$(.%&/%-$"(/'('),&"0(,1(

)*"(0"./#"

! 2*"(0%)%(&"'/0"'(/1(+$,-%$(3"3,&4

! 5%'($/6")/3"(,6()*"("1)/&"(%77$/#%)/,1

! 8##"''/-$"(),(%$$(9:;()*&"%0'! 8##"''/-$"(),()*"(<:;(./%(8:=

! !"#$%&"'()*%)(%(+$,-%$(.%&/%-$"(/'('),&"0(,1(

)*"(0"./#"

! 2*"(0%)%(&"'/0"'(/1('*%&"0(3"3,&4

! 5%'($/6")/3"(,6()*"()*&"%0(-$,#>

! 8##"''/-$"(),(%$$()*&"%0'?(,1"(#,74(7"&()*&"%0(-$,#>

! =6(1,)(0"#$%&"0(%'(!"#$%&#'?(&"%0'(6&,3(

0/66"&"1)()*&"%0'(%&"(1,)(./'/-$"(@1$"''(%(

'41#*&,1/A%)/,1(-%&&/"&(@'"0

! B,)(%##"''/-$"(6&,3(<:;

! !"#$%&"'()*%)(%(+$,-%$(.%&/%-$"(/'('),&"0(,1(

)*"(0"./#"

! 2*"(0%)%(&"'/0"'(/1(#,1')%1)(3"3,&4

! 5%'($/6")/3"(,6("1)/&"(%77$/#%)/,1

! 8##"''/-$"(),(%$$(9:;()*&"%0'(C&"%0(,1$4D! 8##"''/-$"(),(<:;(./%(8:=(C&"%0EF&/)"D

! <;!8(@'"'()*"(6,$$,F/1+(0"#$'7"#' 6,&(

.%&/%-$"'G

! (()'!&*'((

! ((+",%((

! ((-#".$#((

! !"#$%&"'()*%)(%(6@1#)/,1(/'(#,37/$"0(),?(%10(

"H"#@)"'(,1()*"(0"./#"

! <%$$%-$"(,1$4(6&,3(%1,)*"&(6@1#)/,1(,1()*"(

0"./#"

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

#

! !"#$!%&'()*'+),-./'+0'1(2*'('3014*+-./'

4)0563+7''890:*'"0'+;*'%*+(9

! <-):+')*9*(:*'=>?$>@A'B01B*5

! C*30.5')*9*(:*'-.'D?$>@')*EF)-++*.

! G4*.'C06)3*

! H0+',*+'('I-(B9*':096+-0.

&*I-3*

%69+-EJ)03*::0) %69+-EJ)03*::0)

!

!"#$%&'()"*+ !"#$%&'()"*+

,(-.#(&'()"*+

/0 /0

/0 /0

/0 /0

! !

/0 /0

/0 /0

/0 /0

! !

%69+-EJ)03*::0)

!"#$%&'()"*+

/0 /0

/0 /0

/0 /0

! !

! ";*'K6.5(1*.+(9'6.-+'-:'+;*'!"#$%&'(#)*$!!)#

! !':3(9()L'1.23%(45*(#.1."2 K90(+-./'40-.+'!MN

! G.*'%69+-49,$!55'4*)'39032'3,39*

! 678 #OOOE@PQ'30149-(.+

! C+)*(1'4)03*::0):'()*'/)064*5'-.+0'&+,"-.

(#)*$!!)#!

! %69+-E4)03*::0):')6.'-.'/9',&%"#:1;(5

! !'.61B*)'0K'169+-E4)03*::0):'K0)1'('/$0-*$

%69+-EJ)03*::0)

<(3.1;(*1!"#$%&

'()"*+

!

/;*($)&0*"#(11"*

/=$*(>&'()"*+

?%"@$%&'()"*+

A"21;$2;&'()"*+

8(B;C*(&'()"*+

/;*($)&0*"#(11"*1&=$-(&$##(11&;"D

'()"*+&8+5( E##(11 /=$*.23

R*/-:+*): R*(5$S)-+* J)-I(+*

M03(9'%*10), R*(5$S)-+* J)-I(+*

C;()*5'%*10), R*(5$S)-+* %69+-EJ)03*::0)

T90B(9'%*10), R*(5$S)-+* &*I-3*

80.:+(.+'%*10), R*(5 &*I-3*

"*U+6)*'%*10), R*(5 &*I-3*

Language

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DEFD/$$0

&

! !"#$%&"'()*%)(%(+$,-%$(.%&/%-$"(/'('),&"0(,1(

)*"(0"./#"

! 2*"(0%)%(&"'/0"'(/1(+$,-%$(3"3,&4

! 5%'($/6")/3"(,6()*"("1)/&"(%77$/#%)/,1

! 8##"''/-$"(),(%$$(9:;()*&"%0'! 8##"''/-$"(),()*"(<:;(./%(8:=

! !"#$%&"'()*%)(%(+$,-%$(.%&/%-$"(/'('),&"0(,1(

)*"(0"./#"

! 2*"(0%)%(&"'/0"'(/1('*%&"0(3"3,&4

! 5%'($/6")/3"(,6()*"()*&"%0(-$,#>

! 8##"''/-$"(),(%$$()*&"%0'?(,1"(#,74(7"&()*&"%0(-$,#>

! =6(1,)(0"#$%&"0(%'(!"#$%&#'?(&"%0'(6&,3(

0/66"&"1)()*&"%0'(%&"(1,)(./'/-$"(@1$"''(%(

'41#*&,1/A%)/,1(-%&&/"&(@'"0

! B,)(%##"''/-$"(6&,3(<:;

! !"#$%&"'()*%)(%(+$,-%$(.%&/%-$"(/'('),&"0(,1(

)*"(0"./#"

! 2*"(0%)%(&"'/0"'(/1(#,1')%1)(3"3,&4

! 5%'($/6")/3"(,6("1)/&"(%77$/#%)/,1

! 8##"''/-$"(),(%$$(9:;()*&"%0'(C&"%0(,1$4D! 8##"''/-$"(),(<:;(./%(8:=(C&"%0EF&/)"D

! <;!8(@'"'()*"(6,$$,F/1+(0"#$'7"#' 6,&(

.%&/%-$"'G

! (()'!&*'((

! ((+",%((

! ((-#".$#((

! !"#$%&"'()*%)(%(6@1#)/,1(/'(#,37/$"0(),?(%10(

"H"#@)"'(,1()*"(0"./#"

! <%$$%-$"(,1$4(6&,3(%1,)*"&(6@1#)/,1(,1()*"(

0"./#"

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

#

! !"#$!%&'()*'+),-./'+0'1(2*'('3014*+-./'

4)0563+7''890:*'"0'+;*'%*+(9

! <-):+')*9*(:*'=>?$>@A'B01B*5

! C*30.5')*9*(:*'-.'D?$>@')*EF)-++*.

! G4*.'C06)3*

! H0+',*+'('I-(B9*':096+-0.

&*I-3*

%69+-EJ)03*::0) %69+-EJ)03*::0)

!

!"#$%&'()"*+ !"#$%&'()"*+

,(-.#(&'()"*+

/0 /0

/0 /0

/0 /0

! !

/0 /0

/0 /0

/0 /0

! !

%69+-EJ)03*::0)

!"#$%&'()"*+

/0 /0

/0 /0

/0 /0

! !

! ";*'K6.5(1*.+(9'6.-+'-:'+;*'!"#$%&'(#)*$!!)#

! !':3(9()L'1.23%(45*(#.1."2 K90(+-./'40-.+'!MN

! G.*'%69+-49,$!55'4*)'39032'3,39*

! 678 #OOOE@PQ'30149-(.+

! C+)*(1'4)03*::0):'()*'/)064*5'-.+0'&+,"-.

(#)*$!!)#!

! %69+-E4)03*::0):')6.'-.'/9',&%"#:1;(5

! !'.61B*)'0K'169+-E4)03*::0):'K0)1'('/$0-*$

%69+-EJ)03*::0)

<(3.1;(*1!"#$%&

'()"*+

!

/;*($)&0*"#(11"*

/=$*(>&'()"*+

?%"@$%&'()"*+

A"21;$2;&'()"*+

8(B;C*(&'()"*+

/;*($)&0*"#(11"*1&=$-(&$##(11&;"D

'()"*+&8+5( E##(11 /=$*.23

R*/-:+*): R*(5$S)-+* J)-I(+*

M03(9'%*10), R*(5$S)-+* J)-I(+*

C;()*5'%*10), R*(5$S)-+* %69+-EJ)03*::0)

T90B(9'%*10), R*(5$S)-+* &*I-3*

80.:+(.+'%*10), R*(5 &*I-3*

"*U+6)*'%*10), R*(5 &*I-3*

Language

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DEFD/$$0

&

! !"#$%&"'()*%)(%(+$,-%$(.%&/%-$"(/'('),&"0(,1(

)*"(0"./#"

! 2*"(0%)%(&"'/0"'(/1(+$,-%$(3"3,&4

! 5%'($/6")/3"(,6()*"("1)/&"(%77$/#%)/,1

! 8##"''/-$"(),(%$$(9:;()*&"%0'! 8##"''/-$"(),()*"(<:;(./%(8:=

! !"#$%&"'()*%)(%(+$,-%$(.%&/%-$"(/'('),&"0(,1(

)*"(0"./#"

! 2*"(0%)%(&"'/0"'(/1('*%&"0(3"3,&4

! 5%'($/6")/3"(,6()*"()*&"%0(-$,#>

! 8##"''/-$"(),(%$$()*&"%0'?(,1"(#,74(7"&()*&"%0(-$,#>

! =6(1,)(0"#$%&"0(%'(!"#$%&#'?(&"%0'(6&,3(

0/66"&"1)()*&"%0'(%&"(1,)(./'/-$"(@1$"''(%(

'41#*&,1/A%)/,1(-%&&/"&(@'"0

! B,)(%##"''/-$"(6&,3(<:;

! !"#$%&"'()*%)(%(+$,-%$(.%&/%-$"(/'('),&"0(,1(

)*"(0"./#"

! 2*"(0%)%(&"'/0"'(/1(#,1')%1)(3"3,&4

! 5%'($/6")/3"(,6("1)/&"(%77$/#%)/,1

! 8##"''/-$"(),(%$$(9:;()*&"%0'(C&"%0(,1$4D! 8##"''/-$"(),(<:;(./%(8:=(C&"%0EF&/)"D

! <;!8(@'"'()*"(6,$$,F/1+(0"#$'7"#' 6,&(

.%&/%-$"'G

! (()'!&*'((

! ((+",%((

! ((-#".$#((

! !"#$%&"'()*%)(%(6@1#)/,1(/'(#,37/$"0(),?(%10(

"H"#@)"'(,1()*"(0"./#"

! <%$$%-$"(,1$4(6&,3(%1,)*"&(6@1#)/,1(,1()*"(

0"./#"

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

#

! !"#$!%&'()*'+),-./'+0'1(2*'('3014*+-./'

4)0563+7''890:*'"0'+;*'%*+(9

! <-):+')*9*(:*'=>?$>@A'B01B*5

! C*30.5')*9*(:*'-.'D?$>@')*EF)-++*.

! G4*.'C06)3*

! H0+',*+'('I-(B9*':096+-0.

&*I-3*

%69+-EJ)03*::0) %69+-EJ)03*::0)

!

!"#$%&'()"*+ !"#$%&'()"*+

,(-.#(&'()"*+

/0 /0

/0 /0

/0 /0

! !

/0 /0

/0 /0

/0 /0

! !

%69+-EJ)03*::0)

!"#$%&'()"*+

/0 /0

/0 /0

/0 /0

! !

! ";*'K6.5(1*.+(9'6.-+'-:'+;*'!"#$%&'(#)*$!!)#

! !':3(9()L'1.23%(45*(#.1."2 K90(+-./'40-.+'!MN

! G.*'%69+-49,$!55'4*)'39032'3,39*

! 678 #OOOE@PQ'30149-(.+

! C+)*(1'4)03*::0):'()*'/)064*5'-.+0'&+,"-.

(#)*$!!)#!

! %69+-E4)03*::0):')6.'-.'/9',&%"#:1;(5

! !'.61B*)'0K'169+-E4)03*::0):'K0)1'('/$0-*$

%69+-EJ)03*::0)

<(3.1;(*1!"#$%&

'()"*+

!

/;*($)&0*"#(11"*

/=$*(>&'()"*+

?%"@$%&'()"*+

A"21;$2;&'()"*+

8(B;C*(&'()"*+

/;*($)&0*"#(11"*1&=$-(&$##(11&;"D

'()"*+&8+5( E##(11 /=$*.23

R*/-:+*): R*(5$S)-+* J)-I(+*

M03(9'%*10), R*(5$S)-+* J)-I(+*

C;()*5'%*10), R*(5$S)-+* %69+-EJ)03*::0)

T90B(9'%*10), R*(5$S)-+* &*I-3*

80.:+(.+'%*10), R*(5 &*I-3*

"*U+6)*'%*10), R*(5 &*I-3*

Language

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DEFD/$$0

&

! !"#$%&"'()*%)(%(+$,-%$(.%&/%-$"(/'('),&"0(,1(

)*"(0"./#"

! 2*"(0%)%(&"'/0"'(/1(+$,-%$(3"3,&4

! 5%'($/6")/3"(,6()*"("1)/&"(%77$/#%)/,1

! 8##"''/-$"(),(%$$(9:;()*&"%0'! 8##"''/-$"(),()*"(<:;(./%(8:=

! !"#$%&"'()*%)(%(+$,-%$(.%&/%-$"(/'('),&"0(,1(

)*"(0"./#"

! 2*"(0%)%(&"'/0"'(/1('*%&"0(3"3,&4

! 5%'($/6")/3"(,6()*"()*&"%0(-$,#>

! 8##"''/-$"(),(%$$()*&"%0'?(,1"(#,74(7"&()*&"%0(-$,#>

! =6(1,)(0"#$%&"0(%'(!"#$%&#'?(&"%0'(6&,3(

0/66"&"1)()*&"%0'(%&"(1,)(./'/-$"(@1$"''(%(

'41#*&,1/A%)/,1(-%&&/"&(@'"0

! B,)(%##"''/-$"(6&,3(<:;

! !"#$%&"'()*%)(%(+$,-%$(.%&/%-$"(/'('),&"0(,1(

)*"(0"./#"

! 2*"(0%)%(&"'/0"'(/1(#,1')%1)(3"3,&4

! 5%'($/6")/3"(,6("1)/&"(%77$/#%)/,1

! 8##"''/-$"(),(%$$(9:;()*&"%0'(C&"%0(,1$4D! 8##"''/-$"(),(<:;(./%(8:=(C&"%0EF&/)"D

! <;!8(@'"'()*"(6,$$,F/1+(0"#$'7"#' 6,&(

.%&/%-$"'G

! (()'!&*'((

! ((+",%((

! ((-#".$#((

! !"#$%&"'()*%)(%(6@1#)/,1(/'(#,37/$"0(),?(%10(

"H"#@)"'(,1()*"(0"./#"

! <%$$%-$"(,1$4(6&,3(%1,)*"&(6@1#)/,1(,1()*"(

0"./#"

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

#

! !"#$!%&'()*'+),-./'+0'1(2*'('3014*+-./'

4)0563+7''890:*'"0'+;*'%*+(9

! <-):+')*9*(:*'=>?$>@A'B01B*5

! C*30.5')*9*(:*'-.'D?$>@')*EF)-++*.

! G4*.'C06)3*

! H0+',*+'('I-(B9*':096+-0.

&*I-3*

%69+-EJ)03*::0) %69+-EJ)03*::0)

!

!"#$%&'()"*+ !"#$%&'()"*+

,(-.#(&'()"*+

/0 /0

/0 /0

/0 /0

! !

/0 /0

/0 /0

/0 /0

! !

%69+-EJ)03*::0)

!"#$%&'()"*+

/0 /0

/0 /0

/0 /0

! !

! ";*'K6.5(1*.+(9'6.-+'-:'+;*'!"#$%&'(#)*$!!)#

! !':3(9()L'1.23%(45*(#.1."2 K90(+-./'40-.+'!MN

! G.*'%69+-49,$!55'4*)'39032'3,39*

! 678 #OOOE@PQ'30149-(.+

! C+)*(1'4)03*::0):'()*'/)064*5'-.+0'&+,"-.

(#)*$!!)#!

! %69+-E4)03*::0):')6.'-.'/9',&%"#:1;(5

! !'.61B*)'0K'169+-E4)03*::0):'K0)1'('/$0-*$

%69+-EJ)03*::0)

<(3.1;(*1!"#$%&

'()"*+

!

/;*($)&0*"#(11"*

/=$*(>&'()"*+

?%"@$%&'()"*+

A"21;$2;&'()"*+

8(B;C*(&'()"*+

/;*($)&0*"#(11"*1&=$-(&$##(11&;"D

'()"*+&8+5( E##(11 /=$*.23

R*/-:+*): R*(5$S)-+* J)-I(+*

M03(9'%*10), R*(5$S)-+* J)-I(+*

C;()*5'%*10), R*(5$S)-+* %69+-EJ)03*::0)

T90B(9'%*10), R*(5$S)-+* &*I-3*

80.:+(.+'%*10), R*(5 &*I-3*

"*U+6)*'%*10), R*(5 &*I-3*

Language

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DEFD/$$0

&

! !"#$%&"'()*%)(%(+$,-%$(.%&/%-$"(/'('),&"0(,1(

)*"(0"./#"

! 2*"(0%)%(&"'/0"'(/1(+$,-%$(3"3,&4

! 5%'($/6")/3"(,6()*"("1)/&"(%77$/#%)/,1

! 8##"''/-$"(),(%$$(9:;()*&"%0'! 8##"''/-$"(),()*"(<:;(./%(8:=

! !"#$%&"'()*%)(%(+$,-%$(.%&/%-$"(/'('),&"0(,1(

)*"(0"./#"

! 2*"(0%)%(&"'/0"'(/1('*%&"0(3"3,&4

! 5%'($/6")/3"(,6()*"()*&"%0(-$,#>

! 8##"''/-$"(),(%$$()*&"%0'?(,1"(#,74(7"&()*&"%0(-$,#>

! =6(1,)(0"#$%&"0(%'(!"#$%&#'?(&"%0'(6&,3(

0/66"&"1)()*&"%0'(%&"(1,)(./'/-$"(@1$"''(%(

'41#*&,1/A%)/,1(-%&&/"&(@'"0

! B,)(%##"''/-$"(6&,3(<:;

! !"#$%&"'()*%)(%(+$,-%$(.%&/%-$"(/'('),&"0(,1(

)*"(0"./#"

! 2*"(0%)%(&"'/0"'(/1(#,1')%1)(3"3,&4

! 5%'($/6")/3"(,6("1)/&"(%77$/#%)/,1

! 8##"''/-$"(),(%$$(9:;()*&"%0'(C&"%0(,1$4D! 8##"''/-$"(),(<:;(./%(8:=(C&"%0EF&/)"D

! <;!8(@'"'()*"(6,$$,F/1+(0"#$'7"#' 6,&(

.%&/%-$"'G

! (()'!&*'((

! ((+",%((

! ((-#".$#((

! !"#$%&"'()*%)(%(6@1#)/,1(/'(#,37/$"0(),?(%10(

"H"#@)"'(,1()*"(0"./#"

! <%$$%-$"(,1$4(6&,3(%1,)*"&(6@1#)/,1(,1()*"(

0"./#"

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

#

! !"#$!%&'()*'+),-./'+0'1(2*'('3014*+-./'

4)0563+7''890:*'"0'+;*'%*+(9

! <-):+')*9*(:*'=>?$>@A'B01B*5

! C*30.5')*9*(:*'-.'D?$>@')*EF)-++*.

! G4*.'C06)3*

! H0+',*+'('I-(B9*':096+-0.

&*I-3*

%69+-EJ)03*::0) %69+-EJ)03*::0)

!

!"#$%&'()"*+ !"#$%&'()"*+

,(-.#(&'()"*+

/0 /0

/0 /0

/0 /0

! !

/0 /0

/0 /0

/0 /0

! !

%69+-EJ)03*::0)

!"#$%&'()"*+

/0 /0

/0 /0

/0 /0

! !

! ";*'K6.5(1*.+(9'6.-+'-:'+;*'!"#$%&'(#)*$!!)#

! !':3(9()L'1.23%(45*(#.1."2 K90(+-./'40-.+'!MN

! G.*'%69+-49,$!55'4*)'39032'3,39*

! 678 #OOOE@PQ'30149-(.+

! C+)*(1'4)03*::0):'()*'/)064*5'-.+0'&+,"-.

(#)*$!!)#!

! %69+-E4)03*::0):')6.'-.'/9',&%"#:1;(5

! !'.61B*)'0K'169+-E4)03*::0):'K0)1'('/$0-*$

%69+-EJ)03*::0)

<(3.1;(*1!"#$%&

'()"*+

!

/;*($)&0*"#(11"*

/=$*(>&'()"*+

?%"@$%&'()"*+

A"21;$2;&'()"*+

8(B;C*(&'()"*+

/;*($)&0*"#(11"*1&=$-(&$##(11&;"D

'()"*+&8+5( E##(11 /=$*.23

R*/-:+*): R*(5$S)-+* J)-I(+*

M03(9'%*10), R*(5$S)-+* J)-I(+*

C;()*5'%*10), R*(5$S)-+* %69+-EJ)03*::0)

T90B(9'%*10), R*(5$S)-+* &*I-3*

80.:+(.+'%*10), R*(5 &*I-3*

"*U+6)*'%*10), R*(5 &*I-3*

Language

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DEFD/$$0

&

! !"#$%&"'()*%)(%(+$,-%$(.%&/%-$"(/'('),&"0(,1(

)*"(0"./#"

! 2*"(0%)%(&"'/0"'(/1(+$,-%$(3"3,&4

! 5%'($/6")/3"(,6()*"("1)/&"(%77$/#%)/,1

! 8##"''/-$"(),(%$$(9:;()*&"%0'! 8##"''/-$"(),()*"(<:;(./%(8:=

! !"#$%&"'()*%)(%(+$,-%$(.%&/%-$"(/'('),&"0(,1(

)*"(0"./#"

! 2*"(0%)%(&"'/0"'(/1('*%&"0(3"3,&4

! 5%'($/6")/3"(,6()*"()*&"%0(-$,#>

! 8##"''/-$"(),(%$$()*&"%0'?(,1"(#,74(7"&()*&"%0(-$,#>

! =6(1,)(0"#$%&"0(%'(!"#$%&#'?(&"%0'(6&,3(

0/66"&"1)()*&"%0'(%&"(1,)(./'/-$"(@1$"''(%(

'41#*&,1/A%)/,1(-%&&/"&(@'"0

! B,)(%##"''/-$"(6&,3(<:;

! !"#$%&"'()*%)(%(+$,-%$(.%&/%-$"(/'('),&"0(,1(

)*"(0"./#"

! 2*"(0%)%(&"'/0"'(/1(#,1')%1)(3"3,&4

! 5%'($/6")/3"(,6("1)/&"(%77$/#%)/,1

! 8##"''/-$"(),(%$$(9:;()*&"%0'(C&"%0(,1$4D! 8##"''/-$"(),(<:;(./%(8:=(C&"%0EF&/)"D

! <;!8(@'"'()*"(6,$$,F/1+(0"#$'7"#' 6,&(

.%&/%-$"'G

! (()'!&*'((

! ((+",%((

! ((-#".$#((

! !"#$%&"'()*%)(%(6@1#)/,1(/'(#,37/$"0(),?(%10(

"H"#@)"'(,1()*"(0"./#"

! <%$$%-$"(,1$4(6&,3(%1,)*"&(6@1#)/,1(,1()*"(

0"./#"

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

#

! !"#$!%&'()*'+),-./'+0'1(2*'('3014*+-./'

4)0563+7''890:*'"0'+;*'%*+(9

! <-):+')*9*(:*'=>?$>@A'B01B*5

! C*30.5')*9*(:*'-.'D?$>@')*EF)-++*.

! G4*.'C06)3*

! H0+',*+'('I-(B9*':096+-0.

&*I-3*

%69+-EJ)03*::0) %69+-EJ)03*::0)

!

!"#$%&'()"*+ !"#$%&'()"*+

,(-.#(&'()"*+

/0 /0

/0 /0

/0 /0

! !

/0 /0

/0 /0

/0 /0

! !

%69+-EJ)03*::0)

!"#$%&'()"*+

/0 /0

/0 /0

/0 /0

! !

! ";*'K6.5(1*.+(9'6.-+'-:'+;*'!"#$%&'(#)*$!!)#

! !':3(9()L'1.23%(45*(#.1."2 K90(+-./'40-.+'!MN

! G.*'%69+-49,$!55'4*)'39032'3,39*

! 678 #OOOE@PQ'30149-(.+

! C+)*(1'4)03*::0):'()*'/)064*5'-.+0'&+,"-.

(#)*$!!)#!

! %69+-E4)03*::0):')6.'-.'/9',&%"#:1;(5

! !'.61B*)'0K'169+-E4)03*::0):'K0)1'('/$0-*$

%69+-EJ)03*::0)

<(3.1;(*1!"#$%&

'()"*+

!

/;*($)&0*"#(11"*

/=$*(>&'()"*+

?%"@$%&'()"*+

A"21;$2;&'()"*+

8(B;C*(&'()"*+

/;*($)&0*"#(11"*1&=$-(&$##(11&;"D

'()"*+&8+5( E##(11 /=$*.23

R*/-:+*): R*(5$S)-+* J)-I(+*

M03(9'%*10), R*(5$S)-+* J)-I(+*

C;()*5'%*10), R*(5$S)-+* %69+-EJ)03*::0)

T90B(9'%*10), R*(5$S)-+* &*I-3*

80.:+(.+'%*10), R*(5 &*I-3*

"*U+6)*'%*10), R*(5 &*I-3*

Language

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DEFD/$$0

G

! !"#$%&"'()*%)(%(+,-#)./-(.'(#/01.$"2()/(%-2(

"3"#,)"'(/-()*"(*/')

! 4%$$%5$"(/-$6(+&/0(%-/)*"&()*"(*/')

! 7,-#)./-'(8.)*/,)(%-6(49!:(2"#$'1"# %&"(

*/')(56(2"+%,$)

! 4%-(,'"(!!"#$%!! %-2(!!&'()*'!!+

)/;")*"&

! !"#$%&"'()*%)(%(+,-#)./-(.'(#/01.$"2()/(%-2(

"3"#,)"'(/-()*"(2"<.#"

! 4%$$%5$"(+&/0()*"(*/')

! 9'"2(%'()*"("-)&6(1/.-)(+&/0(*/')()/(2"<.#"

! 49!:(1&/<.2"'(%('")(/+(5,.$)=.-(<"#)/&()61"'>

! *",-./+0*",-./+*",-1/+0*",-1/+*",-2/+0*",-2/+*",-3/+0*",-3/+

! $"#-%./+0$"#-%./+$"#-%1/+0$"#-%1/+$"#-%2/+0$"#-%2/+$"#-%3/+0$"#-%3/

! )4%./+0)4%./+)4%1/+0)4%1/+)4%2/+0)4%2/+)4%3/+0)4%3/+

! 5#46./+05#46./+5#461/+05#461/+5#462/+05#462/+5#463/+05#463/+

! 75#,%./+75#,%1/+75#,%2/+75#,%3+

! 4%-(#/-')&,#)(%(<"#)/&()61"(8.)*('1"#.%$(

+,-#)./->

8,9'!!"#$%&'(%):(;/+(.!"#$

! 4%-(%##"''("$"0"-)'(/+(%(<"#)/&()61"(8.)*(

!"#$%&!"'$%&!"($%&!")$*

('*(,-<=

! &)82 .'(%('1"#.%$(<"#)/&()61"

! ?%0"(%'(0)4%2@("3#"1)(#%-(5"(#/-')&,#)"2(

+&/0(%('#%$%&()/(+/&0(%(<"#)/&>

:$*,5,-/+./+.>

! 49!:(1&/<.2"'(+/,&(;$/5%$@(5,.$)=.-(<%&.%5$"'

! %"-',&?&=@(@5#*9?&=@(@5#*9A)8@(

6-)&A)8

! +',-.&/0&/&1&)822&34&10)4%22&

! :##"''.5$"(/-$6(+&/0(2"<.#"(#/2"

! 4%--/)()%A"(%22&"''

! 4%--/)(%''.;-(<%$,"

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

#

! !"#$!%&'()*'+),-./'+0'1(2*'('3014*+-./'

4)0563+7''890:*'"0'+;*'%*+(9

! <-):+')*9*(:*'=>?$>@A'B01B*5

! C*30.5')*9*(:*'-.'D?$>@')*EF)-++*.

! G4*.'C06)3*

! H0+',*+'('I-(B9*':096+-0.

&*I-3*

%69+-EJ)03*::0) %69+-EJ)03*::0)

!

!"#$%&'()"*+ !"#$%&'()"*+

,(-.#(&'()"*+

/0 /0

/0 /0

/0 /0

! !

/0 /0

/0 /0

/0 /0

! !

%69+-EJ)03*::0)

!"#$%&'()"*+

/0 /0

/0 /0

/0 /0

! !

! ";*'K6.5(1*.+(9'6.-+'-:'+;*'!"#$%&'(#)*$!!)#

! !':3(9()L'1.23%(45*(#.1."2 K90(+-./'40-.+'!MN

! G.*'%69+-49,$!55'4*)'39032'3,39*

! 678 #OOOE@PQ'30149-(.+

! C+)*(1'4)03*::0):'()*'/)064*5'-.+0'&+,"-.

(#)*$!!)#!

! %69+-E4)03*::0):')6.'-.'/9',&%"#:1;(5

! !'.61B*)'0K'169+-E4)03*::0):'K0)1'('/$0-*$

%69+-EJ)03*::0)

<(3.1;(*1!"#$%&

'()"*+

!

/;*($)&0*"#(11"*

/=$*(>&'()"*+

?%"@$%&'()"*+

A"21;$2;&'()"*+

8(B;C*(&'()"*+

/;*($)&0*"#(11"*1&=$-(&$##(11&;"D

'()"*+&8+5( E##(11 /=$*.23

R*/-:+*): R*(5$S)-+* J)-I(+*

M03(9'%*10), R*(5$S)-+* J)-I(+*

C;()*5'%*10), R*(5$S)-+* %69+-EJ)03*::0)

T90B(9'%*10), R*(5$S)-+* &*I-3*

80.:+(.+'%*10), R*(5 &*I-3*

"*U+6)*'%*10), R*(5 &*I-3*

Language

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DEFD/$$0

G

! !"#$%&"'()*%)(%(+,-#)./-(.'(#/01.$"2()/(%-2(

"3"#,)"'(/-()*"(*/')

! 4%$$%5$"(/-$6(+&/0(%-/)*"&()*"(*/')

! 7,-#)./-'(8.)*/,)(%-6(49!:(2"#$'1"# %&"(

*/')(56(2"+%,$)

! 4%-(,'"(!!"#$%!! %-2(!!&'()*'!!+

)/;")*"&

! !"#$%&"'()*%)(%(+,-#)./-(.'(#/01.$"2()/(%-2(

"3"#,)"'(/-()*"(2"<.#"

! 4%$$%5$"(+&/0()*"(*/')

! 9'"2(%'()*"("-)&6(1/.-)(+&/0(*/')()/(2"<.#"

! 49!:(1&/<.2"'(%('")(/+(5,.$)=.-(<"#)/&()61"'>

! *",-./+0*",-./+*",-1/+0*",-1/+*",-2/+0*",-2/+*",-3/+0*",-3/+

! $"#-%./+0$"#-%./+$"#-%1/+0$"#-%1/+$"#-%2/+0$"#-%2/+$"#-%3/+0$"#-%3/

! )4%./+0)4%./+)4%1/+0)4%1/+)4%2/+0)4%2/+)4%3/+0)4%3/+

! 5#46./+05#46./+5#461/+05#461/+5#462/+05#462/+5#463/+05#463/+

! 75#,%./+75#,%1/+75#,%2/+75#,%3+

! 4%-(#/-')&,#)(%(<"#)/&()61"(8.)*('1"#.%$(

+,-#)./->

8,9'!!"#$%&'(%):(;/+(.!"#$

! 4%-(%##"''("$"0"-)'(/+(%(<"#)/&()61"(8.)*(

!"#$%&!"'$%&!"($%&!")$*

('*(,-<=

! &)82 .'(%('1"#.%$(<"#)/&()61"

! ?%0"(%'(0)4%2@("3#"1)(#%-(5"(#/-')&,#)"2(

+&/0(%('#%$%&()/(+/&0(%(<"#)/&>

:$*,5,-/+./+.>

! 49!:(1&/<.2"'(+/,&(;$/5%$@(5,.$)=.-(<%&.%5$"'

! %"-',&?&=@(@5#*9?&=@(@5#*9A)8@(

6-)&A)8

! +',-.&/0&/&1&)822&34&10)4%22&

! :##"''.5$"(/-$6(+&/0(2"<.#"(#/2"

! 4%--/)()%A"(%22&"''

! 4%--/)(%''.;-(<%$,"

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

#

! !"#$!%&'()*'+),-./'+0'1(2*'('3014*+-./'

4)0563+7''890:*'"0'+;*'%*+(9

! <-):+')*9*(:*'=>?$>@A'B01B*5

! C*30.5')*9*(:*'-.'D?$>@')*EF)-++*.

! G4*.'C06)3*

! H0+',*+'('I-(B9*':096+-0.

&*I-3*

%69+-EJ)03*::0) %69+-EJ)03*::0)

!

!"#$%&'()"*+ !"#$%&'()"*+

,(-.#(&'()"*+

/0 /0

/0 /0

/0 /0

! !

/0 /0

/0 /0

/0 /0

! !

%69+-EJ)03*::0)

!"#$%&'()"*+

/0 /0

/0 /0

/0 /0

! !

! ";*'K6.5(1*.+(9'6.-+'-:'+;*'!"#$%&'(#)*$!!)#

! !':3(9()L'1.23%(45*(#.1."2 K90(+-./'40-.+'!MN

! G.*'%69+-49,$!55'4*)'39032'3,39*

! 678 #OOOE@PQ'30149-(.+

! C+)*(1'4)03*::0):'()*'/)064*5'-.+0'&+,"-.

(#)*$!!)#!

! %69+-E4)03*::0):')6.'-.'/9',&%"#:1;(5

! !'.61B*)'0K'169+-E4)03*::0):'K0)1'('/$0-*$

%69+-EJ)03*::0)

<(3.1;(*1!"#$%&

'()"*+

!

/;*($)&0*"#(11"*

/=$*(>&'()"*+

?%"@$%&'()"*+

A"21;$2;&'()"*+

8(B;C*(&'()"*+

/;*($)&0*"#(11"*1&=$-(&$##(11&;"D

'()"*+&8+5( E##(11 /=$*.23

R*/-:+*): R*(5$S)-+* J)-I(+*

M03(9'%*10), R*(5$S)-+* J)-I(+*

C;()*5'%*10), R*(5$S)-+* %69+-EJ)03*::0)

T90B(9'%*10), R*(5$S)-+* &*I-3*

80.:+(.+'%*10), R*(5 &*I-3*

"*U+6)*'%*10), R*(5 &*I-3*

Language

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DEFD/$$0

G

! !"#$%&"'()*%)(%(+,-#)./-(.'(#/01.$"2()/(%-2(

"3"#,)"'(/-()*"(*/')

! 4%$$%5$"(/-$6(+&/0(%-/)*"&()*"(*/')

! 7,-#)./-'(8.)*/,)(%-6(49!:(2"#$'1"# %&"(

*/')(56(2"+%,$)

! 4%-(,'"(!!"#$%!! %-2(!!&'()*'!!+

)/;")*"&

! !"#$%&"'()*%)(%(+,-#)./-(.'(#/01.$"2()/(%-2(

"3"#,)"'(/-()*"(2"<.#"

! 4%$$%5$"(+&/0()*"(*/')

! 9'"2(%'()*"("-)&6(1/.-)(+&/0(*/')()/(2"<.#"

! 49!:(1&/<.2"'(%('")(/+(5,.$)=.-(<"#)/&()61"'>

! *",-./+0*",-./+*",-1/+0*",-1/+*",-2/+0*",-2/+*",-3/+0*",-3/+

! $"#-%./+0$"#-%./+$"#-%1/+0$"#-%1/+$"#-%2/+0$"#-%2/+$"#-%3/+0$"#-%3/

! )4%./+0)4%./+)4%1/+0)4%1/+)4%2/+0)4%2/+)4%3/+0)4%3/+

! 5#46./+05#46./+5#461/+05#461/+5#462/+05#462/+5#463/+05#463/+

! 75#,%./+75#,%1/+75#,%2/+75#,%3+

! 4%-(#/-')&,#)(%(<"#)/&()61"(8.)*('1"#.%$(

+,-#)./->

8,9'!!"#$%&'(%):(;/+(.!"#$

! 4%-(%##"''("$"0"-)'(/+(%(<"#)/&()61"(8.)*(

!"#$%&!"'$%&!"($%&!")$*

('*(,-<=

! &)82 .'(%('1"#.%$(<"#)/&()61"

! ?%0"(%'(0)4%2@("3#"1)(#%-(5"(#/-')&,#)"2(

+&/0(%('#%$%&()/(+/&0(%(<"#)/&>

:$*,5,-/+./+.>

! 49!:(1&/<.2"'(+/,&(;$/5%$@(5,.$)=.-(<%&.%5$"'

! %"-',&?&=@(@5#*9?&=@(@5#*9A)8@(

6-)&A)8

! +',-.&/0&/&1&)822&34&10)4%22&

! :##"''.5$"(/-$6(+&/0(2"<.#"(#/2"

! 4%--/)()%A"(%22&"''

! 4%--/)(%''.;-(<%$,"

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

#

! !"#$!%&'()*'+),-./'+0'1(2*'('3014*+-./'

4)0563+7''890:*'"0'+;*'%*+(9

! <-):+')*9*(:*'=>?$>@A'B01B*5

! C*30.5')*9*(:*'-.'D?$>@')*EF)-++*.

! G4*.'C06)3*

! H0+',*+'('I-(B9*':096+-0.

&*I-3*

%69+-EJ)03*::0) %69+-EJ)03*::0)

!

!"#$%&'()"*+ !"#$%&'()"*+

,(-.#(&'()"*+

/0 /0

/0 /0

/0 /0

! !

/0 /0

/0 /0

/0 /0

! !

%69+-EJ)03*::0)

!"#$%&'()"*+

/0 /0

/0 /0

/0 /0

! !

! ";*'K6.5(1*.+(9'6.-+'-:'+;*'!"#$%&'(#)*$!!)#

! !':3(9()L'1.23%(45*(#.1."2 K90(+-./'40-.+'!MN

! G.*'%69+-49,$!55'4*)'39032'3,39*

! 678 #OOOE@PQ'30149-(.+

! C+)*(1'4)03*::0):'()*'/)064*5'-.+0'&+,"-.

(#)*$!!)#!

! %69+-E4)03*::0):')6.'-.'/9',&%"#:1;(5

! !'.61B*)'0K'169+-E4)03*::0):'K0)1'('/$0-*$

%69+-EJ)03*::0)

<(3.1;(*1!"#$%&

'()"*+

!

/;*($)&0*"#(11"*

/=$*(>&'()"*+

?%"@$%&'()"*+

A"21;$2;&'()"*+

8(B;C*(&'()"*+

/;*($)&0*"#(11"*1&=$-(&$##(11&;"D

'()"*+&8+5( E##(11 /=$*.23

R*/-:+*): R*(5$S)-+* J)-I(+*

M03(9'%*10), R*(5$S)-+* J)-I(+*

C;()*5'%*10), R*(5$S)-+* %69+-EJ)03*::0)

T90B(9'%*10), R*(5$S)-+* &*I-3*

80.:+(.+'%*10), R*(5 &*I-3*

"*U+6)*'%*10), R*(5 &*I-3*

Language

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DEFD/$$0

G

! !"#$%&"'()*%)(%(+,-#)./-(.'(#/01.$"2()/(%-2(

"3"#,)"'(/-()*"(*/')

! 4%$$%5$"(/-$6(+&/0(%-/)*"&()*"(*/')

! 7,-#)./-'(8.)*/,)(%-6(49!:(2"#$'1"# %&"(

*/')(56(2"+%,$)

! 4%-(,'"(!!"#$%!! %-2(!!&'()*'!!+

)/;")*"&

! !"#$%&"'()*%)(%(+,-#)./-(.'(#/01.$"2()/(%-2(

"3"#,)"'(/-()*"(2"<.#"

! 4%$$%5$"(+&/0()*"(*/')

! 9'"2(%'()*"("-)&6(1/.-)(+&/0(*/')()/(2"<.#"

! 49!:(1&/<.2"'(%('")(/+(5,.$)=.-(<"#)/&()61"'>

! *",-./+0*",-./+*",-1/+0*",-1/+*",-2/+0*",-2/+*",-3/+0*",-3/+

! $"#-%./+0$"#-%./+$"#-%1/+0$"#-%1/+$"#-%2/+0$"#-%2/+$"#-%3/+0$"#-%3/

! )4%./+0)4%./+)4%1/+0)4%1/+)4%2/+0)4%2/+)4%3/+0)4%3/+

! 5#46./+05#46./+5#461/+05#461/+5#462/+05#462/+5#463/+05#463/+

! 75#,%./+75#,%1/+75#,%2/+75#,%3+

! 4%-(#/-')&,#)(%(<"#)/&()61"(8.)*('1"#.%$(

+,-#)./->

8,9'!!"#$%&'(%):(;/+(.!"#$

! 4%-(%##"''("$"0"-)'(/+(%(<"#)/&()61"(8.)*(

!"#$%&!"'$%&!"($%&!")$*

('*(,-<=

! &)82 .'(%('1"#.%$(<"#)/&()61"

! ?%0"(%'(0)4%2@("3#"1)(#%-(5"(#/-')&,#)"2(

+&/0(%('#%$%&()/(+/&0(%(<"#)/&>

:$*,5,-/+./+.>

! 49!:(1&/<.2"'(+/,&(;$/5%$@(5,.$)=.-(<%&.%5$"'

! %"-',&?&=@(@5#*9?&=@(@5#*9A)8@(

6-)&A)8

! +',-.&/0&/&1&)822&34&10)4%22&

! :##"''.5$"(/-$6(+&/0(2"<.#"(#/2"

! 4%--/)()%A"(%22&"''

! 4%--/)(%''.;-(<%$,"

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

#

! !"#$!%&'()*'+),-./'+0'1(2*'('3014*+-./'

4)0563+7''890:*'"0'+;*'%*+(9

! <-):+')*9*(:*'=>?$>@A'B01B*5

! C*30.5')*9*(:*'-.'D?$>@')*EF)-++*.

! G4*.'C06)3*

! H0+',*+'('I-(B9*':096+-0.

&*I-3*

%69+-EJ)03*::0) %69+-EJ)03*::0)

!

!"#$%&'()"*+ !"#$%&'()"*+

,(-.#(&'()"*+

/0 /0

/0 /0

/0 /0

! !

/0 /0

/0 /0

/0 /0

! !

%69+-EJ)03*::0)

!"#$%&'()"*+

/0 /0

/0 /0

/0 /0

! !

! ";*'K6.5(1*.+(9'6.-+'-:'+;*'!"#$%&'(#)*$!!)#

! !':3(9()L'1.23%(45*(#.1."2 K90(+-./'40-.+'!MN

! G.*'%69+-49,$!55'4*)'39032'3,39*

! 678 #OOOE@PQ'30149-(.+

! C+)*(1'4)03*::0):'()*'/)064*5'-.+0'&+,"-.

(#)*$!!)#!

! %69+-E4)03*::0):')6.'-.'/9',&%"#:1;(5

! !'.61B*)'0K'169+-E4)03*::0):'K0)1'('/$0-*$

%69+-EJ)03*::0)

<(3.1;(*1!"#$%&

'()"*+

!

/;*($)&0*"#(11"*

/=$*(>&'()"*+

?%"@$%&'()"*+

A"21;$2;&'()"*+

8(B;C*(&'()"*+

/;*($)&0*"#(11"*1&=$-(&$##(11&;"D

'()"*+&8+5( E##(11 /=$*.23

R*/-:+*): R*(5$S)-+* J)-I(+*

M03(9'%*10), R*(5$S)-+* J)-I(+*

C;()*5'%*10), R*(5$S)-+* %69+-EJ)03*::0)

T90B(9'%*10), R*(5$S)-+* &*I-3*

80.:+(.+'%*10), R*(5 &*I-3*

"*U+6)*'%*10), R*(5 &*I-3*

Language

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DEFD/$$0

G

! !"#$%&"'()*%)(%(+,-#)./-(.'(#/01.$"2()/(%-2(

"3"#,)"'(/-()*"(*/')

! 4%$$%5$"(/-$6(+&/0(%-/)*"&()*"(*/')

! 7,-#)./-'(8.)*/,)(%-6(49!:(2"#$'1"# %&"(

*/')(56(2"+%,$)

! 4%-(,'"(!!"#$%!! %-2(!!&'()*'!!+

)/;")*"&

! !"#$%&"'()*%)(%(+,-#)./-(.'(#/01.$"2()/(%-2(

"3"#,)"'(/-()*"(2"<.#"

! 4%$$%5$"(+&/0()*"(*/')

! 9'"2(%'()*"("-)&6(1/.-)(+&/0(*/')()/(2"<.#"

! 49!:(1&/<.2"'(%('")(/+(5,.$)=.-(<"#)/&()61"'>

! *",-./+0*",-./+*",-1/+0*",-1/+*",-2/+0*",-2/+*",-3/+0*",-3/+

! $"#-%./+0$"#-%./+$"#-%1/+0$"#-%1/+$"#-%2/+0$"#-%2/+$"#-%3/+0$"#-%3/

! )4%./+0)4%./+)4%1/+0)4%1/+)4%2/+0)4%2/+)4%3/+0)4%3/+

! 5#46./+05#46./+5#461/+05#461/+5#462/+05#462/+5#463/+05#463/+

! 75#,%./+75#,%1/+75#,%2/+75#,%3+

! 4%-(#/-')&,#)(%(<"#)/&()61"(8.)*('1"#.%$(

+,-#)./->

8,9'!!"#$%&'(%):(;/+(.!"#$

! 4%-(%##"''("$"0"-)'(/+(%(<"#)/&()61"(8.)*(

!"#$%&!"'$%&!"($%&!")$*

('*(,-<=

! &)82 .'(%('1"#.%$(<"#)/&()61"

! ?%0"(%'(0)4%2@("3#"1)(#%-(5"(#/-')&,#)"2(

+&/0(%('#%$%&()/(+/&0(%(<"#)/&>

:$*,5,-/+./+.>

! 49!:(1&/<.2"'(+/,&(;$/5%$@(5,.$)=.-(<%&.%5$"'

! %"-',&?&=@(@5#*9?&=@(@5#*9A)8@(

6-)&A)8

! +',-.&/0&/&1&)822&34&10)4%22&

! :##"''.5$"(/-$6(+&/0(2"<.#"(#/2"

! 4%--/)()%A"(%22&"''

! 4%--/)(%''.;-(<%$,"!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

#

! !"#$!%&'()*'+),-./'+0'1(2*'('3014*+-./'

4)0563+7''890:*'"0'+;*'%*+(9

! <-):+')*9*(:*'=>?$>@A'B01B*5

! C*30.5')*9*(:*'-.'D?$>@')*EF)-++*.

! G4*.'C06)3*

! H0+',*+'('I-(B9*':096+-0.

&*I-3*

%69+-EJ)03*::0) %69+-EJ)03*::0)

!

!"#$%&'()"*+ !"#$%&'()"*+

,(-.#(&'()"*+

/0 /0

/0 /0

/0 /0

! !

/0 /0

/0 /0

/0 /0

! !

%69+-EJ)03*::0)

!"#$%&'()"*+

/0 /0

/0 /0

/0 /0

! !

! ";*'K6.5(1*.+(9'6.-+'-:'+;*'!"#$%&'(#)*$!!)#

! !':3(9()L'1.23%(45*(#.1."2 K90(+-./'40-.+'!MN

! G.*'%69+-49,$!55'4*)'39032'3,39*

! 678 #OOOE@PQ'30149-(.+

! C+)*(1'4)03*::0):'()*'/)064*5'-.+0'&+,"-.

(#)*$!!)#!

! %69+-E4)03*::0):')6.'-.'/9',&%"#:1;(5

! !'.61B*)'0K'169+-E4)03*::0):'K0)1'('/$0-*$

%69+-EJ)03*::0)

<(3.1;(*1!"#$%&

'()"*+

!

/;*($)&0*"#(11"*

/=$*(>&'()"*+

?%"@$%&'()"*+

A"21;$2;&'()"*+

8(B;C*(&'()"*+

/;*($)&0*"#(11"*1&=$-(&$##(11&;"D

'()"*+&8+5( E##(11 /=$*.23

R*/-:+*): R*(5$S)-+* J)-I(+*

M03(9'%*10), R*(5$S)-+* J)-I(+*

C;()*5'%*10), R*(5$S)-+* %69+-EJ)03*::0)

T90B(9'%*10), R*(5$S)-+* &*I-3*

80.:+(.+'%*10), R*(5 &*I-3*

"*U+6)*'%*10), R*(5 &*I-3*

Language

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DEFD/$$0

G

! !"#$%&"'()*%)(%(+,-#)./-(.'(#/01.$"2()/(%-2(

"3"#,)"'(/-()*"(*/')

! 4%$$%5$"(/-$6(+&/0(%-/)*"&()*"(*/')

! 7,-#)./-'(8.)*/,)(%-6(49!:(2"#$'1"# %&"(

*/')(56(2"+%,$)

! 4%-(,'"(!!"#$%!! %-2(!!&'()*'!!+

)/;")*"&

! !"#$%&"'()*%)(%(+,-#)./-(.'(#/01.$"2()/(%-2(

"3"#,)"'(/-()*"(2"<.#"

! 4%$$%5$"(+&/0()*"(*/')

! 9'"2(%'()*"("-)&6(1/.-)(+&/0(*/')()/(2"<.#"

! 49!:(1&/<.2"'(%('")(/+(5,.$)=.-(<"#)/&()61"'>

! *",-./+0*",-./+*",-1/+0*",-1/+*",-2/+0*",-2/+*",-3/+0*",-3/+

! $"#-%./+0$"#-%./+$"#-%1/+0$"#-%1/+$"#-%2/+0$"#-%2/+$"#-%3/+0$"#-%3/

! )4%./+0)4%./+)4%1/+0)4%1/+)4%2/+0)4%2/+)4%3/+0)4%3/+

! 5#46./+05#46./+5#461/+05#461/+5#462/+05#462/+5#463/+05#463/+

! 75#,%./+75#,%1/+75#,%2/+75#,%3+

! 4%-(#/-')&,#)(%(<"#)/&()61"(8.)*('1"#.%$(

+,-#)./->

8,9'!!"#$%&'(%):(;/+(.!"#$

! 4%-(%##"''("$"0"-)'(/+(%(<"#)/&()61"(8.)*(

!"#$%&!"'$%&!"($%&!")$*

('*(,-<=

! &)82 .'(%('1"#.%$(<"#)/&()61"

! ?%0"(%'(0)4%2@("3#"1)(#%-(5"(#/-')&,#)"2(

+&/0(%('#%$%&()/(+/&0(%(<"#)/&>

:$*,5,-/+./+.>

! 49!:(1&/<.2"'(+/,&(;$/5%$@(5,.$)=.-(<%&.%5$"'

! %"-',&?&=@(@5#*9?&=@(@5#*9A)8@(

6-)&A)8

! +',-.&/0&/&1&)822&34&10)4%22&

! :##"''.5$"(/-$6(+&/0(2"<.#"(#/2"

! 4%--/)()%A"(%22&"''

! 4%--/)(%''.;-(<%$,"!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

#

! !"#$!%&'()*'+),-./'+0'1(2*'('3014*+-./'

4)0563+7''890:*'"0'+;*'%*+(9

! <-):+')*9*(:*'=>?$>@A'B01B*5

! C*30.5')*9*(:*'-.'D?$>@')*EF)-++*.

! G4*.'C06)3*

! H0+',*+'('I-(B9*':096+-0.

&*I-3*

%69+-EJ)03*::0) %69+-EJ)03*::0)

!

!"#$%&'()"*+ !"#$%&'()"*+

,(-.#(&'()"*+

/0 /0

/0 /0

/0 /0

! !

/0 /0

/0 /0

/0 /0

! !

%69+-EJ)03*::0)

!"#$%&'()"*+

/0 /0

/0 /0

/0 /0

! !

! ";*'K6.5(1*.+(9'6.-+'-:'+;*'!"#$%&'(#)*$!!)#

! !':3(9()L'1.23%(45*(#.1."2 K90(+-./'40-.+'!MN

! G.*'%69+-49,$!55'4*)'39032'3,39*

! 678 #OOOE@PQ'30149-(.+

! C+)*(1'4)03*::0):'()*'/)064*5'-.+0'&+,"-.

(#)*$!!)#!

! %69+-E4)03*::0):')6.'-.'/9',&%"#:1;(5

! !'.61B*)'0K'169+-E4)03*::0):'K0)1'('/$0-*$

%69+-EJ)03*::0)

<(3.1;(*1!"#$%&

'()"*+

!

/;*($)&0*"#(11"*

/=$*(>&'()"*+

?%"@$%&'()"*+

A"21;$2;&'()"*+

8(B;C*(&'()"*+

/;*($)&0*"#(11"*1&=$-(&$##(11&;"D

'()"*+&8+5( E##(11 /=$*.23

R*/-:+*): R*(5$S)-+* J)-I(+*

M03(9'%*10), R*(5$S)-+* J)-I(+*

C;()*5'%*10), R*(5$S)-+* %69+-EJ)03*::0)

T90B(9'%*10), R*(5$S)-+* &*I-3*

80.:+(.+'%*10), R*(5 &*I-3*

"*U+6)*'%*10), R*(5 &*I-3*

Language

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DEFD/$$0

#

! !"#$%&'()*+,-%-./0120*2%-341'%0(%513/26%06,%

,7,230*(/%(8%9,'/,5-

!"#$%%%&'()*(+,-./0$1*(+!!!"#$%&'()*+,-./! !"#$ *-%1%%%&'()*'%%+83/20*(/

!"#$%%%&'()*(+,-./0$1*(+!!!"#$%&'()*+,-./

! ,-./0.1 !"#$#%/.12&#'()*+#*,)-*""!./#0!1!/0#

06,%-*:,%(8%06,%4'*+%;*<,<%&'(=5,>%+(>1*/?

!"#$%%%&'()*(+,-./0$1*(+!!!"#$%&'()*+,-./

! 3'($40.1 !"#$#%/.12&#'()*+#*,)-*""!./#0!1!/0#

06,%-*:,%(8%1%06',1+%=5(29

!"#$%%%&'()*(+,-./0$1*(+!!!"#$%&'()*+,-./

! @6,%2(>&*5,'%03'/-%06*-%0.&,%(8%-010,>,/0%

*/0(%1%=5(29%(8%2(+,%0610%2(/8*43',-A%1/+%

513/26,-%06,%9,'/,5

!"#$%%%&'()*(+,-./0$1*(+!!!"#$%&'()*+,-./ ! !"#$%+,8*/,-%1%51/4314,%0610%*-%-*>*51'%0(%

!B!CC

! D>&('01/0%#*88,',/2,-E

! F3/0*>,%G*='1'.

! H3/20*(/-

! !51--,-A%I0'320-A%"/*(/-

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

#

! !"#$!%&'()*'+),-./'+0'1(2*'('3014*+-./'

4)0563+7''890:*'"0'+;*'%*+(9

! <-):+')*9*(:*'=>?$>@A'B01B*5

! C*30.5')*9*(:*'-.'D?$>@')*EF)-++*.

! G4*.'C06)3*

! H0+',*+'('I-(B9*':096+-0.

&*I-3*

%69+-EJ)03*::0) %69+-EJ)03*::0)

!

!"#$%&'()"*+ !"#$%&'()"*+

,(-.#(&'()"*+

/0 /0

/0 /0

/0 /0

! !

/0 /0

/0 /0

/0 /0

! !

%69+-EJ)03*::0)

!"#$%&'()"*+

/0 /0

/0 /0

/0 /0

! !

! ";*'K6.5(1*.+(9'6.-+'-:'+;*'!"#$%&'(#)*$!!)#

! !':3(9()L'1.23%(45*(#.1."2 K90(+-./'40-.+'!MN

! G.*'%69+-49,$!55'4*)'39032'3,39*

! 678 #OOOE@PQ'30149-(.+

! C+)*(1'4)03*::0):'()*'/)064*5'-.+0'&+,"-.

(#)*$!!)#!

! %69+-E4)03*::0):')6.'-.'/9',&%"#:1;(5

! !'.61B*)'0K'169+-E4)03*::0):'K0)1'('/$0-*$

%69+-EJ)03*::0)

<(3.1;(*1!"#$%&

'()"*+

!

/;*($)&0*"#(11"*

/=$*(>&'()"*+

?%"@$%&'()"*+

A"21;$2;&'()"*+

8(B;C*(&'()"*+

/;*($)&0*"#(11"*1&=$-(&$##(11&;"D

'()"*+&8+5( E##(11 /=$*.23

R*/-:+*): R*(5$S)-+* J)-I(+*

M03(9'%*10), R*(5$S)-+* J)-I(+*

C;()*5'%*10), R*(5$S)-+* %69+-EJ)03*::0)

T90B(9'%*10), R*(5$S)-+* &*I-3*

80.:+(.+'%*10), R*(5 &*I-3*

"*U+6)*'%*10), R*(5 &*I-3*

Language

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DEFD/$$0

#

! !"#$%&'()*+,-%-./0120*2%-341'%0(%513/26%06,%

,7,230*(/%(8%9,'/,5-

!"#$%%%&'()*(+,-./0$1*(+!!!"#$%&'()*+,-./! !"#$ *-%1%%%&'()*'%%+83/20*(/

!"#$%%%&'()*(+,-./0$1*(+!!!"#$%&'()*+,-./

! ,-./0.1 !"#$#%/.12&#'()*+#*,)-*""!./#0!1!/0#

06,%-*:,%(8%06,%4'*+%;*<,<%&'(=5,>%+(>1*/?

!"#$%%%&'()*(+,-./0$1*(+!!!"#$%&'()*+,-./

! 3'($40.1 !"#$#%/.12&#'()*+#*,)-*""!./#0!1!/0#

06,%-*:,%(8%1%06',1+%=5(29

!"#$%%%&'()*(+,-./0$1*(+!!!"#$%&'()*+,-./

! @6,%2(>&*5,'%03'/-%06*-%0.&,%(8%-010,>,/0%

*/0(%1%=5(29%(8%2(+,%0610%2(/8*43',-A%1/+%

513/26,-%06,%9,'/,5

!"#$%%%&'()*(+,-./0$1*(+!!!"#$%&'()*+,-./ ! !"#$%+,8*/,-%1%51/4314,%0610%*-%-*>*51'%0(%

!B!CC

! D>&('01/0%#*88,',/2,-E

! F3/0*>,%G*='1'.

! H3/20*(/-

! !51--,-A%I0'320-A%"/*(/-

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DEFD/$$0

#

! !"#$%&'()*+,-%-./0120*2%-341'%0(%513/26%06,%

,7,230*(/%(8%9,'/,5-

!"#$%%%&'()*(+,-./0$1*(+!!!"#$%&'()*+,-./! !"#$ *-%1%%%&'()*'%%+83/20*(/

!"#$%%%&'()*(+,-./0$1*(+!!!"#$%&'()*+,-./

! ,-./0.1 !"#$#%/.12&#'()*+#*,)-*""!./#0!1!/0#

06,%-*:,%(8%06,%4'*+%;*<,<%&'(=5,>%+(>1*/?

!"#$%%%&'()*(+,-./0$1*(+!!!"#$%&'()*+,-./

! 3'($40.1 !"#$#%/.12&#'()*+#*,)-*""!./#0!1!/0#

06,%-*:,%(8%1%06',1+%=5(29

!"#$%%%&'()*(+,-./0$1*(+!!!"#$%&'()*+,-./

! @6,%2(>&*5,'%03'/-%06*-%0.&,%(8%-010,>,/0%

*/0(%1%=5(29%(8%2(+,%0610%2(/8*43',-A%1/+%

513/26,-%06,%9,'/,5

!"#$%%%&'()*(+,-./0$1*(+!!!"#$%&'()*+,-./ ! !"#$%+,8*/,-%1%51/4314,%0610%*-%-*>*51'%0(%

!B!CC

! D>&('01/0%#*88,',/2,-E

! F3/0*>,%G*='1'.

! H3/20*(/-

! !51--,-A%I0'320-A%"/*(/-

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DEFD/$$0

#

! !"#$%&'()*+,-%-./0120*2%-341'%0(%513/26%06,%

,7,230*(/%(8%9,'/,5-

!"#$%%%&'()*(+,-./0$1*(+!!!"#$%&'()*+,-./! !"#$ *-%1%%%&'()*'%%+83/20*(/

!"#$%%%&'()*(+,-./0$1*(+!!!"#$%&'()*+,-./

! ,-./0.1 !"#$#%/.12&#'()*+#*,)-*""!./#0!1!/0#

06,%-*:,%(8%06,%4'*+%;*<,<%&'(=5,>%+(>1*/?

!"#$%%%&'()*(+,-./0$1*(+!!!"#$%&'()*+,-./

! 3'($40.1 !"#$#%/.12&#'()*+#*,)-*""!./#0!1!/0#

06,%-*:,%(8%1%06',1+%=5(29

!"#$%%%&'()*(+,-./0$1*(+!!!"#$%&'()*+,-./

! @6,%2(>&*5,'%03'/-%06*-%0.&,%(8%-010,>,/0%

*/0(%1%=5(29%(8%2(+,%0610%2(/8*43',-A%1/+%

513/26,-%06,%9,'/,5

!"#$%%%&'()*(+,-./0$1*(+!!!"#$%&'()*+,-./ ! !"#$%+,8*/,-%1%51/4314,%0610%*-%-*>*51'%0(%

!B!CC

! D>&('01/0%#*88,',/2,-E

! F3/0*>,%G*='1'.

! H3/20*(/-

! !51--,-A%I0'320-A%"/*(/-

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

#

! !"#$!%&'()*'+),-./'+0'1(2*'('3014*+-./'

4)0563+7''890:*'"0'+;*'%*+(9

! <-):+')*9*(:*'=>?$>@A'B01B*5

! C*30.5')*9*(:*'-.'D?$>@')*EF)-++*.

! G4*.'C06)3*

! H0+',*+'('I-(B9*':096+-0.

&*I-3*

%69+-EJ)03*::0) %69+-EJ)03*::0)

!

!"#$%&'()"*+ !"#$%&'()"*+

,(-.#(&'()"*+

/0 /0

/0 /0

/0 /0

! !

/0 /0

/0 /0

/0 /0

! !

%69+-EJ)03*::0)

!"#$%&'()"*+

/0 /0

/0 /0

/0 /0

! !

! ";*'K6.5(1*.+(9'6.-+'-:'+;*'!"#$%&'(#)*$!!)#

! !':3(9()L'1.23%(45*(#.1."2 K90(+-./'40-.+'!MN

! G.*'%69+-49,$!55'4*)'39032'3,39*

! 678 #OOOE@PQ'30149-(.+

! C+)*(1'4)03*::0):'()*'/)064*5'-.+0'&+,"-.

(#)*$!!)#!

! %69+-E4)03*::0):')6.'-.'/9',&%"#:1;(5

! !'.61B*)'0K'169+-E4)03*::0):'K0)1'('/$0-*$

%69+-EJ)03*::0)

<(3.1;(*1!"#$%&

'()"*+

!

/;*($)&0*"#(11"*

/=$*(>&'()"*+

?%"@$%&'()"*+

A"21;$2;&'()"*+

8(B;C*(&'()"*+

/;*($)&0*"#(11"*1&=$-(&$##(11&;"D

'()"*+&8+5( E##(11 /=$*.23

R*/-:+*): R*(5$S)-+* J)-I(+*

M03(9'%*10), R*(5$S)-+* J)-I(+*

C;()*5'%*10), R*(5$S)-+* %69+-EJ)03*::0)

T90B(9'%*10), R*(5$S)-+* &*I-3*

80.:+(.+'%*10), R*(5 &*I-3*

"*U+6)*'%*10), R*(5 &*I-3*

Language

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DEFD/$$0

'

! !"#$%&'(&%)*+,%"+%&'$%#$-./$%/(+0&%*,$%+")1(2%

!"!##$%&'()*+$,)-./.0$1&'2()3'4

! 53$!"#$%&6$&"'()6$*(++,-6$+(2

! 734($*/(8$1&'2()3'4$8/9+$:+9)2+$+;&)9/<+'(

! =8+.+$/.+$/$'&*-+.$31$:+9)2+$4>+2)1)2$

1&'2()3'4")'(.)'4)24 /9/)</-<+?

! ../0$-12"'()/

! ..*3+45

! (%,*#-6))6$(%,*#-7686$/(3*)27)'3%4

! =8+.+$)4$'3$*(++,- 3.$&"'' 1&'2()3'$(8/($2/'$

-+$2/<<+:$1.3*$:+9)2+$23:+

"@3A$2/'$A+$/<<32/(+$*+*3.0B

! =8+.+$)4$'3$*(++,- 3.$&"'' 1&'2()3'$(8/($2/'$

-+$2/<<+:$1.3*$:+9)2+$23:+

"@3A$2/'$A+$/<<32/(+$*+*3.0B

! C.3*$(8+$834(

! D4)'E$!DFG$HIH$/(3*)246$A.)(+$/$2&4(3*$/<<32/(3.

! J'$/$!DFG$:+9)2+6$(8+.+$)4$'3$4(/2K

! L0$:+1/&<(6$/<<$1&'2()3'$2/<<4$/.+$)'<)'+:

! !/'$&4+$!!"#$"%$"&!! (3$>.+9+'($M!DFG$HIHN

! G<<$<32/<$9/.)/-<+46$1&'2()3'$/.E&*+'(4$/.+$

4(3.+:$)'$.+E)4(+.4! '( 1&'2()3'$.+2&.4)3'

! 53$1&'2()3'$>3)'(+.4

! !DFG$4&>>3.(4$43*+$!##$1+/(&.+4$13.$:+9)2+$

23:+I$$OIE?

! =+*></(+$1&'2()3'4

! !</44+4$/.+$4&>>3.(+:$)'4):+$I2&$43&.2+6$-&($

*&4($-+$834($3'<0

! P(.&2(4"D')3'4$A3.K$3'$:+9)2+$23:+$/4$>+.$!

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

#

! !"#$!%&'()*'+),-./'+0'1(2*'('3014*+-./'

4)0563+7''890:*'"0'+;*'%*+(9

! <-):+')*9*(:*'=>?$>@A'B01B*5

! C*30.5')*9*(:*'-.'D?$>@')*EF)-++*.

! G4*.'C06)3*

! H0+',*+'('I-(B9*':096+-0.

&*I-3*

%69+-EJ)03*::0) %69+-EJ)03*::0)

!

!"#$%&'()"*+ !"#$%&'()"*+

,(-.#(&'()"*+

/0 /0

/0 /0

/0 /0

! !

/0 /0

/0 /0

/0 /0

! !

%69+-EJ)03*::0)

!"#$%&'()"*+

/0 /0

/0 /0

/0 /0

! !

! ";*'K6.5(1*.+(9'6.-+'-:'+;*'!"#$%&'(#)*$!!)#

! !':3(9()L'1.23%(45*(#.1."2 K90(+-./'40-.+'!MN

! G.*'%69+-49,$!55'4*)'39032'3,39*

! 678 #OOOE@PQ'30149-(.+

! C+)*(1'4)03*::0):'()*'/)064*5'-.+0'&+,"-.

(#)*$!!)#!

! %69+-E4)03*::0):')6.'-.'/9',&%"#:1;(5

! !'.61B*)'0K'169+-E4)03*::0):'K0)1'('/$0-*$

%69+-EJ)03*::0)

<(3.1;(*1!"#$%&

'()"*+

!

/;*($)&0*"#(11"*

/=$*(>&'()"*+

?%"@$%&'()"*+

A"21;$2;&'()"*+

8(B;C*(&'()"*+

/;*($)&0*"#(11"*1&=$-(&$##(11&;"D

'()"*+&8+5( E##(11 /=$*.23

R*/-:+*): R*(5$S)-+* J)-I(+*

M03(9'%*10), R*(5$S)-+* J)-I(+*

C;()*5'%*10), R*(5$S)-+* %69+-EJ)03*::0)

T90B(9'%*10), R*(5$S)-+* &*I-3*

80.:+(.+'%*10), R*(5 &*I-3*

"*U+6)*'%*10), R*(5 &*I-3*

Language

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DEFD/$$0

'

! !"#$%&'(&%)*+,%"+%&'$%#$-./$%/(+0&%*,$%+")1(2%

!"!##$%&'()*+$,)-./.0$1&'2()3'4

! 53$!"#$%&6$&"'()6$*(++,-6$+(2

! 734($*/(8$1&'2()3'4$8/9+$:+9)2+$+;&)9/<+'(

! =8+.+$/.+$/$'&*-+.$31$:+9)2+$4>+2)1)2$

1&'2()3'4")'(.)'4)24 /9/)</-<+?

! ../0$-12"'()/

! ..*3+45

! (%,*#-6))6$(%,*#-7686$/(3*)27)'3%4

! =8+.+$)4$'3$*(++,- 3.$&"'' 1&'2()3'$(8/($2/'$

-+$2/<<+:$1.3*$:+9)2+$23:+

"@3A$2/'$A+$/<<32/(+$*+*3.0B

! =8+.+$)4$'3$*(++,- 3.$&"'' 1&'2()3'$(8/($2/'$

-+$2/<<+:$1.3*$:+9)2+$23:+

"@3A$2/'$A+$/<<32/(+$*+*3.0B

! C.3*$(8+$834(

! D4)'E$!DFG$HIH$/(3*)246$A.)(+$/$2&4(3*$/<<32/(3.

! J'$/$!DFG$:+9)2+6$(8+.+$)4$'3$4(/2K

! L0$:+1/&<(6$/<<$1&'2()3'$2/<<4$/.+$)'<)'+:

! !/'$&4+$!!"#$"%$"&!! (3$>.+9+'($M!DFG$HIHN

! G<<$<32/<$9/.)/-<+46$1&'2()3'$/.E&*+'(4$/.+$

4(3.+:$)'$.+E)4(+.4! '( 1&'2()3'$.+2&.4)3'

! 53$1&'2()3'$>3)'(+.4

! !DFG$4&>>3.(4$43*+$!##$1+/(&.+4$13.$:+9)2+$

23:+I$$OIE?

! =+*></(+$1&'2()3'4

! !</44+4$/.+$4&>>3.(+:$)'4):+$I2&$43&.2+6$-&($

*&4($-+$834($3'<0

! P(.&2(4"D')3'4$A3.K$3'$:+9)2+$23:+$/4$>+.$!

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

#

! !"#$!%&'()*'+),-./'+0'1(2*'('3014*+-./'

4)0563+7''890:*'"0'+;*'%*+(9

! <-):+')*9*(:*'=>?$>@A'B01B*5

! C*30.5')*9*(:*'-.'D?$>@')*EF)-++*.

! G4*.'C06)3*

! H0+',*+'('I-(B9*':096+-0.

&*I-3*

%69+-EJ)03*::0) %69+-EJ)03*::0)

!

!"#$%&'()"*+ !"#$%&'()"*+

,(-.#(&'()"*+

/0 /0

/0 /0

/0 /0

! !

/0 /0

/0 /0

/0 /0

! !

%69+-EJ)03*::0)

!"#$%&'()"*+

/0 /0

/0 /0

/0 /0

! !

! ";*'K6.5(1*.+(9'6.-+'-:'+;*'!"#$%&'(#)*$!!)#

! !':3(9()L'1.23%(45*(#.1."2 K90(+-./'40-.+'!MN

! G.*'%69+-49,$!55'4*)'39032'3,39*

! 678 #OOOE@PQ'30149-(.+

! C+)*(1'4)03*::0):'()*'/)064*5'-.+0'&+,"-.

(#)*$!!)#!

! %69+-E4)03*::0):')6.'-.'/9',&%"#:1;(5

! !'.61B*)'0K'169+-E4)03*::0):'K0)1'('/$0-*$

%69+-EJ)03*::0)

<(3.1;(*1!"#$%&

'()"*+

!

/;*($)&0*"#(11"*

/=$*(>&'()"*+

?%"@$%&'()"*+

A"21;$2;&'()"*+

8(B;C*(&'()"*+

/;*($)&0*"#(11"*1&=$-(&$##(11&;"D

'()"*+&8+5( E##(11 /=$*.23

R*/-:+*): R*(5$S)-+* J)-I(+*

M03(9'%*10), R*(5$S)-+* J)-I(+*

C;()*5'%*10), R*(5$S)-+* %69+-EJ)03*::0)

T90B(9'%*10), R*(5$S)-+* &*I-3*

80.:+(.+'%*10), R*(5 &*I-3*

"*U+6)*'%*10), R*(5 &*I-3*

Language

!"#$%&'"(&)*+,-.#./"$0'"120342&"15"678

9):$0$;".<<&0=&>;"/8?8>@"AB3CC;"CDDB

16

Common Runtime Component:

Mathematical Functions• pow, sqrt, cbrt, hypot

• exp, exp2, expm1

• log, log2, log10, log1p

• sin, cos, tan, asin, acos, atan, atan2

• sinh, cosh, tanh, asinh, acosh, atanh

• ceil, floor, trunc, round

• Etc.

– When executed on the host, a given function uses

the C runtime implementation if available

– These functions are only supported for scalar types,

not vector types

Language

!"#$%&'"(&)*+,-.#./"$0'"120342&"15"678

9):$0$;".<<&0=&>;"/8?8>@"AB3CC;"CDDB

17

Device Runtime Component:

Mathematical Functions• Some mathematical functions (e.g. sin(x))

have a less accurate, but faster device-only version (e.g. __sin(x))

– __pow

– __log, __log2, __log10

– __exp

– __sin, __cos, __tan

Language

CUDA Compilation

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DEFD/$$0

0

! !"#$%&'()*+%,-.+&%+/0%-/%12*(3

! !"#$%&#'%'(&)'"*'+,-&.,'%#+'/"0$'."+,1+%$%

! !"(2&3,+'45'!"##

! !"## &0'6,%335'%'76%22,6'%6"8#+'%'("6,'

."(23,)'."(2&3%$&"#'26".,00

!"#$%

! 9"6(%3':.;':.22 0"86.,'*&3,0

! !<=>':.8'0"86.,'."+,'*&3,0

&$%#$%

! ?4@,.$1,),.8$%43,'."+,'*"6'/"0$! :.84&# ,),.8$%43,'."+,'*"6'$/,'+,-&.,

! A"6':.'%#+':.22 *&3,0;'#-.. &#-"B,0'$/,'#%$&-,'

!1!CC'."(2&3,6'*"6'$/,'050$,('D,EF'E..1.3G

! 4')%2*(%,-.+&5%-6%-&%7%.-66.+%8')+%*'89.-*76+0:

'($

'($

')#$'(

'( '*

'#%+ '($,-"

'*

.22

.8+%*, .22 3&#B,6

#-"2,#.. 2$)%0 .84&#

.22 3&#B,6'.%$,'(

! H"'0,,'$/,'0$,20'2,6*"6(,+'45'#-..;'80,'$/,'

//0121$" %#+'//344#5."((%#+'3&#,'"2$&"#0

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

#

! !"#$!%&'()*'+),-./'+0'1(2*'('3014*+-./'

4)0563+7''890:*'"0'+;*'%*+(9

! <-):+')*9*(:*'=>?$>@A'B01B*5

! C*30.5')*9*(:*'-.'D?$>@')*EF)-++*.

! G4*.'C06)3*

! H0+',*+'('I-(B9*':096+-0.

&*I-3*

%69+-EJ)03*::0) %69+-EJ)03*::0)

!

!"#$%&'()"*+ !"#$%&'()"*+

,(-.#(&'()"*+

/0 /0

/0 /0

/0 /0

! !

/0 /0

/0 /0

/0 /0

! !

%69+-EJ)03*::0)

!"#$%&'()"*+

/0 /0

/0 /0

/0 /0

! !

! ";*'K6.5(1*.+(9'6.-+'-:'+;*'!"#$%&'(#)*$!!)#

! !':3(9()L'1.23%(45*(#.1."2 K90(+-./'40-.+'!MN

! G.*'%69+-49,$!55'4*)'39032'3,39*

! 678 #OOOE@PQ'30149-(.+

! C+)*(1'4)03*::0):'()*'/)064*5'-.+0'&+,"-.

(#)*$!!)#!

! %69+-E4)03*::0):')6.'-.'/9',&%"#:1;(5

! !'.61B*)'0K'169+-E4)03*::0):'K0)1'('/$0-*$

%69+-EJ)03*::0)

<(3.1;(*1!"#$%&

'()"*+

!

/;*($)&0*"#(11"*

/=$*(>&'()"*+

?%"@$%&'()"*+

A"21;$2;&'()"*+

8(B;C*(&'()"*+

/;*($)&0*"#(11"*1&=$-(&$##(11&;"D

'()"*+&8+5( E##(11 /=$*.23

R*/-:+*): R*(5$S)-+* J)-I(+*

M03(9'%*10), R*(5$S)-+* J)-I(+*

C;()*5'%*10), R*(5$S)-+* %69+-EJ)03*::0)

T90B(9'%*10), R*(5$S)-+* &*I-3*

80.:+(.+'%*10), R*(5 &*I-3*

"*U+6)*'%*10), R*(5 &*I-3*

Compilation

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DEFD/$$0

0

! !"#$%&'()*+%,-.+&%+/0%-/%12*(3

! !"#$%&#'%'(&)'"*'+,-&.,'%#+'/"0$'."+,1+%$%

! !"(2&3,+'45'!"##

! !"## &0'6,%335'%'76%22,6'%6"8#+'%'("6,'

."(23,)'."(2&3%$&"#'26".,00

!"#$%

! 9"6(%3':.;':.22 0"86.,'*&3,0

! !<=>':.8'0"86.,'."+,'*&3,0

&$%#$%

! ?4@,.$1,),.8$%43,'."+,'*"6'/"0$! :.84&# ,),.8$%43,'."+,'*"6'$/,'+,-&.,

! A"6':.'%#+':.22 *&3,0;'#-.. &#-"B,0'$/,'#%$&-,'

!1!CC'."(2&3,6'*"6'$/,'050$,('D,EF'E..1.3G

! 4')%2*(%,-.+&5%-6%-&%7%.-66.+%8')+%*'89.-*76+0:

'($

'($

')#$'(

'( '*

'#%+ '($,-"

'*

.22

.8+%*, .22 3&#B,6

#-"2,#.. 2$)%0 .84&#

.22 3&#B,6'.%$,'(

! H"'0,,'$/,'0$,20'2,6*"6(,+'45'#-..;'80,'$/,'

//0121$" %#+'//344#5."((%#+'3&#,'"2$&"#0

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

#

! !"#$!%&'()*'+),-./'+0'1(2*'('3014*+-./'

4)0563+7''890:*'"0'+;*'%*+(9

! <-):+')*9*(:*'=>?$>@A'B01B*5

! C*30.5')*9*(:*'-.'D?$>@')*EF)-++*.

! G4*.'C06)3*

! H0+',*+'('I-(B9*':096+-0.

&*I-3*

%69+-EJ)03*::0) %69+-EJ)03*::0)

!

!"#$%&'()"*+ !"#$%&'()"*+

,(-.#(&'()"*+

/0 /0

/0 /0

/0 /0

! !

/0 /0

/0 /0

/0 /0

! !

%69+-EJ)03*::0)

!"#$%&'()"*+

/0 /0

/0 /0

/0 /0

! !

! ";*'K6.5(1*.+(9'6.-+'-:'+;*'!"#$%&'(#)*$!!)#

! !':3(9()L'1.23%(45*(#.1."2 K90(+-./'40-.+'!MN

! G.*'%69+-49,$!55'4*)'39032'3,39*

! 678 #OOOE@PQ'30149-(.+

! C+)*(1'4)03*::0):'()*'/)064*5'-.+0'&+,"-.

(#)*$!!)#!

! %69+-E4)03*::0):')6.'-.'/9',&%"#:1;(5

! !'.61B*)'0K'169+-E4)03*::0):'K0)1'('/$0-*$

%69+-EJ)03*::0)

<(3.1;(*1!"#$%&

'()"*+

!

/;*($)&0*"#(11"*

/=$*(>&'()"*+

?%"@$%&'()"*+

A"21;$2;&'()"*+

8(B;C*(&'()"*+

/;*($)&0*"#(11"*1&=$-(&$##(11&;"D

'()"*+&8+5( E##(11 /=$*.23

R*/-:+*): R*(5$S)-+* J)-I(+*

M03(9'%*10), R*(5$S)-+* J)-I(+*

C;()*5'%*10), R*(5$S)-+* %69+-EJ)03*::0)

T90B(9'%*10), R*(5$S)-+* &*I-3*

80.:+(.+'%*10), R*(5 &*I-3*

"*U+6)*'%*10), R*(5 &*I-3*

Compilation

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DEFD/$$0

0

! !"#$%&'()*+%,-.+&%+/0%-/%12*(3

! !"#$%&#'%'(&)'"*'+,-&.,'%#+'/"0$'."+,1+%$%

! !"(2&3,+'45'!"##

! !"## &0'6,%335'%'76%22,6'%6"8#+'%'("6,'

."(23,)'."(2&3%$&"#'26".,00

!"#$%

! 9"6(%3':.;':.22 0"86.,'*&3,0

! !<=>':.8'0"86.,'."+,'*&3,0

&$%#$%

! ?4@,.$1,),.8$%43,'."+,'*"6'/"0$! :.84&# ,),.8$%43,'."+,'*"6'$/,'+,-&.,

! A"6':.'%#+':.22 *&3,0;'#-.. &#-"B,0'$/,'#%$&-,'

!1!CC'."(2&3,6'*"6'$/,'050$,('D,EF'E..1.3G

! 4')%2*(%,-.+&5%-6%-&%7%.-66.+%8')+%*'89.-*76+0:

'($

'($

')#$'(

'( '*

'#%+ '($,-"

'*

.22

.8+%*, .22 3&#B,6

#-"2,#.. 2$)%0 .84&#

.22 3&#B,6'.%$,'(

! H"'0,,'$/,'0$,20'2,6*"6(,+'45'#-..;'80,'$/,'

//0121$" %#+'//344#5."((%#+'3&#,'"2$&"#0

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

#

! !"#$!%&'()*'+),-./'+0'1(2*'('3014*+-./'

4)0563+7''890:*'"0'+;*'%*+(9

! <-):+')*9*(:*'=>?$>@A'B01B*5

! C*30.5')*9*(:*'-.'D?$>@')*EF)-++*.

! G4*.'C06)3*

! H0+',*+'('I-(B9*':096+-0.

&*I-3*

%69+-EJ)03*::0) %69+-EJ)03*::0)

!

!"#$%&'()"*+ !"#$%&'()"*+

,(-.#(&'()"*+

/0 /0

/0 /0

/0 /0

! !

/0 /0

/0 /0

/0 /0

! !

%69+-EJ)03*::0)

!"#$%&'()"*+

/0 /0

/0 /0

/0 /0

! !

! ";*'K6.5(1*.+(9'6.-+'-:'+;*'!"#$%&'(#)*$!!)#

! !':3(9()L'1.23%(45*(#.1."2 K90(+-./'40-.+'!MN

! G.*'%69+-49,$!55'4*)'39032'3,39*

! 678 #OOOE@PQ'30149-(.+

! C+)*(1'4)03*::0):'()*'/)064*5'-.+0'&+,"-.

(#)*$!!)#!

! %69+-E4)03*::0):')6.'-.'/9',&%"#:1;(5

! !'.61B*)'0K'169+-E4)03*::0):'K0)1'('/$0-*$

%69+-EJ)03*::0)

<(3.1;(*1!"#$%&

'()"*+

!

/;*($)&0*"#(11"*

/=$*(>&'()"*+

?%"@$%&'()"*+

A"21;$2;&'()"*+

8(B;C*(&'()"*+

/;*($)&0*"#(11"*1&=$-(&$##(11&;"D

'()"*+&8+5( E##(11 /=$*.23

R*/-:+*): R*(5$S)-+* J)-I(+*

M03(9'%*10), R*(5$S)-+* J)-I(+*

C;()*5'%*10), R*(5$S)-+* %69+-EJ)03*::0)

T90B(9'%*10), R*(5$S)-+* &*I-3*

80.:+(.+'%*10), R*(5 &*I-3*

"*U+6)*'%*10), R*(5 &*I-3*

Compilation

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DEFD/$$0

0

! !"#$%&'()*+%,-.+&%+/0%-/%12*(3

! !"#$%&#'%'(&)'"*'+,-&.,'%#+'/"0$'."+,1+%$%

! !"(2&3,+'45'!"##

! !"## &0'6,%335'%'76%22,6'%6"8#+'%'("6,'

."(23,)'."(2&3%$&"#'26".,00

!"#$%

! 9"6(%3':.;':.22 0"86.,'*&3,0

! !<=>':.8'0"86.,'."+,'*&3,0

&$%#$%

! ?4@,.$1,),.8$%43,'."+,'*"6'/"0$! :.84&# ,),.8$%43,'."+,'*"6'$/,'+,-&.,

! A"6':.'%#+':.22 *&3,0;'#-.. &#-"B,0'$/,'#%$&-,'

!1!CC'."(2&3,6'*"6'$/,'050$,('D,EF'E..1.3G

! 4')%2*(%,-.+&5%-6%-&%7%.-66.+%8')+%*'89.-*76+0:

'($

'($

')#$'(

'( '*

'#%+ '($,-"

'*

.22

.8+%*, .22 3&#B,6

#-"2,#.. 2$)%0 .84&#

.22 3&#B,6'.%$,'(

! H"'0,,'$/,'0$,20'2,6*"6(,+'45'#-..;'80,'$/,'

//0121$" %#+'//344#5."((%#+'3&#,'"2$&"#0

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

#

! !"#$!%&'()*'+),-./'+0'1(2*'('3014*+-./'

4)0563+7''890:*'"0'+;*'%*+(9

! <-):+')*9*(:*'=>?$>@A'B01B*5

! C*30.5')*9*(:*'-.'D?$>@')*EF)-++*.

! G4*.'C06)3*

! H0+',*+'('I-(B9*':096+-0.

&*I-3*

%69+-EJ)03*::0) %69+-EJ)03*::0)

!

!"#$%&'()"*+ !"#$%&'()"*+

,(-.#(&'()"*+

/0 /0

/0 /0

/0 /0

! !

/0 /0

/0 /0

/0 /0

! !

%69+-EJ)03*::0)

!"#$%&'()"*+

/0 /0

/0 /0

/0 /0

! !

! ";*'K6.5(1*.+(9'6.-+'-:'+;*'!"#$%&'(#)*$!!)#

! !':3(9()L'1.23%(45*(#.1."2 K90(+-./'40-.+'!MN

! G.*'%69+-49,$!55'4*)'39032'3,39*

! 678 #OOOE@PQ'30149-(.+

! C+)*(1'4)03*::0):'()*'/)064*5'-.+0'&+,"-.

(#)*$!!)#!

! %69+-E4)03*::0):')6.'-.'/9',&%"#:1;(5

! !'.61B*)'0K'169+-E4)03*::0):'K0)1'('/$0-*$

%69+-EJ)03*::0)

<(3.1;(*1!"#$%&

'()"*+

!

/;*($)&0*"#(11"*

/=$*(>&'()"*+

?%"@$%&'()"*+

A"21;$2;&'()"*+

8(B;C*(&'()"*+

/;*($)&0*"#(11"*1&=$-(&$##(11&;"D

'()"*+&8+5( E##(11 /=$*.23

R*/-:+*): R*(5$S)-+* J)-I(+*

M03(9'%*10), R*(5$S)-+* J)-I(+*

C;()*5'%*10), R*(5$S)-+* %69+-EJ)03*::0)

T90B(9'%*10), R*(5$S)-+* &*I-3*

80.:+(.+'%*10), R*(5 &*I-3*

"*U+6)*'%*10), R*(5 &*I-3*

Compilation

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DEFD/$$0

0

! !"#$%&'()*+%,-.+&%+/0%-/%12*(3

! !"#$%&#'%'(&)'"*'+,-&.,'%#+'/"0$'."+,1+%$%

! !"(2&3,+'45'!"##

! !"## &0'6,%335'%'76%22,6'%6"8#+'%'("6,'

."(23,)'."(2&3%$&"#'26".,00

!"#$%

! 9"6(%3':.;':.22 0"86.,'*&3,0

! !<=>':.8'0"86.,'."+,'*&3,0

&$%#$%

! ?4@,.$1,),.8$%43,'."+,'*"6'/"0$! :.84&# ,),.8$%43,'."+,'*"6'$/,'+,-&.,

! A"6':.'%#+':.22 *&3,0;'#-.. &#-"B,0'$/,'#%$&-,'

!1!CC'."(2&3,6'*"6'$/,'050$,('D,EF'E..1.3G

! 4')%2*(%,-.+&5%-6%-&%7%.-66.+%8')+%*'89.-*76+0:

'($

'($

')#$'(

'( '*

'#%+ '($,-"

'*

.22

.8+%*, .22 3&#B,6

#-"2,#.. 2$)%0 .84&#

.22 3&#B,6'.%$,'(

! H"'0,,'$/,'0$,20'2,6*"6(,+'45'#-..;'80,'$/,'

//0121$" %#+'//344#5."((%#+'3&#,'"2$&"#0

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

#

! !"#$!%&'()*'+),-./'+0'1(2*'('3014*+-./'

4)0563+7''890:*'"0'+;*'%*+(9

! <-):+')*9*(:*'=>?$>@A'B01B*5

! C*30.5')*9*(:*'-.'D?$>@')*EF)-++*.

! G4*.'C06)3*

! H0+',*+'('I-(B9*':096+-0.

&*I-3*

%69+-EJ)03*::0) %69+-EJ)03*::0)

!

!"#$%&'()"*+ !"#$%&'()"*+

,(-.#(&'()"*+

/0 /0

/0 /0

/0 /0

! !

/0 /0

/0 /0

/0 /0

! !

%69+-EJ)03*::0)

!"#$%&'()"*+

/0 /0

/0 /0

/0 /0

! !

! ";*'K6.5(1*.+(9'6.-+'-:'+;*'!"#$%&'(#)*$!!)#

! !':3(9()L'1.23%(45*(#.1."2 K90(+-./'40-.+'!MN

! G.*'%69+-49,$!55'4*)'39032'3,39*

! 678 #OOOE@PQ'30149-(.+

! C+)*(1'4)03*::0):'()*'/)064*5'-.+0'&+,"-.

(#)*$!!)#!

! %69+-E4)03*::0):')6.'-.'/9',&%"#:1;(5

! !'.61B*)'0K'169+-E4)03*::0):'K0)1'('/$0-*$

%69+-EJ)03*::0)

<(3.1;(*1!"#$%&

'()"*+

!

/;*($)&0*"#(11"*

/=$*(>&'()"*+

?%"@$%&'()"*+

A"21;$2;&'()"*+

8(B;C*(&'()"*+

/;*($)&0*"#(11"*1&=$-(&$##(11&;"D

'()"*+&8+5( E##(11 /=$*.23

R*/-:+*): R*(5$S)-+* J)-I(+*

M03(9'%*10), R*(5$S)-+* J)-I(+*

C;()*5'%*10), R*(5$S)-+* %69+-EJ)03*::0)

T90B(9'%*10), R*(5$S)-+* &*I-3*

80.:+(.+'%*10), R*(5 &*I-3*

"*U+6)*'%*10), R*(5 &*I-3*

Compilation

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DEFD/$$0

F

! !"#$%&$'$()*+%, -%,./0$#%12$12/$3/&1$"4$12/$

53"63'78

! 9',$+/:

! ;"'0/0$'&$'$4%-/$'1$3*,1%7/

! <7+/00/0$%,$0'1'$&/67/,1

! <7+/00/0$'&$'$3/&"*3)/

! !"#$"%&&'($)'*)+,(-),(.'/0

! =2/$53"63'7$)3'&2/&

! >1$53"0*)/&$12/$#3",6$3/&*-1

! 0

! ?*1@$12/3/$'3/$7',A$0/+*66%,6$1/)2,%B*/&

! C/+*66%,6$&"41#'3/$D/6:$60+@$E%&*'-$F1*0%"G

! !"#$%&

! 9HCI$53"63'77%,6$%&$/J/,$-/&&$4*,

! =2/3/$%&$,"$0/+*66/3

! =2/3/$%&$,"$!"#$%&

! 9HCI$53"63'77%,6$%&$/J/,$-/&&$4*,

! =2/3/$%&$,"$0/+*66/3

! =2/3/$%&$,"$!"#$%&

! C/+*66%,6$)"0/$",$12/$0/J%)/$%&$J/3A$2'30

! 9',$13A$1"$#3%1/$%,1/37/0%'1/$3/&*-1&$1"$7/7"3A$

',0$)"5A$+').$1"$2"&1$1"$/K'7%,/

! <7*-'1%",$7"0/

! ?A$*&%,6$'$)"75%-/3$4-'6@$A"*$)',$/7*-'1/$+A$

3*,,%,6$!"" )"0/$",$12/$2"&1

! 9"75%-/3$L-'6: ##$%&'(%#%)*"!+',-

! M""0$4"3$7"&1$0/+*66%,6:$)',$*&/$60+N53%,14

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

#

! !"#$!%&'()*'+),-./'+0'1(2*'('3014*+-./'

4)0563+7''890:*'"0'+;*'%*+(9

! <-):+')*9*(:*'=>?$>@A'B01B*5

! C*30.5')*9*(:*'-.'D?$>@')*EF)-++*.

! G4*.'C06)3*

! H0+',*+'('I-(B9*':096+-0.

&*I-3*

%69+-EJ)03*::0) %69+-EJ)03*::0)

!

!"#$%&'()"*+ !"#$%&'()"*+

,(-.#(&'()"*+

/0 /0

/0 /0

/0 /0

! !

/0 /0

/0 /0

/0 /0

! !

%69+-EJ)03*::0)

!"#$%&'()"*+

/0 /0

/0 /0

/0 /0

! !

! ";*'K6.5(1*.+(9'6.-+'-:'+;*'!"#$%&'(#)*$!!)#

! !':3(9()L'1.23%(45*(#.1."2 K90(+-./'40-.+'!MN

! G.*'%69+-49,$!55'4*)'39032'3,39*

! 678 #OOOE@PQ'30149-(.+

! C+)*(1'4)03*::0):'()*'/)064*5'-.+0'&+,"-.

(#)*$!!)#!

! %69+-E4)03*::0):')6.'-.'/9',&%"#:1;(5

! !'.61B*)'0K'169+-E4)03*::0):'K0)1'('/$0-*$

%69+-EJ)03*::0)

<(3.1;(*1!"#$%&

'()"*+

!

/;*($)&0*"#(11"*

/=$*(>&'()"*+

?%"@$%&'()"*+

A"21;$2;&'()"*+

8(B;C*(&'()"*+

/;*($)&0*"#(11"*1&=$-(&$##(11&;"D

'()"*+&8+5( E##(11 /=$*.23

R*/-:+*): R*(5$S)-+* J)-I(+*

M03(9'%*10), R*(5$S)-+* J)-I(+*

C;()*5'%*10), R*(5$S)-+* %69+-EJ)03*::0)

T90B(9'%*10), R*(5$S)-+* &*I-3*

80.:+(.+'%*10), R*(5 &*I-3*

"*U+6)*'%*10), R*(5 &*I-3*

Compilation

!"#$%&'"(&)*+,-.#./"$0'"120342&"15"678

9):$0$;".<<&0=&>;"/8?8>@"AB3CC;"CDDB

Floating Point

• Results of floating-point computations will slightly

differ because of:

– Different compiler outputs, instruction sets

– Use of extended precision for intermediate results

• There are various options to force strict single precision on

the host

Emu

3M02: High Performance Computing with CUDA

4 cores

Libraries

!"##$ !"%&'( !")**

CUDA Compiler

+ !"#$#%&

CUDA Tools

'()*++(#,,*-./01-

GPU:card, system

Application SoftwareIndustry Standard C Language

Multicore CPU

CUDA ToolkitToolkit

5M02: High Performance Computing with CUDA

CUDA Many-core + Multi-core supportCUDA Many-core + Multi-core support

C CUDA Application

Multi-core

CPU C code

Multi-core

gcc and

MSVC

Many-core

PTX code

PTX to Target

Compiler

Many-core

NVCC

--multicoreNVCC

Toolkit

6M02: High Performance Computing with CUDA

CUDA Compiler: CUDA Compiler: nvccnvcc

Any source file containing CUDA language extensions (.cu)must be compiled with nvcc

NVCC is a compiler driver

Works by invoking all the necessary tools and compilers likecudacc, g++, cl, ...

NVCC can output:

Either C code (CPU Code)That must then be compiled with the rest of the application using another tool

Or PTX or object code directly

An executable with CUDA code requires:

The CUDA core library (cuda)

The CUDA runtime library (cudart)

Toolkit

7M02: High Performance Computing with CUDA

CUDA Compiler: CUDA Compiler: nvccnvcc

Important flags:

-arch sm_13 Enable double precision ( on

compatible hardware)

-G Enable debug for device code

--ptxas-options=-v Show register and memory usage

--maxrregcount <N> Limit the number of registers

-use_fast_math Use fast math library

Toolkit

35M02: High Performance Computing with CUDA

GPU ToolsGPU Tools

ProfilerAvailable now for all supported OSs

Command-line or GUI

Sampling signals on GPU for:

Memory access parameters

Execution (serialization, divergence)

DebuggerRuns on the GPU

Emulation modeCompile and execute in emulation on CPU

Allows CPU-style debugging in GPU source

Toolkit

CUDA API

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/D/#D/$$0

E

! !"#$%&"'()*+(,"(*--&"''"-(./($01()1-"'2(

!"#$%&'()* */-(!"!+!"#$%&'()*

! 31/4/1&)*5.6"-(./-.7"'(&*/8"(9&1)(:;<;=($1(

:3<>=

! 31&)*5.6"-(./-.7"'(&*/8"(9&1)(:;<;=($1(:?<?=

! @A*$(A*BB"/'(0A"/(*($"#$%&"(711&-./*$"(.'(

1%$'.-"($A"(-1)*./(19($A"($"#$%&"C

! D*/('"5"7$(*/(*--&"''./8()1-"2

! !"#$%&'( E(7A11'"(/"*&"'$(9&1)(,1%/-*&+

! )*#%%&'(+E($1&1.-*5 -1)*./

! !"#$%&"(&"9"&"/7"'(*&"(-"75*&"-(*'(*('B"7.*5(

$+B"(19(851,*5(F*&.*,5"2

!!"#$%&#!!'(#)(*+#,!"#$-'%&'$()&*()-''*%$.'/#)(*+#0#123

! ,-./2(D1)B%$"(G/.9."-(H"F.7"(I&7A.$"7$%&"

! D&"*$"-(,+(3JKHKI

! I(0*+($1(B"&91&)(71)B%$*$.1/(1/($A"(LMG

! NB"7.9.7*$.1/(91&2

! I(71)B%$"&(*&7A.$"7$%&"

! I(5*/8%*8"

! I/(*BB5.7*$.1/(./$"&9*7"(:IMK=

! !A"(DGHI(IMK(71/'.'$'(19($A&""(B*&$'2

! !A"(A1'$(IMK

! !A"(-"F.7"(IMK

! !A"(71))1/(IMK

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

#

! !"#$!%&'()*'+),-./'+0'1(2*'('3014*+-./'

4)0563+7''890:*'"0'+;*'%*+(9

! <-):+')*9*(:*'=>?$>@A'B01B*5

! C*30.5')*9*(:*'-.'D?$>@')*EF)-++*.

! G4*.'C06)3*

! H0+',*+'('I-(B9*':096+-0.

&*I-3*

%69+-EJ)03*::0) %69+-EJ)03*::0)

!

!"#$%&'()"*+ !"#$%&'()"*+

,(-.#(&'()"*+

/0 /0

/0 /0

/0 /0

! !

/0 /0

/0 /0

/0 /0

! !

%69+-EJ)03*::0)

!"#$%&'()"*+

/0 /0

/0 /0

/0 /0

! !

! ";*'K6.5(1*.+(9'6.-+'-:'+;*'!"#$%&'(#)*$!!)#

! !':3(9()L'1.23%(45*(#.1."2 K90(+-./'40-.+'!MN

! G.*'%69+-49,$!55'4*)'39032'3,39*

! 678 #OOOE@PQ'30149-(.+

! C+)*(1'4)03*::0):'()*'/)064*5'-.+0'&+,"-.

(#)*$!!)#!

! %69+-E4)03*::0):')6.'-.'/9',&%"#:1;(5

! !'.61B*)'0K'169+-E4)03*::0):'K0)1'('/$0-*$

%69+-EJ)03*::0)

<(3.1;(*1!"#$%&

'()"*+

!

/;*($)&0*"#(11"*

/=$*(>&'()"*+

?%"@$%&'()"*+

A"21;$2;&'()"*+

8(B;C*(&'()"*+

/;*($)&0*"#(11"*1&=$-(&$##(11&;"D

'()"*+&8+5( E##(11 /=$*.23

R*/-:+*): R*(5$S)-+* J)-I(+*

M03(9'%*10), R*(5$S)-+* J)-I(+*

C;()*5'%*10), R*(5$S)-+* %69+-EJ)03*::0)

T90B(9'%*10), R*(5$S)-+* &*I-3*

80.:+(.+'%*10), R*(5 &*I-3*

"*U+6)*'%*10), R*(5 &*I-3*

API

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/D/#D/$$0

&

! !"#$%&'($)*+,$(-.$/0*123#+$4567,2*6+$4*08

! '#127#$9:6:;#9#6,

! <#9*0=$9:6:;#9#6,

! >,0#:9$9:6:;#9#6,

! ?1#6,$9:6:;#9#6,

! !#@,50#$9:6:;9#6,

! A/#6BCD'20#7,E$26,#0*/#0:F2G2,=

! !"#$)*+,$(-.$2+$#@/*+#3$:+$,H*$3244#0#6,$

!"#$%&

! !"#$G*H$G#1#G$'#127#$(-.$I/0#42@8$75J

! !"#$"2;"$G#1#G$K56,29#$(-.$I/0#42@8$753:J

! >*9#$,"26;+$7:6$F#$3*6#$,"0*5;"$F*,"$(-.+L$*,"#0+$:0#$+/#72:G2M#3

! %:6$F#$92@#3$,*;#,"#0$IH2,"$7:0#J

! (GG$B-&$7*9/5,26;$2+$/#04*09#3$*6$:$3#127#! !*$:GG*7:,#$9#9*0=L$056$:$/0*;0:9L$#,7$*6$,"#$":03H:0#L$H#$6##3$:$!"#$%"&%'()"*)

! '#127#$7*6,#@,+$:0#$F*563$N8N$H2,"$"*+,$,"0#:3+$IO5+,$G2P#$A/#6BCQJ! >*L$#:7"$"*+,$,"0#:3$9:=$":1#$:,$9*+,$*6#$3#127#$7*6,#@,

! (63L$#:7"$3#127#$7*6,#@,$2+$:77#++2FG#$40*9$*6G=$*6#$"*+,$,"0#:3

! (GG$3#127#$(-.$7:GG+$0#,506$:6$#00*0D+577#++$

7*3#$*4$,=/#8$+,-"./0)

! (GG$056,29#$(-.$7:GG+$0#,506$:6$#00*0D+577#++$

7*3#$*4$,=/#$%/!12--'-3)

! (6$26,#;#0$1:G5#$H2,"$M#0*$R$6*$#00*0

! %/!14")51.)2--'-L$%/!14")2--'-6)-$(7

! K56,29#$(-.$7:GG+$:5,*9:,27:GG=$262,2:G2M#

! '#127#$(-.$7:GG+$95+,$7:GG$%/8($)

! !"#$420+,$I*/,2*6:GSJ$+,#/$2+$,*$#659#0:,#$,"#$

:1:2G:FG#$3#127#+

! %/9"#$%"4")+'/()

! %/9"#$%"4")

! %/9"#$%"4"):1;"

! %/9"#$%"4")<')10=";'->

! %/9"#$%"4")?))-$@/)"

! !

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

#

! !"#$!%&'()*'+),-./'+0'1(2*'('3014*+-./'

4)0563+7''890:*'"0'+;*'%*+(9

! <-):+')*9*(:*'=>?$>@A'B01B*5

! C*30.5')*9*(:*'-.'D?$>@')*EF)-++*.

! G4*.'C06)3*

! H0+',*+'('I-(B9*':096+-0.

&*I-3*

%69+-EJ)03*::0) %69+-EJ)03*::0)

!

!"#$%&'()"*+ !"#$%&'()"*+

,(-.#(&'()"*+

/0 /0

/0 /0

/0 /0

! !

/0 /0

/0 /0

/0 /0

! !

%69+-EJ)03*::0)

!"#$%&'()"*+

/0 /0

/0 /0

/0 /0

! !

! ";*'K6.5(1*.+(9'6.-+'-:'+;*'!"#$%&'(#)*$!!)#

! !':3(9()L'1.23%(45*(#.1."2 K90(+-./'40-.+'!MN

! G.*'%69+-49,$!55'4*)'39032'3,39*

! 678 #OOOE@PQ'30149-(.+

! C+)*(1'4)03*::0):'()*'/)064*5'-.+0'&+,"-.

(#)*$!!)#!

! %69+-E4)03*::0):')6.'-.'/9',&%"#:1;(5

! !'.61B*)'0K'169+-E4)03*::0):'K0)1'('/$0-*$

%69+-EJ)03*::0)

<(3.1;(*1!"#$%&

'()"*+

!

/;*($)&0*"#(11"*

/=$*(>&'()"*+

?%"@$%&'()"*+

A"21;$2;&'()"*+

8(B;C*(&'()"*+

/;*($)&0*"#(11"*1&=$-(&$##(11&;"D

'()"*+&8+5( E##(11 /=$*.23

R*/-:+*): R*(5$S)-+* J)-I(+*

M03(9'%*10), R*(5$S)-+* J)-I(+*

C;()*5'%*10), R*(5$S)-+* %69+-EJ)03*::0)

T90B(9'%*10), R*(5$S)-+* &*I-3*

80.:+(.+'%*10), R*(5 &*I-3*

"*U+6)*'%*10), R*(5 &*I-3*

API

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/D/#D/$$0

&

! !"#$%&'($)*+,$(-.$/0*123#+$4567,2*6+$4*08

! '#127#$9:6:;#9#6,

! <#9*0=$9:6:;#9#6,

! >,0#:9$9:6:;#9#6,

! ?1#6,$9:6:;#9#6,

! !#@,50#$9:6:;9#6,

! A/#6BCD'20#7,E$26,#0*/#0:F2G2,=

! !"#$)*+,$(-.$2+$#@/*+#3$:+$,H*$3244#0#6,$

!"#$%&

! !"#$G*H$G#1#G$'#127#$(-.$I/0#42@8$75J

! !"#$"2;"$G#1#G$K56,29#$(-.$I/0#42@8$753:J

! >*9#$,"26;+$7:6$F#$3*6#$,"0*5;"$F*,"$(-.+L$*,"#0+$:0#$+/#72:G2M#3

! %:6$F#$92@#3$,*;#,"#0$IH2,"$7:0#J

! (GG$B-&$7*9/5,26;$2+$/#04*09#3$*6$:$3#127#! !*$:GG*7:,#$9#9*0=L$056$:$/0*;0:9L$#,7$*6$,"#$":03H:0#L$H#$6##3$:$!"#$%"&%'()"*)

! '#127#$7*6,#@,+$:0#$F*563$N8N$H2,"$"*+,$,"0#:3+$IO5+,$G2P#$A/#6BCQJ! >*L$#:7"$"*+,$,"0#:3$9:=$":1#$:,$9*+,$*6#$3#127#$7*6,#@,

! (63L$#:7"$3#127#$7*6,#@,$2+$:77#++2FG#$40*9$*6G=$*6#$"*+,$,"0#:3

! (GG$3#127#$(-.$7:GG+$0#,506$:6$#00*0D+577#++$

7*3#$*4$,=/#8$+,-"./0)

! (GG$056,29#$(-.$7:GG+$0#,506$:6$#00*0D+577#++$

7*3#$*4$,=/#$%/!12--'-3)

! (6$26,#;#0$1:G5#$H2,"$M#0*$R$6*$#00*0

! %/!14")51.)2--'-L$%/!14")2--'-6)-$(7

! K56,29#$(-.$7:GG+$:5,*9:,27:GG=$262,2:G2M#

! '#127#$(-.$7:GG+$95+,$7:GG$%/8($)

! !"#$420+,$I*/,2*6:GSJ$+,#/$2+$,*$#659#0:,#$,"#$

:1:2G:FG#$3#127#+

! %/9"#$%"4")+'/()

! %/9"#$%"4")

! %/9"#$%"4"):1;"

! %/9"#$%"4")<')10=";'->

! %/9"#$%"4")?))-$@/)"

! !

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

#

! !"#$!%&'()*'+),-./'+0'1(2*'('3014*+-./'

4)0563+7''890:*'"0'+;*'%*+(9

! <-):+')*9*(:*'=>?$>@A'B01B*5

! C*30.5')*9*(:*'-.'D?$>@')*EF)-++*.

! G4*.'C06)3*

! H0+',*+'('I-(B9*':096+-0.

&*I-3*

%69+-EJ)03*::0) %69+-EJ)03*::0)

!

!"#$%&'()"*+ !"#$%&'()"*+

,(-.#(&'()"*+

/0 /0

/0 /0

/0 /0

! !

/0 /0

/0 /0

/0 /0

! !

%69+-EJ)03*::0)

!"#$%&'()"*+

/0 /0

/0 /0

/0 /0

! !

! ";*'K6.5(1*.+(9'6.-+'-:'+;*'!"#$%&'(#)*$!!)#

! !':3(9()L'1.23%(45*(#.1."2 K90(+-./'40-.+'!MN

! G.*'%69+-49,$!55'4*)'39032'3,39*

! 678 #OOOE@PQ'30149-(.+

! C+)*(1'4)03*::0):'()*'/)064*5'-.+0'&+,"-.

(#)*$!!)#!

! %69+-E4)03*::0):')6.'-.'/9',&%"#:1;(5

! !'.61B*)'0K'169+-E4)03*::0):'K0)1'('/$0-*$

%69+-EJ)03*::0)

<(3.1;(*1!"#$%&

'()"*+

!

/;*($)&0*"#(11"*

/=$*(>&'()"*+

?%"@$%&'()"*+

A"21;$2;&'()"*+

8(B;C*(&'()"*+

/;*($)&0*"#(11"*1&=$-(&$##(11&;"D

'()"*+&8+5( E##(11 /=$*.23

R*/-:+*): R*(5$S)-+* J)-I(+*

M03(9'%*10), R*(5$S)-+* J)-I(+*

C;()*5'%*10), R*(5$S)-+* %69+-EJ)03*::0)

T90B(9'%*10), R*(5$S)-+* &*I-3*

80.:+(.+'%*10), R*(5 &*I-3*

"*U+6)*'%*10), R*(5 &*I-3*

API

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/D/#D/$$0

&

! !"#$%&'($)*+,$(-.$/0*123#+$4567,2*6+$4*08

! '#127#$9:6:;#9#6,

! <#9*0=$9:6:;#9#6,

! >,0#:9$9:6:;#9#6,

! ?1#6,$9:6:;#9#6,

! !#@,50#$9:6:;9#6,

! A/#6BCD'20#7,E$26,#0*/#0:F2G2,=

! !"#$)*+,$(-.$2+$#@/*+#3$:+$,H*$3244#0#6,$

!"#$%&

! !"#$G*H$G#1#G$'#127#$(-.$I/0#42@8$75J

! !"#$"2;"$G#1#G$K56,29#$(-.$I/0#42@8$753:J

! >*9#$,"26;+$7:6$F#$3*6#$,"0*5;"$F*,"$(-.+L$*,"#0+$:0#$+/#72:G2M#3

! %:6$F#$92@#3$,*;#,"#0$IH2,"$7:0#J

! (GG$B-&$7*9/5,26;$2+$/#04*09#3$*6$:$3#127#! !*$:GG*7:,#$9#9*0=L$056$:$/0*;0:9L$#,7$*6$,"#$":03H:0#L$H#$6##3$:$!"#$%"&%'()"*)

! '#127#$7*6,#@,+$:0#$F*563$N8N$H2,"$"*+,$,"0#:3+$IO5+,$G2P#$A/#6BCQJ! >*L$#:7"$"*+,$,"0#:3$9:=$":1#$:,$9*+,$*6#$3#127#$7*6,#@,

! (63L$#:7"$3#127#$7*6,#@,$2+$:77#++2FG#$40*9$*6G=$*6#$"*+,$,"0#:3

! (GG$3#127#$(-.$7:GG+$0#,506$:6$#00*0D+577#++$

7*3#$*4$,=/#8$+,-"./0)

! (GG$056,29#$(-.$7:GG+$0#,506$:6$#00*0D+577#++$

7*3#$*4$,=/#$%/!12--'-3)

! (6$26,#;#0$1:G5#$H2,"$M#0*$R$6*$#00*0

! %/!14")51.)2--'-L$%/!14")2--'-6)-$(7

! K56,29#$(-.$7:GG+$:5,*9:,27:GG=$262,2:G2M#

! '#127#$(-.$7:GG+$95+,$7:GG$%/8($)

! !"#$420+,$I*/,2*6:GSJ$+,#/$2+$,*$#659#0:,#$,"#$

:1:2G:FG#$3#127#+

! %/9"#$%"4")+'/()

! %/9"#$%"4")

! %/9"#$%"4"):1;"

! %/9"#$%"4")<')10=";'->

! %/9"#$%"4")?))-$@/)"

! !

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

#

! !"#$!%&'()*'+),-./'+0'1(2*'('3014*+-./'

4)0563+7''890:*'"0'+;*'%*+(9

! <-):+')*9*(:*'=>?$>@A'B01B*5

! C*30.5')*9*(:*'-.'D?$>@')*EF)-++*.

! G4*.'C06)3*

! H0+',*+'('I-(B9*':096+-0.

&*I-3*

%69+-EJ)03*::0) %69+-EJ)03*::0)

!

!"#$%&'()"*+ !"#$%&'()"*+

,(-.#(&'()"*+

/0 /0

/0 /0

/0 /0

! !

/0 /0

/0 /0

/0 /0

! !

%69+-EJ)03*::0)

!"#$%&'()"*+

/0 /0

/0 /0

/0 /0

! !

! ";*'K6.5(1*.+(9'6.-+'-:'+;*'!"#$%&'(#)*$!!)#

! !':3(9()L'1.23%(45*(#.1."2 K90(+-./'40-.+'!MN

! G.*'%69+-49,$!55'4*)'39032'3,39*

! 678 #OOOE@PQ'30149-(.+

! C+)*(1'4)03*::0):'()*'/)064*5'-.+0'&+,"-.

(#)*$!!)#!

! %69+-E4)03*::0):')6.'-.'/9',&%"#:1;(5

! !'.61B*)'0K'169+-E4)03*::0):'K0)1'('/$0-*$

%69+-EJ)03*::0)

<(3.1;(*1!"#$%&

'()"*+

!

/;*($)&0*"#(11"*

/=$*(>&'()"*+

?%"@$%&'()"*+

A"21;$2;&'()"*+

8(B;C*(&'()"*+

/;*($)&0*"#(11"*1&=$-(&$##(11&;"D

'()"*+&8+5( E##(11 /=$*.23

R*/-:+*): R*(5$S)-+* J)-I(+*

M03(9'%*10), R*(5$S)-+* J)-I(+*

C;()*5'%*10), R*(5$S)-+* %69+-EJ)03*::0)

T90B(9'%*10), R*(5$S)-+* &*I-3*

80.:+(.+'%*10), R*(5 &*I-3*

"*U+6)*'%*10), R*(5 &*I-3*

API

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/D/#D/$$0

&

! !"#$%&'($)*+,$(-.$/0*123#+$4567,2*6+$4*08

! '#127#$9:6:;#9#6,

! <#9*0=$9:6:;#9#6,

! >,0#:9$9:6:;#9#6,

! ?1#6,$9:6:;#9#6,

! !#@,50#$9:6:;9#6,

! A/#6BCD'20#7,E$26,#0*/#0:F2G2,=

! !"#$)*+,$(-.$2+$#@/*+#3$:+$,H*$3244#0#6,$

!"#$%&

! !"#$G*H$G#1#G$'#127#$(-.$I/0#42@8$75J

! !"#$"2;"$G#1#G$K56,29#$(-.$I/0#42@8$753:J

! >*9#$,"26;+$7:6$F#$3*6#$,"0*5;"$F*,"$(-.+L$*,"#0+$:0#$+/#72:G2M#3

! %:6$F#$92@#3$,*;#,"#0$IH2,"$7:0#J

! (GG$B-&$7*9/5,26;$2+$/#04*09#3$*6$:$3#127#! !*$:GG*7:,#$9#9*0=L$056$:$/0*;0:9L$#,7$*6$,"#$":03H:0#L$H#$6##3$:$!"#$%"&%'()"*)

! '#127#$7*6,#@,+$:0#$F*563$N8N$H2,"$"*+,$,"0#:3+$IO5+,$G2P#$A/#6BCQJ! >*L$#:7"$"*+,$,"0#:3$9:=$":1#$:,$9*+,$*6#$3#127#$7*6,#@,

! (63L$#:7"$3#127#$7*6,#@,$2+$:77#++2FG#$40*9$*6G=$*6#$"*+,$,"0#:3

! (GG$3#127#$(-.$7:GG+$0#,506$:6$#00*0D+577#++$

7*3#$*4$,=/#8$+,-"./0)

! (GG$056,29#$(-.$7:GG+$0#,506$:6$#00*0D+577#++$

7*3#$*4$,=/#$%/!12--'-3)

! (6$26,#;#0$1:G5#$H2,"$M#0*$R$6*$#00*0

! %/!14")51.)2--'-L$%/!14")2--'-6)-$(7

! K56,29#$(-.$7:GG+$:5,*9:,27:GG=$262,2:G2M#

! '#127#$(-.$7:GG+$95+,$7:GG$%/8($)

! !"#$420+,$I*/,2*6:GSJ$+,#/$2+$,*$#659#0:,#$,"#$

:1:2G:FG#$3#127#+

! %/9"#$%"4")+'/()

! %/9"#$%"4")

! %/9"#$%"4"):1;"

! %/9"#$%"4")<')10=";'->

! %/9"#$%"4")?))-$@/)"

! !

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

#

! !"#$!%&'()*'+),-./'+0'1(2*'('3014*+-./'

4)0563+7''890:*'"0'+;*'%*+(9

! <-):+')*9*(:*'=>?$>@A'B01B*5

! C*30.5')*9*(:*'-.'D?$>@')*EF)-++*.

! G4*.'C06)3*

! H0+',*+'('I-(B9*':096+-0.

&*I-3*

%69+-EJ)03*::0) %69+-EJ)03*::0)

!

!"#$%&'()"*+ !"#$%&'()"*+

,(-.#(&'()"*+

/0 /0

/0 /0

/0 /0

! !

/0 /0

/0 /0

/0 /0

! !

%69+-EJ)03*::0)

!"#$%&'()"*+

/0 /0

/0 /0

/0 /0

! !

! ";*'K6.5(1*.+(9'6.-+'-:'+;*'!"#$%&'(#)*$!!)#

! !':3(9()L'1.23%(45*(#.1."2 K90(+-./'40-.+'!MN

! G.*'%69+-49,$!55'4*)'39032'3,39*

! 678 #OOOE@PQ'30149-(.+

! C+)*(1'4)03*::0):'()*'/)064*5'-.+0'&+,"-.

(#)*$!!)#!

! %69+-E4)03*::0):')6.'-.'/9',&%"#:1;(5

! !'.61B*)'0K'169+-E4)03*::0):'K0)1'('/$0-*$

%69+-EJ)03*::0)

<(3.1;(*1!"#$%&

'()"*+

!

/;*($)&0*"#(11"*

/=$*(>&'()"*+

?%"@$%&'()"*+

A"21;$2;&'()"*+

8(B;C*(&'()"*+

/;*($)&0*"#(11"*1&=$-(&$##(11&;"D

'()"*+&8+5( E##(11 /=$*.23

R*/-:+*): R*(5$S)-+* J)-I(+*

M03(9'%*10), R*(5$S)-+* J)-I(+*

C;()*5'%*10), R*(5$S)-+* %69+-EJ)03*::0)

T90B(9'%*10), R*(5$S)-+* &*I-3*

80.:+(.+'%*10), R*(5 &*I-3*

"*U+6)*'%*10), R*(5 &*I-3*

API

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/D/#D/$$0

&

! !"#$%&'($)*+,$(-.$/0*123#+$4567,2*6+$4*08

! '#127#$9:6:;#9#6,

! <#9*0=$9:6:;#9#6,

! >,0#:9$9:6:;#9#6,

! ?1#6,$9:6:;#9#6,

! !#@,50#$9:6:;9#6,

! A/#6BCD'20#7,E$26,#0*/#0:F2G2,=

! !"#$)*+,$(-.$2+$#@/*+#3$:+$,H*$3244#0#6,$

!"#$%&

! !"#$G*H$G#1#G$'#127#$(-.$I/0#42@8$75J

! !"#$"2;"$G#1#G$K56,29#$(-.$I/0#42@8$753:J

! >*9#$,"26;+$7:6$F#$3*6#$,"0*5;"$F*,"$(-.+L$*,"#0+$:0#$+/#72:G2M#3

! %:6$F#$92@#3$,*;#,"#0$IH2,"$7:0#J

! (GG$B-&$7*9/5,26;$2+$/#04*09#3$*6$:$3#127#! !*$:GG*7:,#$9#9*0=L$056$:$/0*;0:9L$#,7$*6$,"#$":03H:0#L$H#$6##3$:$!"#$%"&%'()"*)

! '#127#$7*6,#@,+$:0#$F*563$N8N$H2,"$"*+,$,"0#:3+$IO5+,$G2P#$A/#6BCQJ! >*L$#:7"$"*+,$,"0#:3$9:=$":1#$:,$9*+,$*6#$3#127#$7*6,#@,

! (63L$#:7"$3#127#$7*6,#@,$2+$:77#++2FG#$40*9$*6G=$*6#$"*+,$,"0#:3

! (GG$3#127#$(-.$7:GG+$0#,506$:6$#00*0D+577#++$

7*3#$*4$,=/#8$+,-"./0)

! (GG$056,29#$(-.$7:GG+$0#,506$:6$#00*0D+577#++$

7*3#$*4$,=/#$%/!12--'-3)

! (6$26,#;#0$1:G5#$H2,"$M#0*$R$6*$#00*0

! %/!14")51.)2--'-L$%/!14")2--'-6)-$(7

! K56,29#$(-.$7:GG+$:5,*9:,27:GG=$262,2:G2M#

! '#127#$(-.$7:GG+$95+,$7:GG$%/8($)

! !"#$420+,$I*/,2*6:GSJ$+,#/$2+$,*$#659#0:,#$,"#$

:1:2G:FG#$3#127#+

! %/9"#$%"4")+'/()

! %/9"#$%"4")

! %/9"#$%"4"):1;"

! %/9"#$%"4")<')10=";'->

! %/9"#$%"4")?))-$@/)"

! !

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

#

! !"#$!%&'()*'+),-./'+0'1(2*'('3014*+-./'

4)0563+7''890:*'"0'+;*'%*+(9

! <-):+')*9*(:*'=>?$>@A'B01B*5

! C*30.5')*9*(:*'-.'D?$>@')*EF)-++*.

! G4*.'C06)3*

! H0+',*+'('I-(B9*':096+-0.

&*I-3*

%69+-EJ)03*::0) %69+-EJ)03*::0)

!

!"#$%&'()"*+ !"#$%&'()"*+

,(-.#(&'()"*+

/0 /0

/0 /0

/0 /0

! !

/0 /0

/0 /0

/0 /0

! !

%69+-EJ)03*::0)

!"#$%&'()"*+

/0 /0

/0 /0

/0 /0

! !

! ";*'K6.5(1*.+(9'6.-+'-:'+;*'!"#$%&'(#)*$!!)#

! !':3(9()L'1.23%(45*(#.1."2 K90(+-./'40-.+'!MN

! G.*'%69+-49,$!55'4*)'39032'3,39*

! 678 #OOOE@PQ'30149-(.+

! C+)*(1'4)03*::0):'()*'/)064*5'-.+0'&+,"-.

(#)*$!!)#!

! %69+-E4)03*::0):')6.'-.'/9',&%"#:1;(5

! !'.61B*)'0K'169+-E4)03*::0):'K0)1'('/$0-*$

%69+-EJ)03*::0)

<(3.1;(*1!"#$%&

'()"*+

!

/;*($)&0*"#(11"*

/=$*(>&'()"*+

?%"@$%&'()"*+

A"21;$2;&'()"*+

8(B;C*(&'()"*+

/;*($)&0*"#(11"*1&=$-(&$##(11&;"D

'()"*+&8+5( E##(11 /=$*.23

R*/-:+*): R*(5$S)-+* J)-I(+*

M03(9'%*10), R*(5$S)-+* J)-I(+*

C;()*5'%*10), R*(5$S)-+* %69+-EJ)03*::0)

T90B(9'%*10), R*(5$S)-+* &*I-3*

80.:+(.+'%*10), R*(5 &*I-3*

"*U+6)*'%*10), R*(5 &*I-3*

API

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/D/#D/$$0

&

! !"#$%&'($)*+,$(-.$/0*123#+$4567,2*6+$4*08

! '#127#$9:6:;#9#6,

! <#9*0=$9:6:;#9#6,

! >,0#:9$9:6:;#9#6,

! ?1#6,$9:6:;#9#6,

! !#@,50#$9:6:;9#6,

! A/#6BCD'20#7,E$26,#0*/#0:F2G2,=

! !"#$)*+,$(-.$2+$#@/*+#3$:+$,H*$3244#0#6,$

!"#$%&

! !"#$G*H$G#1#G$'#127#$(-.$I/0#42@8$75J

! !"#$"2;"$G#1#G$K56,29#$(-.$I/0#42@8$753:J

! >*9#$,"26;+$7:6$F#$3*6#$,"0*5;"$F*,"$(-.+L$*,"#0+$:0#$+/#72:G2M#3

! %:6$F#$92@#3$,*;#,"#0$IH2,"$7:0#J

! (GG$B-&$7*9/5,26;$2+$/#04*09#3$*6$:$3#127#! !*$:GG*7:,#$9#9*0=L$056$:$/0*;0:9L$#,7$*6$,"#$":03H:0#L$H#$6##3$:$!"#$%"&%'()"*)

! '#127#$7*6,#@,+$:0#$F*563$N8N$H2,"$"*+,$,"0#:3+$IO5+,$G2P#$A/#6BCQJ! >*L$#:7"$"*+,$,"0#:3$9:=$":1#$:,$9*+,$*6#$3#127#$7*6,#@,

! (63L$#:7"$3#127#$7*6,#@,$2+$:77#++2FG#$40*9$*6G=$*6#$"*+,$,"0#:3

! (GG$3#127#$(-.$7:GG+$0#,506$:6$#00*0D+577#++$

7*3#$*4$,=/#8$+,-"./0)

! (GG$056,29#$(-.$7:GG+$0#,506$:6$#00*0D+577#++$

7*3#$*4$,=/#$%/!12--'-3)

! (6$26,#;#0$1:G5#$H2,"$M#0*$R$6*$#00*0

! %/!14")51.)2--'-L$%/!14")2--'-6)-$(7

! K56,29#$(-.$7:GG+$:5,*9:,27:GG=$262,2:G2M#

! '#127#$(-.$7:GG+$95+,$7:GG$%/8($)

! !"#$420+,$I*/,2*6:GSJ$+,#/$2+$,*$#659#0:,#$,"#$

:1:2G:FG#$3#127#+

! %/9"#$%"4")+'/()

! %/9"#$%"4")

! %/9"#$%"4"):1;"

! %/9"#$%"4")<')10=";'->

! %/9"#$%"4")?))-$@/)"

! !

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

#

! !"#$!%&'()*'+),-./'+0'1(2*'('3014*+-./'

4)0563+7''890:*'"0'+;*'%*+(9

! <-):+')*9*(:*'=>?$>@A'B01B*5

! C*30.5')*9*(:*'-.'D?$>@')*EF)-++*.

! G4*.'C06)3*

! H0+',*+'('I-(B9*':096+-0.

&*I-3*

%69+-EJ)03*::0) %69+-EJ)03*::0)

!

!"#$%&'()"*+ !"#$%&'()"*+

,(-.#(&'()"*+

/0 /0

/0 /0

/0 /0

! !

/0 /0

/0 /0

/0 /0

! !

%69+-EJ)03*::0)

!"#$%&'()"*+

/0 /0

/0 /0

/0 /0

! !

! ";*'K6.5(1*.+(9'6.-+'-:'+;*'!"#$%&'(#)*$!!)#

! !':3(9()L'1.23%(45*(#.1."2 K90(+-./'40-.+'!MN

! G.*'%69+-49,$!55'4*)'39032'3,39*

! 678 #OOOE@PQ'30149-(.+

! C+)*(1'4)03*::0):'()*'/)064*5'-.+0'&+,"-.

(#)*$!!)#!

! %69+-E4)03*::0):')6.'-.'/9',&%"#:1;(5

! !'.61B*)'0K'169+-E4)03*::0):'K0)1'('/$0-*$

%69+-EJ)03*::0)

<(3.1;(*1!"#$%&

'()"*+

!

/;*($)&0*"#(11"*

/=$*(>&'()"*+

?%"@$%&'()"*+

A"21;$2;&'()"*+

8(B;C*(&'()"*+

/;*($)&0*"#(11"*1&=$-(&$##(11&;"D

'()"*+&8+5( E##(11 /=$*.23

R*/-:+*): R*(5$S)-+* J)-I(+*

M03(9'%*10), R*(5$S)-+* J)-I(+*

C;()*5'%*10), R*(5$S)-+* %69+-EJ)03*::0)

T90B(9'%*10), R*(5$S)-+* &*I-3*

80.:+(.+'%*10), R*(5 &*I-3*

"*U+6)*'%*10), R*(5 &*I-3*

API

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/D/#D/$$0

E

! !"#$%&$%#'(()$%*%+$,-#$%&-.'%!"#$%&!$'$(

&$%/$.%*%+$,-#$%'*"+0$%(1%.23$%)*+$%&!$

! 4*"%"(&%#5$*.$%*%#(".$6.%&-.'%!")(,)-$.($

! 78".-9$%:;<%35(,-+$)%*%)-930-1-$+%-".$51*#$%

1(5%#5$*.-"/%*%#(".$6.=

! !"+.'$(#$%&!$)/"0(

! !"+.1$(#$%&!$

! :"+%.'$%8)$180=

! !"+.)2//3$#$%&!$

! !"#$%&$%'*,$%*%#(".$6.%>)*!/0($,(?%#*"%

*00(#*.$%9$9(52@%#*00%*%A;B%18"#.-("%$.#C%%

! 4(".$6.%-)%-930-#-.02%*))(#-*.$+%&-.'%#5$*.-"/%

.'5$*+

! D(%)2"#'5("-E$%*00%.'5$*+)%>4;B%'().%&-.'%

A;B%.'5$*+)?%#*00%!")(,140!2-/0&5$

! F*-.)%1(5%*00%A;B%.*)G)%.(%1-"-)'%

! :00(#*.$HI5$$%9$9(52=

! !"6$7899/!:;!"6$7<-$$

! <"-.-*0-E$%9$9(52=

! !"6$73$(

! 4(32%9$9(52=

! !"6$7!=4>(/#:;!"6$7!=4#(/>:;

!"6$7!=4#(/#

! F'$"%*00(#*.-"/%9$9(52%1(5%.'$%2/3(@%#*"%

8)$%!"##$% H%&'( H%!!")

! !5%8)$%!"6$7899/!>/3(@%!"6$7<-$$>/3(

! D'$)$%18"#.-(")%*00(#*.$%'().%9$9(52%.'*.%-)%

)"*'+#$%,'-

! ;$51(59*"#$%-935(,$+%1(5%#(32%.(H15(9%

3*/$J0(#G$+%'().%9$9(52

! :00(#*.$HI5$$%9$9(52=

! !"+.6.99/!@%!"+.<-$$

! <"-.-*0-E$%9$9(52=

! !"+.6$73$(

! 4(32%9$9(52=

! !"+.6$7!=4

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

#

! !"#$!%&'()*'+),-./'+0'1(2*'('3014*+-./'

4)0563+7''890:*'"0'+;*'%*+(9

! <-):+')*9*(:*'=>?$>@A'B01B*5

! C*30.5')*9*(:*'-.'D?$>@')*EF)-++*.

! G4*.'C06)3*

! H0+',*+'('I-(B9*':096+-0.

&*I-3*

%69+-EJ)03*::0) %69+-EJ)03*::0)

!

!"#$%&'()"*+ !"#$%&'()"*+

,(-.#(&'()"*+

/0 /0

/0 /0

/0 /0

! !

/0 /0

/0 /0

/0 /0

! !

%69+-EJ)03*::0)

!"#$%&'()"*+

/0 /0

/0 /0

/0 /0

! !

! ";*'K6.5(1*.+(9'6.-+'-:'+;*'!"#$%&'(#)*$!!)#

! !':3(9()L'1.23%(45*(#.1."2 K90(+-./'40-.+'!MN

! G.*'%69+-49,$!55'4*)'39032'3,39*

! 678 #OOOE@PQ'30149-(.+

! C+)*(1'4)03*::0):'()*'/)064*5'-.+0'&+,"-.

(#)*$!!)#!

! %69+-E4)03*::0):')6.'-.'/9',&%"#:1;(5

! !'.61B*)'0K'169+-E4)03*::0):'K0)1'('/$0-*$

%69+-EJ)03*::0)

<(3.1;(*1!"#$%&

'()"*+

!

/;*($)&0*"#(11"*

/=$*(>&'()"*+

?%"@$%&'()"*+

A"21;$2;&'()"*+

8(B;C*(&'()"*+

/;*($)&0*"#(11"*1&=$-(&$##(11&;"D

'()"*+&8+5( E##(11 /=$*.23

R*/-:+*): R*(5$S)-+* J)-I(+*

M03(9'%*10), R*(5$S)-+* J)-I(+*

C;()*5'%*10), R*(5$S)-+* %69+-EJ)03*::0)

T90B(9'%*10), R*(5$S)-+* &*I-3*

80.:+(.+'%*10), R*(5 &*I-3*

"*U+6)*'%*10), R*(5 &*I-3*

API

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/D/#D/$$0

E

! !"#$%&$%#'(()$%*%+$,-#$%&-.'%!"#$%&!$'$(

&$%/$.%*%+$,-#$%'*"+0$%(1%.23$%)*+$%&!$

! 4*"%"(&%#5$*.$%*%#(".$6.%&-.'%!")(,)-$.($

! 78".-9$%:;<%35(,-+$)%*%)-930-1-$+%-".$51*#$%

1(5%#5$*.-"/%*%#(".$6.=

! !"+.'$(#$%&!$)/"0(

! !"+.1$(#$%&!$

! :"+%.'$%8)$180=

! !"+.)2//3$#$%&!$

! !"#$%&$%'*,$%*%#(".$6.%>)*!/0($,(?%#*"%

*00(#*.$%9$9(52@%#*00%*%A;B%18"#.-("%$.#C%%

! 4(".$6.%-)%-930-#-.02%*))(#-*.$+%&-.'%#5$*.-"/%

.'5$*+

! D(%)2"#'5("-E$%*00%.'5$*+)%>4;B%'().%&-.'%

A;B%.'5$*+)?%#*00%!")(,140!2-/0&5$

! F*-.)%1(5%*00%A;B%.*)G)%.(%1-"-)'%

! :00(#*.$HI5$$%9$9(52=

! !"6$7899/!:;!"6$7<-$$

! <"-.-*0-E$%9$9(52=

! !"6$73$(

! 4(32%9$9(52=

! !"6$7!=4>(/#:;!"6$7!=4#(/>:;

!"6$7!=4#(/#

! F'$"%*00(#*.-"/%9$9(52%1(5%.'$%2/3(@%#*"%

8)$%!"##$% H%&'( H%!!")

! !5%8)$%!"6$7899/!>/3(@%!"6$7<-$$>/3(

! D'$)$%18"#.-(")%*00(#*.$%'().%9$9(52%.'*.%-)%

)"*'+#$%,'-

! ;$51(59*"#$%-935(,$+%1(5%#(32%.(H15(9%

3*/$J0(#G$+%'().%9$9(52

! :00(#*.$HI5$$%9$9(52=

! !"+.6.99/!@%!"+.<-$$

! <"-.-*0-E$%9$9(52=

! !"+.6$73$(

! 4(32%9$9(52=

! !"+.6$7!=4

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

#

! !"#$!%&'()*'+),-./'+0'1(2*'('3014*+-./'

4)0563+7''890:*'"0'+;*'%*+(9

! <-):+')*9*(:*'=>?$>@A'B01B*5

! C*30.5')*9*(:*'-.'D?$>@')*EF)-++*.

! G4*.'C06)3*

! H0+',*+'('I-(B9*':096+-0.

&*I-3*

%69+-EJ)03*::0) %69+-EJ)03*::0)

!

!"#$%&'()"*+ !"#$%&'()"*+

,(-.#(&'()"*+

/0 /0

/0 /0

/0 /0

! !

/0 /0

/0 /0

/0 /0

! !

%69+-EJ)03*::0)

!"#$%&'()"*+

/0 /0

/0 /0

/0 /0

! !

! ";*'K6.5(1*.+(9'6.-+'-:'+;*'!"#$%&'(#)*$!!)#

! !':3(9()L'1.23%(45*(#.1."2 K90(+-./'40-.+'!MN

! G.*'%69+-49,$!55'4*)'39032'3,39*

! 678 #OOOE@PQ'30149-(.+

! C+)*(1'4)03*::0):'()*'/)064*5'-.+0'&+,"-.

(#)*$!!)#!

! %69+-E4)03*::0):')6.'-.'/9',&%"#:1;(5

! !'.61B*)'0K'169+-E4)03*::0):'K0)1'('/$0-*$

%69+-EJ)03*::0)

<(3.1;(*1!"#$%&

'()"*+

!

/;*($)&0*"#(11"*

/=$*(>&'()"*+

?%"@$%&'()"*+

A"21;$2;&'()"*+

8(B;C*(&'()"*+

/;*($)&0*"#(11"*1&=$-(&$##(11&;"D

'()"*+&8+5( E##(11 /=$*.23

R*/-:+*): R*(5$S)-+* J)-I(+*

M03(9'%*10), R*(5$S)-+* J)-I(+*

C;()*5'%*10), R*(5$S)-+* %69+-EJ)03*::0)

T90B(9'%*10), R*(5$S)-+* &*I-3*

80.:+(.+'%*10), R*(5 &*I-3*

"*U+6)*'%*10), R*(5 &*I-3*

API

28M02: High Performance Computing with CUDA

Device ManagementDevice Management

CPU can query and select GPU devices

cudaGetDeviceCount( int* count )

cudaSetDevice( int device )

cudaGetDevice( int *current_device )

cudaGetDeviceProperties( cudaDeviceProp* prop,

int device )

cudaChooseDevice( int *device, cudaDeviceProp* prop )

Multi-GPU setup:

device 0 is used by default

one CPU thread can control one GPUmultiple CPU threads can control the same GPU

– calls are serialized by the driver

API

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/D/#D/$$0

E

! !"#$%&$%#'(()$%*%+$,-#$%&-.'%!"#$%&!$'$(

&$%/$.%*%+$,-#$%'*"+0$%(1%.23$%)*+$%&!$

! 4*"%"(&%#5$*.$%*%#(".$6.%&-.'%!")(,)-$.($

! 78".-9$%:;<%35(,-+$)%*%)-930-1-$+%-".$51*#$%

1(5%#5$*.-"/%*%#(".$6.=

! !"+.'$(#$%&!$)/"0(

! !"+.1$(#$%&!$

! :"+%.'$%8)$180=

! !"+.)2//3$#$%&!$

! !"#$%&$%'*,$%*%#(".$6.%>)*!/0($,(?%#*"%

*00(#*.$%9$9(52@%#*00%*%A;B%18"#.-("%$.#C%%

! 4(".$6.%-)%-930-#-.02%*))(#-*.$+%&-.'%#5$*.-"/%

.'5$*+

! D(%)2"#'5("-E$%*00%.'5$*+)%>4;B%'().%&-.'%

A;B%.'5$*+)?%#*00%!")(,140!2-/0&5$

! F*-.)%1(5%*00%A;B%.*)G)%.(%1-"-)'%

! :00(#*.$HI5$$%9$9(52=

! !"6$7899/!:;!"6$7<-$$

! <"-.-*0-E$%9$9(52=

! !"6$73$(

! 4(32%9$9(52=

! !"6$7!=4>(/#:;!"6$7!=4#(/>:;

!"6$7!=4#(/#

! F'$"%*00(#*.-"/%9$9(52%1(5%.'$%2/3(@%#*"%

8)$%!"##$% H%&'( H%!!")

! !5%8)$%!"6$7899/!>/3(@%!"6$7<-$$>/3(

! D'$)$%18"#.-(")%*00(#*.$%'().%9$9(52%.'*.%-)%

)"*'+#$%,'-

! ;$51(59*"#$%-935(,$+%1(5%#(32%.(H15(9%

3*/$J0(#G$+%'().%9$9(52

! :00(#*.$HI5$$%9$9(52=

! !"+.6.99/!@%!"+.<-$$

! <"-.-*0-E$%9$9(52=

! !"+.6$73$(

! 4(32%9$9(52=

! !"+.6$7!=4

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

#

! !"#$!%&'()*'+),-./'+0'1(2*'('3014*+-./'

4)0563+7''890:*'"0'+;*'%*+(9

! <-):+')*9*(:*'=>?$>@A'B01B*5

! C*30.5')*9*(:*'-.'D?$>@')*EF)-++*.

! G4*.'C06)3*

! H0+',*+'('I-(B9*':096+-0.

&*I-3*

%69+-EJ)03*::0) %69+-EJ)03*::0)

!

!"#$%&'()"*+ !"#$%&'()"*+

,(-.#(&'()"*+

/0 /0

/0 /0

/0 /0

! !

/0 /0

/0 /0

/0 /0

! !

%69+-EJ)03*::0)

!"#$%&'()"*+

/0 /0

/0 /0

/0 /0

! !

! ";*'K6.5(1*.+(9'6.-+'-:'+;*'!"#$%&'(#)*$!!)#

! !':3(9()L'1.23%(45*(#.1."2 K90(+-./'40-.+'!MN

! G.*'%69+-49,$!55'4*)'39032'3,39*

! 678 #OOOE@PQ'30149-(.+

! C+)*(1'4)03*::0):'()*'/)064*5'-.+0'&+,"-.

(#)*$!!)#!

! %69+-E4)03*::0):')6.'-.'/9',&%"#:1;(5

! !'.61B*)'0K'169+-E4)03*::0):'K0)1'('/$0-*$

%69+-EJ)03*::0)

<(3.1;(*1!"#$%&

'()"*+

!

/;*($)&0*"#(11"*

/=$*(>&'()"*+

?%"@$%&'()"*+

A"21;$2;&'()"*+

8(B;C*(&'()"*+

/;*($)&0*"#(11"*1&=$-(&$##(11&;"D

'()"*+&8+5( E##(11 /=$*.23

R*/-:+*): R*(5$S)-+* J)-I(+*

M03(9'%*10), R*(5$S)-+* J)-I(+*

C;()*5'%*10), R*(5$S)-+* %69+-EJ)03*::0)

T90B(9'%*10), R*(5$S)-+* &*I-3*

80.:+(.+'%*10), R*(5 &*I-3*

"*U+6)*'%*10), R*(5 &*I-3*

API

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/D/#D/$$0

E

! !"#$%&$%#'(()$%*%+$,-#$%&-.'%!"#$%&!$'$(

&$%/$.%*%+$,-#$%'*"+0$%(1%.23$%)*+$%&!$

! 4*"%"(&%#5$*.$%*%#(".$6.%&-.'%!")(,)-$.($

! 78".-9$%:;<%35(,-+$)%*%)-930-1-$+%-".$51*#$%

1(5%#5$*.-"/%*%#(".$6.=

! !"+.'$(#$%&!$)/"0(

! !"+.1$(#$%&!$

! :"+%.'$%8)$180=

! !"+.)2//3$#$%&!$

! !"#$%&$%'*,$%*%#(".$6.%>)*!/0($,(?%#*"%

*00(#*.$%9$9(52@%#*00%*%A;B%18"#.-("%$.#C%%

! 4(".$6.%-)%-930-#-.02%*))(#-*.$+%&-.'%#5$*.-"/%

.'5$*+

! D(%)2"#'5("-E$%*00%.'5$*+)%>4;B%'().%&-.'%

A;B%.'5$*+)?%#*00%!")(,140!2-/0&5$

! F*-.)%1(5%*00%A;B%.*)G)%.(%1-"-)'%

! :00(#*.$HI5$$%9$9(52=

! !"6$7899/!:;!"6$7<-$$

! <"-.-*0-E$%9$9(52=

! !"6$73$(

! 4(32%9$9(52=

! !"6$7!=4>(/#:;!"6$7!=4#(/>:;

!"6$7!=4#(/#

! F'$"%*00(#*.-"/%9$9(52%1(5%.'$%2/3(@%#*"%

8)$%!"##$% H%&'( H%!!")

! !5%8)$%!"6$7899/!>/3(@%!"6$7<-$$>/3(

! D'$)$%18"#.-(")%*00(#*.$%'().%9$9(52%.'*.%-)%

)"*'+#$%,'-

! ;$51(59*"#$%-935(,$+%1(5%#(32%.(H15(9%

3*/$J0(#G$+%'().%9$9(52

! :00(#*.$HI5$$%9$9(52=

! !"+.6.99/!@%!"+.<-$$

! <"-.-*0-E$%9$9(52=

! !"+.6$73$(

! 4(32%9$9(52=

! !"+.6$7!=4

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

#

! !"#$!%&'()*'+),-./'+0'1(2*'('3014*+-./'

4)0563+7''890:*'"0'+;*'%*+(9

! <-):+')*9*(:*'=>?$>@A'B01B*5

! C*30.5')*9*(:*'-.'D?$>@')*EF)-++*.

! G4*.'C06)3*

! H0+',*+'('I-(B9*':096+-0.

&*I-3*

%69+-EJ)03*::0) %69+-EJ)03*::0)

!

!"#$%&'()"*+ !"#$%&'()"*+

,(-.#(&'()"*+

/0 /0

/0 /0

/0 /0

! !

/0 /0

/0 /0

/0 /0

! !

%69+-EJ)03*::0)

!"#$%&'()"*+

/0 /0

/0 /0

/0 /0

! !

! ";*'K6.5(1*.+(9'6.-+'-:'+;*'!"#$%&'(#)*$!!)#

! !':3(9()L'1.23%(45*(#.1."2 K90(+-./'40-.+'!MN

! G.*'%69+-49,$!55'4*)'39032'3,39*

! 678 #OOOE@PQ'30149-(.+

! C+)*(1'4)03*::0):'()*'/)064*5'-.+0'&+,"-.

(#)*$!!)#!

! %69+-E4)03*::0):')6.'-.'/9',&%"#:1;(5

! !'.61B*)'0K'169+-E4)03*::0):'K0)1'('/$0-*$

%69+-EJ)03*::0)

<(3.1;(*1!"#$%&

'()"*+

!

/;*($)&0*"#(11"*

/=$*(>&'()"*+

?%"@$%&'()"*+

A"21;$2;&'()"*+

8(B;C*(&'()"*+

/;*($)&0*"#(11"*1&=$-(&$##(11&;"D

'()"*+&8+5( E##(11 /=$*.23

R*/-:+*): R*(5$S)-+* J)-I(+*

M03(9'%*10), R*(5$S)-+* J)-I(+*

C;()*5'%*10), R*(5$S)-+* %69+-EJ)03*::0)

T90B(9'%*10), R*(5$S)-+* &*I-3*

80.:+(.+'%*10), R*(5 &*I-3*

"*U+6)*'%*10), R*(5 &*I-3*

API

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/D/#D/$$0

E

! !"#$%&$%#'(()$%*%+$,-#$%&-.'%!"#$%&!$'$(

&$%/$.%*%+$,-#$%'*"+0$%(1%.23$%)*+$%&!$

! 4*"%"(&%#5$*.$%*%#(".$6.%&-.'%!")(,)-$.($

! 78".-9$%:;<%35(,-+$)%*%)-930-1-$+%-".$51*#$%

1(5%#5$*.-"/%*%#(".$6.=

! !"+.'$(#$%&!$)/"0(

! !"+.1$(#$%&!$

! :"+%.'$%8)$180=

! !"+.)2//3$#$%&!$

! !"#$%&$%'*,$%*%#(".$6.%>)*!/0($,(?%#*"%

*00(#*.$%9$9(52@%#*00%*%A;B%18"#.-("%$.#C%%

! 4(".$6.%-)%-930-#-.02%*))(#-*.$+%&-.'%#5$*.-"/%

.'5$*+

! D(%)2"#'5("-E$%*00%.'5$*+)%>4;B%'().%&-.'%

A;B%.'5$*+)?%#*00%!")(,140!2-/0&5$

! F*-.)%1(5%*00%A;B%.*)G)%.(%1-"-)'%

! :00(#*.$HI5$$%9$9(52=

! !"6$7899/!:;!"6$7<-$$

! <"-.-*0-E$%9$9(52=

! !"6$73$(

! 4(32%9$9(52=

! !"6$7!=4>(/#:;!"6$7!=4#(/>:;

!"6$7!=4#(/#

! F'$"%*00(#*.-"/%9$9(52%1(5%.'$%2/3(@%#*"%

8)$%!"##$% H%&'( H%!!")

! !5%8)$%!"6$7899/!>/3(@%!"6$7<-$$>/3(

! D'$)$%18"#.-(")%*00(#*.$%'().%9$9(52%.'*.%-)%

)"*'+#$%,'-

! ;$51(59*"#$%-935(,$+%1(5%#(32%.(H15(9%

3*/$J0(#G$+%'().%9$9(52

! :00(#*.$HI5$$%9$9(52=

! !"+.6.99/!@%!"+.<-$$

! <"-.-*0-E$%9$9(52=

! !"+.6$73$(

! 4(32%9$9(52=

! !"+.6$7!=4

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

#

! !"#$!%&'()*'+),-./'+0'1(2*'('3014*+-./'

4)0563+7''890:*'"0'+;*'%*+(9

! <-):+')*9*(:*'=>?$>@A'B01B*5

! C*30.5')*9*(:*'-.'D?$>@')*EF)-++*.

! G4*.'C06)3*

! H0+',*+'('I-(B9*':096+-0.

&*I-3*

%69+-EJ)03*::0) %69+-EJ)03*::0)

!

!"#$%&'()"*+ !"#$%&'()"*+

,(-.#(&'()"*+

/0 /0

/0 /0

/0 /0

! !

/0 /0

/0 /0

/0 /0

! !

%69+-EJ)03*::0)

!"#$%&'()"*+

/0 /0

/0 /0

/0 /0

! !

! ";*'K6.5(1*.+(9'6.-+'-:'+;*'!"#$%&'(#)*$!!)#

! !':3(9()L'1.23%(45*(#.1."2 K90(+-./'40-.+'!MN

! G.*'%69+-49,$!55'4*)'39032'3,39*

! 678 #OOOE@PQ'30149-(.+

! C+)*(1'4)03*::0):'()*'/)064*5'-.+0'&+,"-.

(#)*$!!)#!

! %69+-E4)03*::0):')6.'-.'/9',&%"#:1;(5

! !'.61B*)'0K'169+-E4)03*::0):'K0)1'('/$0-*$

%69+-EJ)03*::0)

<(3.1;(*1!"#$%&

'()"*+

!

/;*($)&0*"#(11"*

/=$*(>&'()"*+

?%"@$%&'()"*+

A"21;$2;&'()"*+

8(B;C*(&'()"*+

/;*($)&0*"#(11"*1&=$-(&$##(11&;"D

'()"*+&8+5( E##(11 /=$*.23

R*/-:+*): R*(5$S)-+* J)-I(+*

M03(9'%*10), R*(5$S)-+* J)-I(+*

C;()*5'%*10), R*(5$S)-+* %69+-EJ)03*::0)

T90B(9'%*10), R*(5$S)-+* &*I-3*

80.:+(.+'%*10), R*(5 &*I-3*

"*U+6)*'%*10), R*(5 &*I-3*

API

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/D/#D/$$0

E

! !"#$%&$%#'(()$%*%+$,-#$%&-.'%!"#$%&!$'$(

&$%/$.%*%+$,-#$%'*"+0$%(1%.23$%)*+$%&!$

! 4*"%"(&%#5$*.$%*%#(".$6.%&-.'%!")(,)-$.($

! 78".-9$%:;<%35(,-+$)%*%)-930-1-$+%-".$51*#$%

1(5%#5$*.-"/%*%#(".$6.=

! !"+.'$(#$%&!$)/"0(

! !"+.1$(#$%&!$

! :"+%.'$%8)$180=

! !"+.)2//3$#$%&!$

! !"#$%&$%'*,$%*%#(".$6.%>)*!/0($,(?%#*"%

*00(#*.$%9$9(52@%#*00%*%A;B%18"#.-("%$.#C%%

! 4(".$6.%-)%-930-#-.02%*))(#-*.$+%&-.'%#5$*.-"/%

.'5$*+

! D(%)2"#'5("-E$%*00%.'5$*+)%>4;B%'().%&-.'%

A;B%.'5$*+)?%#*00%!")(,140!2-/0&5$

! F*-.)%1(5%*00%A;B%.*)G)%.(%1-"-)'%

! :00(#*.$HI5$$%9$9(52=

! !"6$7899/!:;!"6$7<-$$

! <"-.-*0-E$%9$9(52=

! !"6$73$(

! 4(32%9$9(52=

! !"6$7!=4>(/#:;!"6$7!=4#(/>:;

!"6$7!=4#(/#

! F'$"%*00(#*.-"/%9$9(52%1(5%.'$%2/3(@%#*"%

8)$%!"##$% H%&'( H%!!")

! !5%8)$%!"6$7899/!>/3(@%!"6$7<-$$>/3(

! D'$)$%18"#.-(")%*00(#*.$%'().%9$9(52%.'*.%-)%

)"*'+#$%,'-

! ;$51(59*"#$%-935(,$+%1(5%#(32%.(H15(9%

3*/$J0(#G$+%'().%9$9(52

! :00(#*.$HI5$$%9$9(52=

! !"+.6.99/!@%!"+.<-$$

! <"-.-*0-E$%9$9(52=

! !"+.6$73$(

! 4(32%9$9(52=

! !"+.6$7!=4

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

#

! !"#$!%&'()*'+),-./'+0'1(2*'('3014*+-./'

4)0563+7''890:*'"0'+;*'%*+(9

! <-):+')*9*(:*'=>?$>@A'B01B*5

! C*30.5')*9*(:*'-.'D?$>@')*EF)-++*.

! G4*.'C06)3*

! H0+',*+'('I-(B9*':096+-0.

&*I-3*

%69+-EJ)03*::0) %69+-EJ)03*::0)

!

!"#$%&'()"*+ !"#$%&'()"*+

,(-.#(&'()"*+

/0 /0

/0 /0

/0 /0

! !

/0 /0

/0 /0

/0 /0

! !

%69+-EJ)03*::0)

!"#$%&'()"*+

/0 /0

/0 /0

/0 /0

! !

! ";*'K6.5(1*.+(9'6.-+'-:'+;*'!"#$%&'(#)*$!!)#

! !':3(9()L'1.23%(45*(#.1."2 K90(+-./'40-.+'!MN

! G.*'%69+-49,$!55'4*)'39032'3,39*

! 678 #OOOE@PQ'30149-(.+

! C+)*(1'4)03*::0):'()*'/)064*5'-.+0'&+,"-.

(#)*$!!)#!

! %69+-E4)03*::0):')6.'-.'/9',&%"#:1;(5

! !'.61B*)'0K'169+-E4)03*::0):'K0)1'('/$0-*$

%69+-EJ)03*::0)

<(3.1;(*1!"#$%&

'()"*+

!

/;*($)&0*"#(11"*

/=$*(>&'()"*+

?%"@$%&'()"*+

A"21;$2;&'()"*+

8(B;C*(&'()"*+

/;*($)&0*"#(11"*1&=$-(&$##(11&;"D

'()"*+&8+5( E##(11 /=$*.23

R*/-:+*): R*(5$S)-+* J)-I(+*

M03(9'%*10), R*(5$S)-+* J)-I(+*

C;()*5'%*10), R*(5$S)-+* %69+-EJ)03*::0)

T90B(9'%*10), R*(5$S)-+* &*I-3*

80.:+(.+'%*10), R*(5 &*I-3*

"*U+6)*'%*10), R*(5 &*I-3*

API

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/D/#D/$$0

#

! !"#$%&''(!!"#$%"&''(%&$#"!"#$%&)#)(*+! ,&-"&'.("&''(%&$#"%&&%')#)(*+"/012

! 3**&+."&*#"%*#&$#4"56$7"&".8#%696%"564$7"&-4"7#6:7$"&-4"#'#)#-$"$+8#

! ;#)(*+"'&+(<$"6."(8$6)6=#4"/#>:>"8&%?6-:2"@+"*<-$6)#

! !"&))*+,)$*-$! !"&))*+.$/-)(+! !"#$%!0+.-(&! !"#$%!0+1-(&!"#

! 3")(4<'#"6."&"@'(@"(9"ABC"%(4#D4&$&"&'(-:"

56$7".()#"$+8#"6-9(*)&$6(-

! >%<@6- 96'#.

! 3")(4<'#"6."%*#&$#4"@+"'(&46-:"&"%<@6- 56$7"

!"#(2"'$,)$*-$ (*"!"#(2"'$3(*2.*-*

! ;(4<'#"%&-"@#"<-'(&4#4"56$7"

!"#(2"'$45'(*2

! E(&46-:"&")(4<'#"&'.("%(86#."6$"$("$7#"4#F6%#

! ,&-"$7#-":#$"$7#"&44*#.."(9"9<-%$6(-."&-4"

:'(@&'"F&*6&@'#.G

!"#(2"'$6$-7"5!-8(5

!"#(2"'$6$-6'(9*'

!"#(2"'$6$-:$;<$=

! H-%#"&")(4<'#"6."'(&4#4!"&-4"5#"7&F#"&"

9<-%$6(-"8(6-$#*!"5#"%&-"%&''"&"9<-%$6(-

! I#")<.$".#$<8"$7#"!"!#$%&'()!(*&+'(,!(%)

96*.$

! JK#%<$6(-"#-F6*(-)#-$"6-%'<4#.G

" L7*#&4"M'(%?"N6=#

" N7&*#4";#)(*+"N6=#

" O<-%$6(-"B&*&)#$#*.

" A*64"N6=#

! L7*#&4"M'(%?"N6=#G"

!"7"5!>$-?'(!@>A*0$

! N7&*#4";#)(*+"N6=#G

!"7"5!>$->A*)$2>8B$

! O<-%$6(-"B&*&)#$#*.G

!"C*)*%>$->8B$DE!"C*)*%>$-8DE

!"C*)*%>$-=DE!"C*)*%>$-F

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

#

! !"#$!%&'()*'+),-./'+0'1(2*'('3014*+-./'

4)0563+7''890:*'"0'+;*'%*+(9

! <-):+')*9*(:*'=>?$>@A'B01B*5

! C*30.5')*9*(:*'-.'D?$>@')*EF)-++*.

! G4*.'C06)3*

! H0+',*+'('I-(B9*':096+-0.

&*I-3*

%69+-EJ)03*::0) %69+-EJ)03*::0)

!

!"#$%&'()"*+ !"#$%&'()"*+

,(-.#(&'()"*+

/0 /0

/0 /0

/0 /0

! !

/0 /0

/0 /0

/0 /0

! !

%69+-EJ)03*::0)

!"#$%&'()"*+

/0 /0

/0 /0

/0 /0

! !

! ";*'K6.5(1*.+(9'6.-+'-:'+;*'!"#$%&'(#)*$!!)#

! !':3(9()L'1.23%(45*(#.1."2 K90(+-./'40-.+'!MN

! G.*'%69+-49,$!55'4*)'39032'3,39*

! 678 #OOOE@PQ'30149-(.+

! C+)*(1'4)03*::0):'()*'/)064*5'-.+0'&+,"-.

(#)*$!!)#!

! %69+-E4)03*::0):')6.'-.'/9',&%"#:1;(5

! !'.61B*)'0K'169+-E4)03*::0):'K0)1'('/$0-*$

%69+-EJ)03*::0)

<(3.1;(*1!"#$%&

'()"*+

!

/;*($)&0*"#(11"*

/=$*(>&'()"*+

?%"@$%&'()"*+

A"21;$2;&'()"*+

8(B;C*(&'()"*+

/;*($)&0*"#(11"*1&=$-(&$##(11&;"D

'()"*+&8+5( E##(11 /=$*.23

R*/-:+*): R*(5$S)-+* J)-I(+*

M03(9'%*10), R*(5$S)-+* J)-I(+*

C;()*5'%*10), R*(5$S)-+* %69+-EJ)03*::0)

T90B(9'%*10), R*(5$S)-+* &*I-3*

80.:+(.+'%*10), R*(5 &*I-3*

"*U+6)*'%*10), R*(5 &*I-3*

API

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/D/#D/$$0

#

! !"#$%&''(!!"#$%"&''(%&$#"!"#$%&)#)(*+! ,&-"&'.("&''(%&$#"%&&%')#)(*+"/012

! 3**&+."&*#"%*#&$#4"56$7"&".8#%696%"564$7"&-4"7#6:7$"&-4"#'#)#-$"$+8#

! ;#)(*+"'&+(<$"6."(8$6)6=#4"/#>:>"8&%?6-:2"@+"*<-$6)#

! !"&))*+,)$*-$! !"&))*+.$/-)(+! !"#$%!0+.-(&! !"#$%!0+1-(&!"#

! 3")(4<'#"6."&"@'(@"(9"ABC"%(4#D4&$&"&'(-:"

56$7".()#"$+8#"6-9(*)&$6(-

! >%<@6- 96'#.

! 3")(4<'#"6."%*#&$#4"@+"'(&46-:"&"%<@6- 56$7"

!"#(2"'$,)$*-$ (*"!"#(2"'$3(*2.*-*

! ;(4<'#"%&-"@#"<-'(&4#4"56$7"

!"#(2"'$45'(*2

! E(&46-:"&")(4<'#"&'.("%(86#."6$"$("$7#"4#F6%#

! ,&-"$7#-":#$"$7#"&44*#.."(9"9<-%$6(-."&-4"

:'(@&'"F&*6&@'#.G

!"#(2"'$6$-7"5!-8(5

!"#(2"'$6$-6'(9*'

!"#(2"'$6$-:$;<$=

! H-%#"&")(4<'#"6."'(&4#4!"&-4"5#"7&F#"&"

9<-%$6(-"8(6-$#*!"5#"%&-"%&''"&"9<-%$6(-

! I#")<.$".#$<8"$7#"!"!#$%&'()!(*&+'(,!(%)

96*.$

! JK#%<$6(-"#-F6*(-)#-$"6-%'<4#.G

" L7*#&4"M'(%?"N6=#

" N7&*#4";#)(*+"N6=#

" O<-%$6(-"B&*&)#$#*.

" A*64"N6=#

! L7*#&4"M'(%?"N6=#G"

!"7"5!>$-?'(!@>A*0$

! N7&*#4";#)(*+"N6=#G

!"7"5!>$->A*)$2>8B$

! O<-%$6(-"B&*&)#$#*.G

!"C*)*%>$->8B$DE!"C*)*%>$-8DE

!"C*)*%>$-=DE!"C*)*%>$-F

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

#

! !"#$!%&'()*'+),-./'+0'1(2*'('3014*+-./'

4)0563+7''890:*'"0'+;*'%*+(9

! <-):+')*9*(:*'=>?$>@A'B01B*5

! C*30.5')*9*(:*'-.'D?$>@')*EF)-++*.

! G4*.'C06)3*

! H0+',*+'('I-(B9*':096+-0.

&*I-3*

%69+-EJ)03*::0) %69+-EJ)03*::0)

!

!"#$%&'()"*+ !"#$%&'()"*+

,(-.#(&'()"*+

/0 /0

/0 /0

/0 /0

! !

/0 /0

/0 /0

/0 /0

! !

%69+-EJ)03*::0)

!"#$%&'()"*+

/0 /0

/0 /0

/0 /0

! !

! ";*'K6.5(1*.+(9'6.-+'-:'+;*'!"#$%&'(#)*$!!)#

! !':3(9()L'1.23%(45*(#.1."2 K90(+-./'40-.+'!MN

! G.*'%69+-49,$!55'4*)'39032'3,39*

! 678 #OOOE@PQ'30149-(.+

! C+)*(1'4)03*::0):'()*'/)064*5'-.+0'&+,"-.

(#)*$!!)#!

! %69+-E4)03*::0):')6.'-.'/9',&%"#:1;(5

! !'.61B*)'0K'169+-E4)03*::0):'K0)1'('/$0-*$

%69+-EJ)03*::0)

<(3.1;(*1!"#$%&

'()"*+

!

/;*($)&0*"#(11"*

/=$*(>&'()"*+

?%"@$%&'()"*+

A"21;$2;&'()"*+

8(B;C*(&'()"*+

/;*($)&0*"#(11"*1&=$-(&$##(11&;"D

'()"*+&8+5( E##(11 /=$*.23

R*/-:+*): R*(5$S)-+* J)-I(+*

M03(9'%*10), R*(5$S)-+* J)-I(+*

C;()*5'%*10), R*(5$S)-+* %69+-EJ)03*::0)

T90B(9'%*10), R*(5$S)-+* &*I-3*

80.:+(.+'%*10), R*(5 &*I-3*

"*U+6)*'%*10), R*(5 &*I-3*

API

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/D/#D/$$0

#

! !"#$%&''(!!"#$%"&''(%&$#"!"#$%&)#)(*+! ,&-"&'.("&''(%&$#"%&&%')#)(*+"/012

! 3**&+."&*#"%*#&$#4"56$7"&".8#%696%"564$7"&-4"7#6:7$"&-4"#'#)#-$"$+8#

! ;#)(*+"'&+(<$"6."(8$6)6=#4"/#>:>"8&%?6-:2"@+"*<-$6)#

! !"&))*+,)$*-$! !"&))*+.$/-)(+! !"#$%!0+.-(&! !"#$%!0+1-(&!"#

! 3")(4<'#"6."&"@'(@"(9"ABC"%(4#D4&$&"&'(-:"

56$7".()#"$+8#"6-9(*)&$6(-

! >%<@6- 96'#.

! 3")(4<'#"6."%*#&$#4"@+"'(&46-:"&"%<@6- 56$7"

!"#(2"'$,)$*-$ (*"!"#(2"'$3(*2.*-*

! ;(4<'#"%&-"@#"<-'(&4#4"56$7"

!"#(2"'$45'(*2

! E(&46-:"&")(4<'#"&'.("%(86#."6$"$("$7#"4#F6%#

! ,&-"$7#-":#$"$7#"&44*#.."(9"9<-%$6(-."&-4"

:'(@&'"F&*6&@'#.G

!"#(2"'$6$-7"5!-8(5

!"#(2"'$6$-6'(9*'

!"#(2"'$6$-:$;<$=

! H-%#"&")(4<'#"6."'(&4#4!"&-4"5#"7&F#"&"

9<-%$6(-"8(6-$#*!"5#"%&-"%&''"&"9<-%$6(-

! I#")<.$".#$<8"$7#"!"!#$%&'()!(*&+'(,!(%)

96*.$

! JK#%<$6(-"#-F6*(-)#-$"6-%'<4#.G

" L7*#&4"M'(%?"N6=#

" N7&*#4";#)(*+"N6=#

" O<-%$6(-"B&*&)#$#*.

" A*64"N6=#

! L7*#&4"M'(%?"N6=#G"

!"7"5!>$-?'(!@>A*0$

! N7&*#4";#)(*+"N6=#G

!"7"5!>$->A*)$2>8B$

! O<-%$6(-"B&*&)#$#*.G

!"C*)*%>$->8B$DE!"C*)*%>$-8DE

!"C*)*%>$-=DE!"C*)*%>$-F

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

#

! !"#$!%&'()*'+),-./'+0'1(2*'('3014*+-./'

4)0563+7''890:*'"0'+;*'%*+(9

! <-):+')*9*(:*'=>?$>@A'B01B*5

! C*30.5')*9*(:*'-.'D?$>@')*EF)-++*.

! G4*.'C06)3*

! H0+',*+'('I-(B9*':096+-0.

&*I-3*

%69+-EJ)03*::0) %69+-EJ)03*::0)

!

!"#$%&'()"*+ !"#$%&'()"*+

,(-.#(&'()"*+

/0 /0

/0 /0

/0 /0

! !

/0 /0

/0 /0

/0 /0

! !

%69+-EJ)03*::0)

!"#$%&'()"*+

/0 /0

/0 /0

/0 /0

! !

! ";*'K6.5(1*.+(9'6.-+'-:'+;*'!"#$%&'(#)*$!!)#

! !':3(9()L'1.23%(45*(#.1."2 K90(+-./'40-.+'!MN

! G.*'%69+-49,$!55'4*)'39032'3,39*

! 678 #OOOE@PQ'30149-(.+

! C+)*(1'4)03*::0):'()*'/)064*5'-.+0'&+,"-.

(#)*$!!)#!

! %69+-E4)03*::0):')6.'-.'/9',&%"#:1;(5

! !'.61B*)'0K'169+-E4)03*::0):'K0)1'('/$0-*$

%69+-EJ)03*::0)

<(3.1;(*1!"#$%&

'()"*+

!

/;*($)&0*"#(11"*

/=$*(>&'()"*+

?%"@$%&'()"*+

A"21;$2;&'()"*+

8(B;C*(&'()"*+

/;*($)&0*"#(11"*1&=$-(&$##(11&;"D

'()"*+&8+5( E##(11 /=$*.23

R*/-:+*): R*(5$S)-+* J)-I(+*

M03(9'%*10), R*(5$S)-+* J)-I(+*

C;()*5'%*10), R*(5$S)-+* %69+-EJ)03*::0)

T90B(9'%*10), R*(5$S)-+* &*I-3*

80.:+(.+'%*10), R*(5 &*I-3*

"*U+6)*'%*10), R*(5 &*I-3*

API

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/D/#D/$$0

#

! !"#$%&''(!!"#$%"&''(%&$#"!"#$%&)#)(*+! ,&-"&'.("&''(%&$#"%&&%')#)(*+"/012

! 3**&+."&*#"%*#&$#4"56$7"&".8#%696%"564$7"&-4"7#6:7$"&-4"#'#)#-$"$+8#

! ;#)(*+"'&+(<$"6."(8$6)6=#4"/#>:>"8&%?6-:2"@+"*<-$6)#

! !"&))*+,)$*-$! !"&))*+.$/-)(+! !"#$%!0+.-(&! !"#$%!0+1-(&!"#

! 3")(4<'#"6."&"@'(@"(9"ABC"%(4#D4&$&"&'(-:"

56$7".()#"$+8#"6-9(*)&$6(-

! >%<@6- 96'#.

! 3")(4<'#"6."%*#&$#4"@+"'(&46-:"&"%<@6- 56$7"

!"#(2"'$,)$*-$ (*"!"#(2"'$3(*2.*-*

! ;(4<'#"%&-"@#"<-'(&4#4"56$7"

!"#(2"'$45'(*2

! E(&46-:"&")(4<'#"&'.("%(86#."6$"$("$7#"4#F6%#

! ,&-"$7#-":#$"$7#"&44*#.."(9"9<-%$6(-."&-4"

:'(@&'"F&*6&@'#.G

!"#(2"'$6$-7"5!-8(5

!"#(2"'$6$-6'(9*'

!"#(2"'$6$-:$;<$=

! H-%#"&")(4<'#"6."'(&4#4!"&-4"5#"7&F#"&"

9<-%$6(-"8(6-$#*!"5#"%&-"%&''"&"9<-%$6(-

! I#")<.$".#$<8"$7#"!"!#$%&'()!(*&+'(,!(%)

96*.$

! JK#%<$6(-"#-F6*(-)#-$"6-%'<4#.G

" L7*#&4"M'(%?"N6=#

" N7&*#4";#)(*+"N6=#

" O<-%$6(-"B&*&)#$#*.

" A*64"N6=#

! L7*#&4"M'(%?"N6=#G"

!"7"5!>$-?'(!@>A*0$

! N7&*#4";#)(*+"N6=#G

!"7"5!>$->A*)$2>8B$

! O<-%$6(-"B&*&)#$#*.G

!"C*)*%>$->8B$DE!"C*)*%>$-8DE

!"C*)*%>$-=DE!"C*)*%>$-F

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

#

! !"#$!%&'()*'+),-./'+0'1(2*'('3014*+-./'

4)0563+7''890:*'"0'+;*'%*+(9

! <-):+')*9*(:*'=>?$>@A'B01B*5

! C*30.5')*9*(:*'-.'D?$>@')*EF)-++*.

! G4*.'C06)3*

! H0+',*+'('I-(B9*':096+-0.

&*I-3*

%69+-EJ)03*::0) %69+-EJ)03*::0)

!

!"#$%&'()"*+ !"#$%&'()"*+

,(-.#(&'()"*+

/0 /0

/0 /0

/0 /0

! !

/0 /0

/0 /0

/0 /0

! !

%69+-EJ)03*::0)

!"#$%&'()"*+

/0 /0

/0 /0

/0 /0

! !

! ";*'K6.5(1*.+(9'6.-+'-:'+;*'!"#$%&'(#)*$!!)#

! !':3(9()L'1.23%(45*(#.1."2 K90(+-./'40-.+'!MN

! G.*'%69+-49,$!55'4*)'39032'3,39*

! 678 #OOOE@PQ'30149-(.+

! C+)*(1'4)03*::0):'()*'/)064*5'-.+0'&+,"-.

(#)*$!!)#!

! %69+-E4)03*::0):')6.'-.'/9',&%"#:1;(5

! !'.61B*)'0K'169+-E4)03*::0):'K0)1'('/$0-*$

%69+-EJ)03*::0)

<(3.1;(*1!"#$%&

'()"*+

!

/;*($)&0*"#(11"*

/=$*(>&'()"*+

?%"@$%&'()"*+

A"21;$2;&'()"*+

8(B;C*(&'()"*+

/;*($)&0*"#(11"*1&=$-(&$##(11&;"D

'()"*+&8+5( E##(11 /=$*.23

R*/-:+*): R*(5$S)-+* J)-I(+*

M03(9'%*10), R*(5$S)-+* J)-I(+*

C;()*5'%*10), R*(5$S)-+* %69+-EJ)03*::0)

T90B(9'%*10), R*(5$S)-+* &*I-3*

80.:+(.+'%*10), R*(5 &*I-3*

"*U+6)*'%*10), R*(5 &*I-3*

API

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/D/#D/$$0

#

! !"#$%&''(!!"#$%"&''(%&$#"!"#$%&)#)(*+! ,&-"&'.("&''(%&$#"%&&%')#)(*+"/012

! 3**&+."&*#"%*#&$#4"56$7"&".8#%696%"564$7"&-4"7#6:7$"&-4"#'#)#-$"$+8#

! ;#)(*+"'&+(<$"6."(8$6)6=#4"/#>:>"8&%?6-:2"@+"*<-$6)#

! !"&))*+,)$*-$! !"&))*+.$/-)(+! !"#$%!0+.-(&! !"#$%!0+1-(&!"#

! 3")(4<'#"6."&"@'(@"(9"ABC"%(4#D4&$&"&'(-:"

56$7".()#"$+8#"6-9(*)&$6(-

! >%<@6- 96'#.

! 3")(4<'#"6."%*#&$#4"@+"'(&46-:"&"%<@6- 56$7"

!"#(2"'$,)$*-$ (*"!"#(2"'$3(*2.*-*

! ;(4<'#"%&-"@#"<-'(&4#4"56$7"

!"#(2"'$45'(*2

! E(&46-:"&")(4<'#"&'.("%(86#."6$"$("$7#"4#F6%#

! ,&-"$7#-":#$"$7#"&44*#.."(9"9<-%$6(-."&-4"

:'(@&'"F&*6&@'#.G

!"#(2"'$6$-7"5!-8(5

!"#(2"'$6$-6'(9*'

!"#(2"'$6$-:$;<$=

! H-%#"&")(4<'#"6."'(&4#4!"&-4"5#"7&F#"&"

9<-%$6(-"8(6-$#*!"5#"%&-"%&''"&"9<-%$6(-

! I#")<.$".#$<8"$7#"!"!#$%&'()!(*&+'(,!(%)

96*.$

! JK#%<$6(-"#-F6*(-)#-$"6-%'<4#.G

" L7*#&4"M'(%?"N6=#

" N7&*#4";#)(*+"N6=#

" O<-%$6(-"B&*&)#$#*.

" A*64"N6=#

! L7*#&4"M'(%?"N6=#G"

!"7"5!>$-?'(!@>A*0$

! N7&*#4";#)(*+"N6=#G

!"7"5!>$->A*)$2>8B$

! O<-%$6(-"B&*&)#$#*.G

!"C*)*%>$->8B$DE!"C*)*%>$-8DE

!"C*)*%>$-=DE!"C*)*%>$-F!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

#

! !"#$!%&'()*'+),-./'+0'1(2*'('3014*+-./'

4)0563+7''890:*'"0'+;*'%*+(9

! <-):+')*9*(:*'=>?$>@A'B01B*5

! C*30.5')*9*(:*'-.'D?$>@')*EF)-++*.

! G4*.'C06)3*

! H0+',*+'('I-(B9*':096+-0.

&*I-3*

%69+-EJ)03*::0) %69+-EJ)03*::0)

!

!"#$%&'()"*+ !"#$%&'()"*+

,(-.#(&'()"*+

/0 /0

/0 /0

/0 /0

! !

/0 /0

/0 /0

/0 /0

! !

%69+-EJ)03*::0)

!"#$%&'()"*+

/0 /0

/0 /0

/0 /0

! !

! ";*'K6.5(1*.+(9'6.-+'-:'+;*'!"#$%&'(#)*$!!)#

! !':3(9()L'1.23%(45*(#.1."2 K90(+-./'40-.+'!MN

! G.*'%69+-49,$!55'4*)'39032'3,39*

! 678 #OOOE@PQ'30149-(.+

! C+)*(1'4)03*::0):'()*'/)064*5'-.+0'&+,"-.

(#)*$!!)#!

! %69+-E4)03*::0):')6.'-.'/9',&%"#:1;(5

! !'.61B*)'0K'169+-E4)03*::0):'K0)1'('/$0-*$

%69+-EJ)03*::0)

<(3.1;(*1!"#$%&

'()"*+

!

/;*($)&0*"#(11"*

/=$*(>&'()"*+

?%"@$%&'()"*+

A"21;$2;&'()"*+

8(B;C*(&'()"*+

/;*($)&0*"#(11"*1&=$-(&$##(11&;"D

'()"*+&8+5( E##(11 /=$*.23

R*/-:+*): R*(5$S)-+* J)-I(+*

M03(9'%*10), R*(5$S)-+* J)-I(+*

C;()*5'%*10), R*(5$S)-+* %69+-EJ)03*::0)

T90B(9'%*10), R*(5$S)-+* &*I-3*

80.:+(.+'%*10), R*(5 &*I-3*

"*U+6)*'%*10), R*(5 &*I-3*

API

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/D/#D/$$0

#

! !"#$%&''(!!"#$%"&''(%&$#"!"#$%&)#)(*+! ,&-"&'.("&''(%&$#"%&&%')#)(*+"/012

! 3**&+."&*#"%*#&$#4"56$7"&".8#%696%"564$7"&-4"7#6:7$"&-4"#'#)#-$"$+8#

! ;#)(*+"'&+(<$"6."(8$6)6=#4"/#>:>"8&%?6-:2"@+"*<-$6)#

! !"&))*+,)$*-$! !"&))*+.$/-)(+! !"#$%!0+.-(&! !"#$%!0+1-(&!"#

! 3")(4<'#"6."&"@'(@"(9"ABC"%(4#D4&$&"&'(-:"

56$7".()#"$+8#"6-9(*)&$6(-

! >%<@6- 96'#.

! 3")(4<'#"6."%*#&$#4"@+"'(&46-:"&"%<@6- 56$7"

!"#(2"'$,)$*-$ (*"!"#(2"'$3(*2.*-*

! ;(4<'#"%&-"@#"<-'(&4#4"56$7"

!"#(2"'$45'(*2

! E(&46-:"&")(4<'#"&'.("%(86#."6$"$("$7#"4#F6%#

! ,&-"$7#-":#$"$7#"&44*#.."(9"9<-%$6(-."&-4"

:'(@&'"F&*6&@'#.G

!"#(2"'$6$-7"5!-8(5

!"#(2"'$6$-6'(9*'

!"#(2"'$6$-:$;<$=

! H-%#"&")(4<'#"6."'(&4#4!"&-4"5#"7&F#"&"

9<-%$6(-"8(6-$#*!"5#"%&-"%&''"&"9<-%$6(-

! I#")<.$".#$<8"$7#"!"!#$%&'()!(*&+'(,!(%)

96*.$

! JK#%<$6(-"#-F6*(-)#-$"6-%'<4#.G

" L7*#&4"M'(%?"N6=#

" N7&*#4";#)(*+"N6=#

" O<-%$6(-"B&*&)#$#*.

" A*64"N6=#

! L7*#&4"M'(%?"N6=#G"

!"7"5!>$-?'(!@>A*0$

! N7&*#4";#)(*+"N6=#G

!"7"5!>$->A*)$2>8B$

! O<-%$6(-"B&*&)#$#*.G

!"C*)*%>$->8B$DE!"C*)*%>$-8DE

!"C*)*%>$-=DE!"C*)*%>$-F!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

#

! !"#$!%&'()*'+),-./'+0'1(2*'('3014*+-./'

4)0563+7''890:*'"0'+;*'%*+(9

! <-):+')*9*(:*'=>?$>@A'B01B*5

! C*30.5')*9*(:*'-.'D?$>@')*EF)-++*.

! G4*.'C06)3*

! H0+',*+'('I-(B9*':096+-0.

&*I-3*

%69+-EJ)03*::0) %69+-EJ)03*::0)

!

!"#$%&'()"*+ !"#$%&'()"*+

,(-.#(&'()"*+

/0 /0

/0 /0

/0 /0

! !

/0 /0

/0 /0

/0 /0

! !

%69+-EJ)03*::0)

!"#$%&'()"*+

/0 /0

/0 /0

/0 /0

! !

! ";*'K6.5(1*.+(9'6.-+'-:'+;*'!"#$%&'(#)*$!!)#

! !':3(9()L'1.23%(45*(#.1."2 K90(+-./'40-.+'!MN

! G.*'%69+-49,$!55'4*)'39032'3,39*

! 678 #OOOE@PQ'30149-(.+

! C+)*(1'4)03*::0):'()*'/)064*5'-.+0'&+,"-.

(#)*$!!)#!

! %69+-E4)03*::0):')6.'-.'/9',&%"#:1;(5

! !'.61B*)'0K'169+-E4)03*::0):'K0)1'('/$0-*$

%69+-EJ)03*::0)

<(3.1;(*1!"#$%&

'()"*+

!

/;*($)&0*"#(11"*

/=$*(>&'()"*+

?%"@$%&'()"*+

A"21;$2;&'()"*+

8(B;C*(&'()"*+

/;*($)&0*"#(11"*1&=$-(&$##(11&;"D

'()"*+&8+5( E##(11 /=$*.23

R*/-:+*): R*(5$S)-+* J)-I(+*

M03(9'%*10), R*(5$S)-+* J)-I(+*

C;()*5'%*10), R*(5$S)-+* %69+-EJ)03*::0)

T90B(9'%*10), R*(5$S)-+* &*I-3*

80.:+(.+'%*10), R*(5 &*I-3*

"*U+6)*'%*10), R*(5 &*I-3*

API

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/D/#D/$$0

'

! !"#$%&#'(%#)%)(*%+*%*,(%)+-(%*#-(%+)%*,(%

./01*#20%#0321+*#204

!"#$"%!&'()*

! +,!$--. !"#$%&#'()*+,#-*#%."#&+*/#01*#2223444#

'&"%0(5"#("65%.0(5"#758*9.059:

! 5,(%12-6#7("%8(0("+*()%1+77)%*2%+77%$(3#1(%9:;%

*2%)(*/6%*,(%(<(1/*#20%(03#"20-(0*

! 9%)*"(+-%#)%+%)(=/(01(%2.%26("+*#20)%*,+*%

211/"%#0%2"$("%%>?8?

@? A26B%$+*+%."2-%,2)*%*2%$(3#1(

C? ><(1/*(%$(3#1(%./01*#20%

D? A26B%$+*+%."2-%$(3#1(%*2%,2)*

! 9%)*"(+-%#)%+%)(=/(01(%2.%26("+*#20)%*,+*%

211/"%#0%2"$("%%>?8?

@? A26B%$+*+%."2-%,2)*%*2%$(3#1(

C? ><(1/*(%$(3#1(%./01*#20%

D? A26B%$+*+%."2-%$(3#1(%*2%,2)*

! 9%)*"(+-%#)%+%)(=/(01(%2.%26("+*#20)%*,+*%

211/"%#0%2"$("

! E#..("(0*%)*"(+-)%1+0%F(%/)($%*2%-+0+8(%

1201/""(01B%%>?8?

G3("7+66#08%-(-2"B%126B%."2-%20(%)*"(+-%H#*,%*,(%./01*#20%(<(1/*#20%."2-%+02*,("

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

#

! !"#$!%&'()*'+),-./'+0'1(2*'('3014*+-./'

4)0563+7''890:*'"0'+;*'%*+(9

! <-):+')*9*(:*'=>?$>@A'B01B*5

! C*30.5')*9*(:*'-.'D?$>@')*EF)-++*.

! G4*.'C06)3*

! H0+',*+'('I-(B9*':096+-0.

&*I-3*

%69+-EJ)03*::0) %69+-EJ)03*::0)

!

!"#$%&'()"*+ !"#$%&'()"*+

,(-.#(&'()"*+

/0 /0

/0 /0

/0 /0

! !

/0 /0

/0 /0

/0 /0

! !

%69+-EJ)03*::0)

!"#$%&'()"*+

/0 /0

/0 /0

/0 /0

! !

! ";*'K6.5(1*.+(9'6.-+'-:'+;*'!"#$%&'(#)*$!!)#

! !':3(9()L'1.23%(45*(#.1."2 K90(+-./'40-.+'!MN

! G.*'%69+-49,$!55'4*)'39032'3,39*

! 678 #OOOE@PQ'30149-(.+

! C+)*(1'4)03*::0):'()*'/)064*5'-.+0'&+,"-.

(#)*$!!)#!

! %69+-E4)03*::0):')6.'-.'/9',&%"#:1;(5

! !'.61B*)'0K'169+-E4)03*::0):'K0)1'('/$0-*$

%69+-EJ)03*::0)

<(3.1;(*1!"#$%&

'()"*+

!

/;*($)&0*"#(11"*

/=$*(>&'()"*+

?%"@$%&'()"*+

A"21;$2;&'()"*+

8(B;C*(&'()"*+

/;*($)&0*"#(11"*1&=$-(&$##(11&;"D

'()"*+&8+5( E##(11 /=$*.23

R*/-:+*): R*(5$S)-+* J)-I(+*

M03(9'%*10), R*(5$S)-+* J)-I(+*

C;()*5'%*10), R*(5$S)-+* %69+-EJ)03*::0)

T90B(9'%*10), R*(5$S)-+* &*I-3*

80.:+(.+'%*10), R*(5 &*I-3*

"*U+6)*'%*10), R*(5 &*I-3*

API

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/D/#D/$$0

'

! !"#$%&#'(%#)%)(*%+*%*,(%)+-(%*#-(%+)%*,(%

./01*#20%#0321+*#204

!"#$"%!&'()*

! +,!$--. !"#$%&#'()*+,#-*#%."#&+*/#01*#2223444#

'&"%0(5"#("65%.0(5"#758*9.059:

! 5,(%12-6#7("%8(0("+*()%1+77)%*2%+77%$(3#1(%9:;%

*2%)(*/6%*,(%(<(1/*#20%(03#"20-(0*

! 9%)*"(+-%#)%+%)(=/(01(%2.%26("+*#20)%*,+*%

211/"%#0%2"$("%%>?8?

@? A26B%$+*+%."2-%,2)*%*2%$(3#1(

C? ><(1/*(%$(3#1(%./01*#20%

D? A26B%$+*+%."2-%$(3#1(%*2%,2)*

! 9%)*"(+-%#)%+%)(=/(01(%2.%26("+*#20)%*,+*%

211/"%#0%2"$("%%>?8?

@? A26B%$+*+%."2-%,2)*%*2%$(3#1(

C? ><(1/*(%$(3#1(%./01*#20%

D? A26B%$+*+%."2-%$(3#1(%*2%,2)*

! 9%)*"(+-%#)%+%)(=/(01(%2.%26("+*#20)%*,+*%

211/"%#0%2"$("

! E#..("(0*%)*"(+-)%1+0%F(%/)($%*2%-+0+8(%

1201/""(01B%%>?8?

G3("7+66#08%-(-2"B%126B%."2-%20(%)*"(+-%H#*,%*,(%./01*#20%(<(1/*#20%."2-%+02*,("

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

#

! !"#$!%&'()*'+),-./'+0'1(2*'('3014*+-./'

4)0563+7''890:*'"0'+;*'%*+(9

! <-):+')*9*(:*'=>?$>@A'B01B*5

! C*30.5')*9*(:*'-.'D?$>@')*EF)-++*.

! G4*.'C06)3*

! H0+',*+'('I-(B9*':096+-0.

&*I-3*

%69+-EJ)03*::0) %69+-EJ)03*::0)

!

!"#$%&'()"*+ !"#$%&'()"*+

,(-.#(&'()"*+

/0 /0

/0 /0

/0 /0

! !

/0 /0

/0 /0

/0 /0

! !

%69+-EJ)03*::0)

!"#$%&'()"*+

/0 /0

/0 /0

/0 /0

! !

! ";*'K6.5(1*.+(9'6.-+'-:'+;*'!"#$%&'(#)*$!!)#

! !':3(9()L'1.23%(45*(#.1."2 K90(+-./'40-.+'!MN

! G.*'%69+-49,$!55'4*)'39032'3,39*

! 678 #OOOE@PQ'30149-(.+

! C+)*(1'4)03*::0):'()*'/)064*5'-.+0'&+,"-.

(#)*$!!)#!

! %69+-E4)03*::0):')6.'-.'/9',&%"#:1;(5

! !'.61B*)'0K'169+-E4)03*::0):'K0)1'('/$0-*$

%69+-EJ)03*::0)

<(3.1;(*1!"#$%&

'()"*+

!

/;*($)&0*"#(11"*

/=$*(>&'()"*+

?%"@$%&'()"*+

A"21;$2;&'()"*+

8(B;C*(&'()"*+

/;*($)&0*"#(11"*1&=$-(&$##(11&;"D

'()"*+&8+5( E##(11 /=$*.23

R*/-:+*): R*(5$S)-+* J)-I(+*

M03(9'%*10), R*(5$S)-+* J)-I(+*

C;()*5'%*10), R*(5$S)-+* %69+-EJ)03*::0)

T90B(9'%*10), R*(5$S)-+* &*I-3*

80.:+(.+'%*10), R*(5 &*I-3*

"*U+6)*'%*10), R*(5 &*I-3*

API

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/D/#D/$$0

'

! !"#$%&#'(%#)%)(*%+*%*,(%)+-(%*#-(%+)%*,(%

./01*#20%#0321+*#204

!"#$"%!&'()*

! +,!$--. !"#$%&#'()*+,#-*#%."#&+*/#01*#2223444#

'&"%0(5"#("65%.0(5"#758*9.059:

! 5,(%12-6#7("%8(0("+*()%1+77)%*2%+77%$(3#1(%9:;%

*2%)(*/6%*,(%(<(1/*#20%(03#"20-(0*

! 9%)*"(+-%#)%+%)(=/(01(%2.%26("+*#20)%*,+*%

211/"%#0%2"$("%%>?8?

@? A26B%$+*+%."2-%,2)*%*2%$(3#1(

C? ><(1/*(%$(3#1(%./01*#20%

D? A26B%$+*+%."2-%$(3#1(%*2%,2)*

! 9%)*"(+-%#)%+%)(=/(01(%2.%26("+*#20)%*,+*%

211/"%#0%2"$("%%>?8?

@? A26B%$+*+%."2-%,2)*%*2%$(3#1(

C? ><(1/*(%$(3#1(%./01*#20%

D? A26B%$+*+%."2-%$(3#1(%*2%,2)*

! 9%)*"(+-%#)%+%)(=/(01(%2.%26("+*#20)%*,+*%

211/"%#0%2"$("

! E#..("(0*%)*"(+-)%1+0%F(%/)($%*2%-+0+8(%

1201/""(01B%%>?8?

G3("7+66#08%-(-2"B%126B%."2-%20(%)*"(+-%H#*,%*,(%./01*#20%(<(1/*#20%."2-%+02*,("

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

#

! !"#$!%&'()*'+),-./'+0'1(2*'('3014*+-./'

4)0563+7''890:*'"0'+;*'%*+(9

! <-):+')*9*(:*'=>?$>@A'B01B*5

! C*30.5')*9*(:*'-.'D?$>@')*EF)-++*.

! G4*.'C06)3*

! H0+',*+'('I-(B9*':096+-0.

&*I-3*

%69+-EJ)03*::0) %69+-EJ)03*::0)

!

!"#$%&'()"*+ !"#$%&'()"*+

,(-.#(&'()"*+

/0 /0

/0 /0

/0 /0

! !

/0 /0

/0 /0

/0 /0

! !

%69+-EJ)03*::0)

!"#$%&'()"*+

/0 /0

/0 /0

/0 /0

! !

! ";*'K6.5(1*.+(9'6.-+'-:'+;*'!"#$%&'(#)*$!!)#

! !':3(9()L'1.23%(45*(#.1."2 K90(+-./'40-.+'!MN

! G.*'%69+-49,$!55'4*)'39032'3,39*

! 678 #OOOE@PQ'30149-(.+

! C+)*(1'4)03*::0):'()*'/)064*5'-.+0'&+,"-.

(#)*$!!)#!

! %69+-E4)03*::0):')6.'-.'/9',&%"#:1;(5

! !'.61B*)'0K'169+-E4)03*::0):'K0)1'('/$0-*$

%69+-EJ)03*::0)

<(3.1;(*1!"#$%&

'()"*+

!

/;*($)&0*"#(11"*

/=$*(>&'()"*+

?%"@$%&'()"*+

A"21;$2;&'()"*+

8(B;C*(&'()"*+

/;*($)&0*"#(11"*1&=$-(&$##(11&;"D

'()"*+&8+5( E##(11 /=$*.23

R*/-:+*): R*(5$S)-+* J)-I(+*

M03(9'%*10), R*(5$S)-+* J)-I(+*

C;()*5'%*10), R*(5$S)-+* %69+-EJ)03*::0)

T90B(9'%*10), R*(5$S)-+* &*I-3*

80.:+(.+'%*10), R*(5 &*I-3*

"*U+6)*'%*10), R*(5 &*I-3*

API

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/D/#D/$$0

'

! !"#$%&#'(%#)%)(*%+*%*,(%)+-(%*#-(%+)%*,(%

./01*#20%#0321+*#204

!"#$"%!&'()*

! +,!$--. !"#$%&#'()*+,#-*#%."#&+*/#01*#2223444#

'&"%0(5"#("65%.0(5"#758*9.059:

! 5,(%12-6#7("%8(0("+*()%1+77)%*2%+77%$(3#1(%9:;%

*2%)(*/6%*,(%(<(1/*#20%(03#"20-(0*

! 9%)*"(+-%#)%+%)(=/(01(%2.%26("+*#20)%*,+*%

211/"%#0%2"$("%%>?8?

@? A26B%$+*+%."2-%,2)*%*2%$(3#1(

C? ><(1/*(%$(3#1(%./01*#20%

D? A26B%$+*+%."2-%$(3#1(%*2%,2)*

! 9%)*"(+-%#)%+%)(=/(01(%2.%26("+*#20)%*,+*%

211/"%#0%2"$("%%>?8?

@? A26B%$+*+%."2-%,2)*%*2%$(3#1(

C? ><(1/*(%$(3#1(%./01*#20%

D? A26B%$+*+%."2-%$(3#1(%*2%,2)*

! 9%)*"(+-%#)%+%)(=/(01(%2.%26("+*#20)%*,+*%

211/"%#0%2"$("

! E#..("(0*%)*"(+-)%1+0%F(%/)($%*2%-+0+8(%

1201/""(01B%%>?8?

G3("7+66#08%-(-2"B%126B%."2-%20(%)*"(+-%H#*,%*,(%./01*#20%(<(1/*#20%."2-%+02*,("

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

#

! !"#$!%&'()*'+),-./'+0'1(2*'('3014*+-./'

4)0563+7''890:*'"0'+;*'%*+(9

! <-):+')*9*(:*'=>?$>@A'B01B*5

! C*30.5')*9*(:*'-.'D?$>@')*EF)-++*.

! G4*.'C06)3*

! H0+',*+'('I-(B9*':096+-0.

&*I-3*

%69+-EJ)03*::0) %69+-EJ)03*::0)

!

!"#$%&'()"*+ !"#$%&'()"*+

,(-.#(&'()"*+

/0 /0

/0 /0

/0 /0

! !

/0 /0

/0 /0

/0 /0

! !

%69+-EJ)03*::0)

!"#$%&'()"*+

/0 /0

/0 /0

/0 /0

! !

! ";*'K6.5(1*.+(9'6.-+'-:'+;*'!"#$%&'(#)*$!!)#

! !':3(9()L'1.23%(45*(#.1."2 K90(+-./'40-.+'!MN

! G.*'%69+-49,$!55'4*)'39032'3,39*

! 678 #OOOE@PQ'30149-(.+

! C+)*(1'4)03*::0):'()*'/)064*5'-.+0'&+,"-.

(#)*$!!)#!

! %69+-E4)03*::0):')6.'-.'/9',&%"#:1;(5

! !'.61B*)'0K'169+-E4)03*::0):'K0)1'('/$0-*$

%69+-EJ)03*::0)

<(3.1;(*1!"#$%&

'()"*+

!

/;*($)&0*"#(11"*

/=$*(>&'()"*+

?%"@$%&'()"*+

A"21;$2;&'()"*+

8(B;C*(&'()"*+

/;*($)&0*"#(11"*1&=$-(&$##(11&;"D

'()"*+&8+5( E##(11 /=$*.23

R*/-:+*): R*(5$S)-+* J)-I(+*

M03(9'%*10), R*(5$S)-+* J)-I(+*

C;()*5'%*10), R*(5$S)-+* %69+-EJ)03*::0)

T90B(9'%*10), R*(5$S)-+* &*I-3*

80.:+(.+'%*10), R*(5 &*I-3*

"*U+6)*'%*10), R*(5 &*I-3*

API

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

DEFFE/$$0

F

!"#$%&"'()'*%+,-./0'1"+%#$234

! *56-'-./'.,&$'783

! 9$&",:;

! <="4$;

! >3:"83&?'@4"'62;#%;;234

! A"#$3&BA"#$3&'-++2$234

! A"#$3&BA"#$3&'/44"&'.&3+%#$

" 1"+%#$234

! -';$&",:'2;',';"C%"4#"'3D'3E"&,$234;'$F,$'

3##%&'24'3&+"&''<GHG

IG *3EJ'+,$,'D&3:'F3;$'$3'+"=2#"

KG <L"#%$"'+"=2#"'D%4#$234'

MG *3EJ'+,$,'D&3:'+"=2#"'$3'F3;$

! -';$&",:'2;',';"C%"4#"'3D'3E"&,$234;'$F,$'

3##%&'24'3&+"&

! 62DD"&"4$';$&",:;'#,4'N"'%;"+'$3':,4,H"'

#34#%&&"4#J''<GHG

@="&O,EE24H':":3&J'#3EJ'D&3:'34"';$&",:'82$F'$F"'D%4#$234'"L"#%$234'D&3:',43$F"&

! <="4$;',&"','8,J'3D'+"$"&:2424H'$F"'E&3H&";;'

3D',';$&",:

! !"#$%&'()*"+,#'-'./-)0#)1'+$'-'&%)#-/'-%'-'

;E"#2D2#'E3;2$234

! -'F3O+"&'3D',4'"="4$'F,4+O"'#,4)

! P,2$'D3&',4'"="4$'$3'3##%&

! Q",;%&"'$F"'$2:"'$F,$'3##%&&"+'N"$8""4'$83'

"="4$;

!"#$$%&$'()*+,-.(/$$01(234-5(63*7,-5(8-,9:+5,;<(

=3*<+,.4;(>(?@;;4:A(B3C,;43(/$$0

/DE/D/$$0

#

! !"#$!%&'()*'+),-./'+0'1(2*'('3014*+-./'

4)0563+7''890:*'"0'+;*'%*+(9

! <-):+')*9*(:*'=>?$>@A'B01B*5

! C*30.5')*9*(:*'-.'D?$>@')*EF)-++*.

! G4*.'C06)3*

! H0+',*+'('I-(B9*':096+-0.

&*I-3*

%69+-EJ)03*::0) %69+-EJ)03*::0)

!

!"#$%&'()"*+ !"#$%&'()"*+

,(-.#(&'()"*+

/0 /0

/0 /0

/0 /0

! !

/0 /0

/0 /0

/0 /0

! !

%69+-EJ)03*::0)

!"#$%&'()"*+

/0 /0

/0 /0

/0 /0

! !

! ";*'K6.5(1*.+(9'6.-+'-:'+;*'!"#$%&'(#)*$!!)#

! !':3(9()L'1.23%(45*(#.1."2 K90(+-./'40-.+'!MN

! G.*'%69+-49,$!55'4*)'39032'3,39*

! 678 #OOOE@PQ'30149-(.+

! C+)*(1'4)03*::0):'()*'/)064*5'-.+0'&+,"-.

(#)*$!!)#!

! %69+-E4)03*::0):')6.'-.'/9',&%"#:1;(5

! !'.61B*)'0K'169+-E4)03*::0):'K0)1'('/$0-*$

%69+-EJ)03*::0)

<(3.1;(*1!"#$%&

'()"*+

!

/;*($)&0*"#(11"*

/=$*(>&'()"*+

?%"@$%&'()"*+

A"21;$2;&'()"*+

8(B;C*(&'()"*+

/;*($)&0*"#(11"*1&=$-(&$##(11&;"D

'()"*+&8+5( E##(11 /=$*.23

R*/-:+*): R*(5$S)-+* J)-I(+*

M03(9'%*10), R*(5$S)-+* J)-I(+*

C;()*5'%*10), R*(5$S)-+* %69+-EJ)03*::0)

T90B(9'%*10), R*(5$S)-+* &*I-3*

80.:+(.+'%*10), R*(5 &*I-3*

"*U+6)*'%*10), R*(5 &*I-3*

API