Post on 22-Mar-2018
transcript
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
Kevin Goldsmith | Senior Engineering Manager
Bob Archer | Senior Computer Scientist
Pixel Bender
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
What is Pixel Bender?
A domain specific kernel and graph language for image and video
processing designed to efficiently target current and future
heterogeneous hardware.
2
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
Pixel Bender Kernels & Graphs
3
<languageVersion : 1.0;>
kernel pixelate_sample
<
namespace : "AIF Test";
vendor : "Adobe";
version : 1;>
{
parameter int dimension;
input image4 inputImage;
output pixel4 outputPixel;
void evaluatePixel()
{
float dimAsFloat = float(dimension);
float2 sc = floor(outCoord() /
float2(dimAsFloat, dimAsFloat));
sc *= dimAsFloat;
outputPixel = sampleNearest(inputImage, sc);
}
}
<?xml version="1.0" encoding="utf-8"?>
<graph name = "PixelateGraph"xmlns="http://ns.adobe.com/PixelBenderGraph/1.0">
<metadata name = "namespace" value = "AIF"/>
<metadata name = "vendor" value = "Adobe Systems" />
<metadata name = "version" type = "int" value = "1" />
<parameter type = "int" name = "dimension" >
<metadata name = "defaultValue" type = "int" value = "1" />
<metadata name = "minValue" type = "int" value = "1" />
<metadata name = "maxValue" type = "int" value = "100" />
</parameter>
<inputImage type = "image4" name = "inputImage" />
<outputImage type = "image4" name = "outputImage" />
<kernel>
<![CDATA[
<languageVersion : 1.0;>
kernel Pixelate
<
namespace:"AIF";
vendor:"Adobe Systems";
version:1;
>
{
…
}
]]>
</kernel>
<node id = "pixelateFilter" name ="Pixelate" namespace = "AIF" vendor = "Adobe Systems"
version ="1" clientID ="ADBE Pixelate" >
<evaluateParameters>
<![CDATA[
void evaluateParameters()
{
pixelateFilter::dimension = dimension;
}
]]>
</evaluateParameters>
</node>
<!-- Connect the graph -->
<connect fromImage = "inputImage" toNode = "pixelateFilter" toInput = "src" />
<connect fromNode = "pixelateFilter" fromOutput = "dst" toImage = "outputImage" />
</graph>
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
Pixel Bender Kernels & Graphs
4
<languageVersion : 1.0;>
kernel pixelate_sample
<
namespace : "AIF Test";
vendor : "Adobe";
version : 1;>
{
parameter int dimension;
input image4 inputImage;
output pixel4 outputPixel;
void evaluatePixel()
{
float dimAsFloat = float(dimension);
float2 sc = floor(outCoord() /
float2(dimAsFloat, dimAsFloat));
sc *= dimAsFloat;
outputPixel = sampleNearest(inputImage, sc);
}
}
<?xml version="1.0" encoding="utf-8"?>
<graph name = "PixelateGraph"xmlns="http://ns.adobe.com/PixelBenderGraph/1.0">
<metadata name = "namespace" value = "AIF"/>
<metadata name = "vendor" value = "Adobe Systems" />
<metadata name = "version" type = "int" value = "1" />
<parameter type = "int" name = "dimension" >
<metadata name = "defaultValue" type = "int" value = "1" />
<metadata name = "minValue" type = "int" value = "1" />
<metadata name = "maxValue" type = "int" value = "100" />
</parameter>
<inputImage type = "image4" name = "inputImage" />
<outputImage type = "image4" name = "outputImage" />
<kernel>
<![CDATA[
<languageVersion : 1.0;>
kernel Pixelate
<
namespace:"AIF";
vendor:"Adobe Systems";
version:1;
>
{
…
}
]]>
</kernel>
<node id = "pixelateFilter" name ="Pixelate" namespace = "AIF" vendor = "Adobe Systems"
version ="1" clientID ="ADBE Pixelate" >
<evaluateParameters>
<![CDATA[
void evaluateParameters()
{
pixelateFilter::dimension = dimension;
}
]]>
</evaluateParameters>
</node>
<!-- Connect the graph -->
<connect fromImage = "inputImage" toNode = "pixelateFilter" toInput = "src" />
<connect fromNode = "pixelateFilter" fromOutput = "dst" toImage = "outputImage" />
</graph>
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
Pixel Bender Kernels & Graphs
5
<languageVersion : 1.0;>
kernel pixelate_sample
<
namespace : "AIF Test";
vendor : "Adobe";
version : 1;>
{
parameter int dimension;
input image4 inputImage;
output pixel4 outputPixel;
void evaluatePixel()
{
float dimAsFloat = float(dimension);
float2 sc = floor(outCoord() /
float2(dimAsFloat, dimAsFloat));
sc *= dimAsFloat;
outputPixel = sampleNearest(inputImage, sc);
}
}
<?xml version="1.0" encoding="utf-8"?>
<graph name = "PixelateGraph"xmlns="http://ns.adobe.com/PixelBenderGraph/1.0">
<metadata name = "namespace" value = "AIF"/>
<metadata name = "vendor" value = "Adobe Systems" />
<metadata name = "version" type = "int" value = "1" />
<parameter type = "int" name = "dimension" >
<metadata name = "defaultValue" type = "int" value = "1" />
<metadata name = "minValue" type = "int" value = "1" />
<metadata name = "maxValue" type = "int" value = "100" />
</parameter>
<inputImage type = "image4" name = "inputImage" />
<outputImage type = "image4" name = "outputImage" />
<kernel>
<![CDATA[
<languageVersion : 1.0;>
kernel Pixelate
<
namespace:"AIF";
vendor:"Adobe Systems";
version:1;
>
{
…
}
]]>
</kernel>
<node id = "pixelateFilter" name ="Pixelate" namespace = "AIF" vendor = "Adobe Systems"
version ="1" clientID ="ADBE Pixelate" >
<evaluateParameters>
<![CDATA[
void evaluateParameters()
{
pixelateFilter::dimension = dimension;
}
]]>
</evaluateParameters>
</node>
<!-- Connect the graph -->
<connect fromImage = "inputImage" toNode = "pixelateFilter" toInput = "src" />
<connect fromNode = "pixelateFilter" fromOutput = "dst" toImage = "outputImage" />
</graph>
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
Pixel Bender Kernels & Graphs
6
<languageVersion : 1.0;>
kernel pixelate_sample
<
namespace : "AIF Test";
vendor : "Adobe";
version : 1;>
{
parameter int dimension;
input image4 inputImage;
output pixel4 outputPixel;
void evaluatePixel()
{
float dimAsFloat = float(dimension);
float2 sc = floor(outCoord() /
float2(dimAsFloat, dimAsFloat));
sc *= dimAsFloat;
outputPixel = sampleNearest(inputImage, sc);
}
}
<?xml version="1.0" encoding="utf-8"?>
<graph name = "PixelateGraph"xmlns="http://ns.adobe.com/PixelBenderGraph/1.0">
<metadata name = "namespace" value = "AIF"/>
<metadata name = "vendor" value = "Adobe Systems" />
<metadata name = "version" type = "int" value = "1" />
<parameter type = "int" name = "dimension" >
<metadata name = "defaultValue" type = "int" value = "1" />
<metadata name = "minValue" type = "int" value = "1" />
<metadata name = "maxValue" type = "int" value = "100" />
</parameter>
<inputImage type = "image4" name = "inputImage" />
<outputImage type = "image4" name = "outputImage" />
<kernel>
<![CDATA[
<languageVersion : 1.0;>
kernel Pixelate
<
namespace:"AIF";
vendor:"Adobe Systems";
version:1;
>
{
…
}
]]>
</kernel>
<node id = "pixelateFilter" name ="Pixelate" namespace = "AIF" vendor = "Adobe Systems"
version ="1" clientID ="ADBE Pixelate" >
<evaluateParameters>
<![CDATA[
void evaluateParameters()
{
pixelateFilter::dimension = dimension;
}
]]>
</evaluateParameters>
</node>
<!-- Connect the graph -->
<connect fromImage = "inputImage" toNode = "pixelateFilter" toInput = "src" />
<connect fromNode = "pixelateFilter" fromOutput = "dst" toImage = "outputImage" />
</graph>
High Pass Texturize
Saturate
Blend Vacation
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
Pixel Bender Kernels & Graphs
7
<languageVersion : 1.0;>
kernel pixelate_sample
<
namespace : "AIF Test";
vendor : "Adobe";
version : 1;>
{
parameter int dimension;
input image4 inputImage;
output pixel4 outputPixel;
void evaluatePixel()
{
float dimAsFloat = float(dimension);
float2 sc = floor(outCoord() /
float2(dimAsFloat, dimAsFloat));
sc *= dimAsFloat;
outputPixel = sampleNearest(inputImage, sc);
}
}
<?xml version="1.0" encoding="utf-8"?>
<graph name = "PixelateGraph"xmlns="http://ns.adobe.com/PixelBenderGraph/1.0">
<metadata name = "namespace" value = "AIF"/>
<metadata name = "vendor" value = "Adobe Systems" />
<metadata name = "version" type = "int" value = "1" />
<parameter type = "int" name = "dimension" >
<metadata name = "defaultValue" type = "int" value = "1" />
<metadata name = "minValue" type = "int" value = "1" />
<metadata name = "maxValue" type = "int" value = "100" />
</parameter>
<inputImage type = "image4" name = "inputImage" />
<outputImage type = "image4" name = "outputImage" />
<kernel>
<![CDATA[
<languageVersion : 1.0;>
kernel Pixelate
<
namespace:"AIF";
vendor:"Adobe Systems";
version:1;
>
{
…
}
]]>
</kernel>
<node id = "pixelateFilter" name ="Pixelate" namespace = "AIF" vendor = "Adobe Systems"
version ="1" clientID ="ADBE Pixelate" >
<evaluateParameters>
<![CDATA[
void evaluateParameters()
{
pixelateFilter::dimension = dimension;
}
]]>
</evaluateParameters>
</node>
<!-- Connect the graph -->
<connect fromImage = "inputImage" toNode = "pixelateFilter" toInput = "src" />
<connect fromNode = "pixelateFilter" fromOutput = "dst" toImage = "outputImage" />
</graph>
•Explicitly Data Parallel
•Explicitly Lock Free
•Implicitly Vectorizable
•Contains Optimization Hints
•Region Reasoning
•Parameter Ranges
•Supports per-frame
functions
•JIT
•x86 with SSE
•GLSL
•Implicitly Task Parallel
•Contains Optimization Hints
•Region Reasoning
•Parameter Ranges
•Parameter Use
•Supports per frame and internal
graph logic
•Language/Hardware Agnostic
•Enforces the programming Model
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
Pixel Bender Runtime
Run-time scheduling
Decide if a Pixel Bender node runs on the GPU or CPU
Order the execution of each node
Drives Optimization
Runs region reasoning pass
Concatenate adjacent Pixel Bender nodes
Fix parameter values for constant folding and range propagation
Caches intra-graph frames when possible to reduce computation
Allows host application to aid optimization
Lock parameter values
Lock inputs
Interfaces with host application resource management
Application can force CPU or GPU execution
Application can provide memory or threading management
8
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
Pixel Bender Runtime
Run-time scheduling
Decide if a Pixel Bender node runs on the GPU or CPU
Order the execution of each node
Drives Optimization
Runs region reasoning pass
Concatenate adjacent Pixel Bender nodes
Fix parameter values for constant folding and range propagation
Caches intra-graph frames when possible to reduce computation
Allows host application to aid optimization
Lock parameter values
Lock inputs
Interfaces with host application resource management
Application can force CPU or GPU execution
Application can provide memory or threading management
9
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
Pixel Bender Runtime
Run-time scheduling
Decide if a Pixel Bender node runs on the GPU or CPU
Order the execution of each node
Drives Optimization
Runs region reasoning pass
Concatenate adjacent Pixel Bender nodes
Fix parameter values for constant folding and range propagation
Caches intra-graph frames when possible to reduce computation
Allows host application to aid optimization
Lock parameter values
Lock inputs
Interfaces with host application resource management
Application can force CPU or GPU execution
Application can provide memory or threading management
10
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
Pixel Bender Runtime
Run-time scheduling
Decide if a Pixel Bender node runs on the GPU or CPU
Order the execution of each node
Drives Optimization
Runs region reasoning pass
Concatenate adjacent Pixel Bender nodes
Fix parameter values for constant folding and range propagation
Caches intra-graph frames when possible to reduce computation
Allows host application to aid optimization
Lock parameter values
Lock inputs
Interfaces with host application resource management
Application can force CPU or GPU execution
Application can provide memory or threading management
11
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
Demo
12
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
Lessons Learned (so far)
A DSL allows you to limit the language for optimization purposes while
preserving programmability
Just-in-time Compilation allows you not only to use runtime information
for optimization purposes, but also allows you to future-proof algorithms
against later hardware architectures
Developers will learn new programming languages if they give them an
ability to do something new, or make something significantly easier
A language with only a text representation creates some nice network
and community effects (for a time)
13
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
Lessons Learned (so far)
A DSL allows you to limit the language for optimization purposes while
preserving programmability
Just-in-time Compilation allows you not only to use runtime information
for optimization purposes, but also allows you to future-proof algorithms
against later hardware architectures
Developers will learn new programming languages if they give them an
ability to do something new, or make something significantly easier
A language with only a text representation creates some nice network
and community effects (for a time)
14
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
Lessons Learned (so far)
A DSL allows you to limit the language for optimization purposes while
preserving programmability
Just-in-time Compilation allows you not only to use runtime information
for optimization purposes, but also allows you to future-proof algorithms
against later hardware architectures
Developers will learn new programming languages if they give them an
ability to do something new, or make something significantly easier
A language with only a text representation creates some nice network
and community effects (for a time)
15
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
Lessons Learned (so far)
A DSL allows you to limit the language for optimization purposes while
preserving programmability
Just-in-time Compilation allows you not only to use runtime information
for optimization purposes, but also allows you to future-proof algorithms
against later hardware architectures
Developers will learn new programming languages if they give them an
ability to do something new, or make something significantly easier
A language with only a text representation creates some nice network
and community effects (for a time)
16
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
Warning.
Speculation ahead.
17
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
How do we make the most of the
hardware we have available?
18
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
Writing multi threaded code is like
juggling chainsaws; amazing when it
works and truly sucky when it doesn’t.
Andrew Wulf
19
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
Gflop / $
20
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
Gflop / $
Gflop / watt
21
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
Gflop / $
Gflop / watt
Gflop / developer-hour
22
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
What have we got?
23
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
What have we got?
DSL for image processing (Pixel Bender)
24
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
What have we got?
DSL for image processing (Pixel Bender)
JIT compiler / optimizer
25
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
What have we got?
DSL for image processing (Pixel Bender)
JIT compiler / optimizer
Runtime – enforces programming model, allows graphs
26
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
What have we got?
DSL for image processing (Pixel Bender)
JIT compiler / optimizer
Runtime – enforces programming model, allows graphs
High performance on parallel hardware (using OpenGL)
27
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
What have we got?
DSL for image processing (Pixel Bender)
JIT compiler / optimizer
Runtime – enforces programming model, allows graphs
High performance on parallel hardware (using OpenGL)
Future proof against new hardware
28
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
What have we got?
DSL for image processing (Pixel Bender)
JIT compiler / optimizer
Runtime – enforces programming model, allows graphs
High performance on parallel hardware (using OpenGL)
Future proof against new hardware
Cross platform
29
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
What cross platform means to Adobe
Mac
Windows
AMD
Intel
nVidia
CPU
GPU
Mobile hardware
30
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
What have we got?
DSL for image processing (Pixel Bender)
JIT compiler / optimizer
Runtime – enforces programming model, allows graphs
High performance on parallel hardware (using OpenGL)
Future proof against new hardware
Cross platform
31
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
What have we got?
DSL for image processing (Pixel Bender)
JIT compiler / optimizer
Runtime – enforces programming model, allows graphs
High performance on parallel hardware (using OpenGL)
Future proof against new hardware
Cross platform
OpenCL
32
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
Why not just switch entirely to OpenCL?
33
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
Why not just switch entirely to OpenCL?
Pixel Bender has certain advantages:
Ease of writing
34
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
Why not just switch entirely to OpenCL?
Pixel Bender has certain advantages:
Ease of writing
Optimization opportunities
35
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
Why not just switch entirely to OpenCL?
Pixel Bender has certain advantages:
Ease of writing
Optimization opportunities
Race free by construction
36
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
Why not just switch entirely to OpenCL?
Pixel Bender has certain advantages:
Ease of writing
Optimization opportunities
Race free by construction
Parallelism for the masses
37
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
Warning.
Increased speculation
ahead.
38
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
Pixel Bender has certain disadvantages:
One fixed programming model
Focuses on image processing
Not general enough
39
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
Framework
40
Inputs Framework Outputs
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
Framework
41
Inputs Framework Outputs
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
Michael McCool’s parallel programming patterns
Gather
Map
Reduce
Superscalar sequences
Pipeline
Nesting
Scans
Recurrences
Search
Subdivision
Stencil
Scatter
Pack
Selection
Partition
Expand
42
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
What are we going to do about it?
43
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
Internal customers
44
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
External customers
45
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
References
Pixel Bender
http://www.adobe.com/devnet/pixelbender.html
http://blogs.adobe.com/pixel-bender/
http://blogs.adobe.com/kevin-goldsmith/tag/pixel-bender-2
Structured Parallel Programming with Deterministic Patterns
Michael D. McCool http://software.intel.com/file/27160
Patterns for Parallel Programming
Mattson, Sanders & Massingill
46
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential. 4
8
Pixel Bender programming model
Write a function that produces a
single output pixel
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential. 4
9
Pixel Bender programming model
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential. 5
0
Pixel Bender programming model
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential. 5
1
Pixel Bender programming model
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential. 5
2
Pixel Bender programming model
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
Why Pixel Bender?
2001 programmable shading units on the GPU
2005 dual core CPUs
2005 AIF team formed
2006 quad core CPUs
2006 AMD announces CTM
2008 OpenCL
2011 fusion chips
54
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
Pixel Bender History
2001 programmable shading units on the GPU
2005 dual core CPUs
2005 AIF team formed
2006 quad core CPUs
2006 AMD announces CTM
2007 After Effects CS3 replaces GLSL code with Pixel Bender
2007 Flash Player 10 Announced including Pixel Bender support
2008 OpenCL
2008 After Effects CS4 - first CPU implementation, 3rd party plug-ins, Pixel Bender Graph language announced
2008 Photoshop CS4 – Pixel Bender plug-in released
2010 Pixel Bender commercial plug-ins start to appear en masse
2010 Flash Player Molehill Announced – Pixel Bender 3D
2011 fusion chips
55
© 2011 Adobe Systems Incorporated. All Rights Reserved. Adobe Confidential.
Disclaimer & Attribution
The information presented in this document is for informational purposes only and may contain technical inaccuracies, omissions and typographical errors.
The information contained herein is subject to change and may be rendered inaccurate for many reasons, including but not limited to product and roadmap changes, component and motherboard version changes, new model and/or product releases, product differences between differing manufacturers, software changes, BIOS flashes, firmware upgrades, or the like. There is no obligation to update or otherwise correct or revise this information. However, we reserve the right to revise this information and to make changes from time to time to the content hereof without obligation to notify any person of such revisions or changes.
NO REPRESENTATIONS OR WARRANTIES ARE MADE WITH RESPECT TO THE CONTENTS HEREOF AND NO RESPONSIBILITY IS ASSUMED FOR ANY INACCURACIES, ERRORS OR OMISSIONS THAT MAY APPEAR IN THIS INFORMATION.
ALL IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE ARE EXPRESSLY DISCLAIMED. IN NO EVENT WILL ANY LIABILITY TO ANY PERSON BE INCURRED FOR ANY DIRECT, INDIRECT, SPECIAL OR OTHER CONSEQUENTIAL DAMAGES ARISING FROM THE USE OF ANY INFORMATION CONTAINED HEREIN, EVEN IF EXPRESSLY ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
AMD, the AMD arrow logo, and combinations thereof are trademarks of Advanced Micro Devices, Inc. All other names used in this presentation are for informational purposes only and may be trademarks of their respective owners.
The contents of this presentation were provided by individual(s) and/or company listed on the title page. The information and opinions presented in this presentation may not represent AMD’s positions, strategies or opinions. Unless explicitly stated, AMD is not responsible for the content herein and no endorsements are implied
56