hipify-clang
is a clang-based tool for translation CUDA sources into HIP sources.
It translates CUDA source into an abstract syntax tree, which is being traversed by transformation matchers.
After applying all the matchers, the output HIP source is produced.
Advantages:
- It is a translator; thus, any even very complicated constructs will be parsed successfully, or an error will be reported.
- It supports clang options like
-I
,-D
,--cuda-path
, etc. - Seamless support of new CUDA versions as it is clang's responsibility.
- Ease in support.
Disadvantages:
- The main advantage is also the main disadvantage: the input CUDA code should be correct; incorrect code wouldn't be translated to HIP.
- CUDA should be installed and provided in case of multiple installations by
--cuda-path
option. - All the includes and defines should be provided to transform code successfully.
hipify-clang
requires:
-
LLVM+CLANG of at least version 3.8.0; the latest stable and recommended release: 11.0.0.
-
CUDA of at least version 7.0, the latest supported version is 11.0.
LLVM release version | CUDA latest supported version | Windows | Linux |
---|---|---|---|
3.8.0*,
3.8.1*, 3.9.0*, 3.9.1* |
7.5 | + | + |
4.0.0,
4.0.1, 5.0.0, 5.0.1, 5.0.2 |
8.0 | + | + |
6.0.0, 6.0.1 | 9.0 | + | + |
7.0.0, 7.0.1, 7.1.0 | 9.2 | works only with the patch due to the clang's bug 38811 patch for 7.0.0** patch for 7.0.1** patch for 7.1.0** |
- not working due to the clang's bug 36384 |
8.0.0, 8.0.1 | 10.0 | works only with the patch due to the clang's bug 38811 patch for 8.0.0** patch for 8.0.1** |
+ |
9.0.0, 9.0.1 | 10.1 | + | + |
10.0.0, 10.0.1 | 11.0 | + | + |
11.0 Update 1, 11.1 | works only with the patch due to the clang's bug 47332 patch for 10.0.0*** patch for 10.0.1*** |
||
11.0.0 | 11.0 | LATEST STABLE CONFIG | |
11.0 Update 1, 11.1 | works only with the patch due to the clang's bug 47332 patch for 11.0.0*** |
*
LLVM 3.x
is not supported anymore but might still work.
**
Download the patch and unpack it into your LLVM distributive directory
: a few header files will be overwritten; rebuilding of LLVM
is not needed.
***
Download the patch and unpack it into your LLVM source directory
: the file Cuda.cpp
will be overwritten; needs further rebuilding of LLVM
.
In most cases, you can get a suitable version of LLVM+CLANG
with your package manager.
Failing that or having multiple versions of LLVM
, you can download a release archive, build or install it, and set
CMAKE_PREFIX_PATH so cmake
can find it; for instance: -DCMAKE_PREFIX_PATH=d:\LLVM\11.0.0\dist
To process a file, hipify-clang
needs access to the same headers that would be required to compile it with clang.
For example:
./hipify-clang square.cu --cuda-path=/usr/local/cuda-11.0 -I /usr/local/cuda-11.0/samples/common/inc
hipify-clang
arguments are given first, followed by a separator '--'
, and then the arguments you'd pass to clang
if you
were compiling the input file. For example:
./hipify-clang cpp17.cu --cuda-path=/usr/local/cuda-11.0 -- -std=c++17
The Clang manual for compiling CUDA may be useful.
For some hipification automation (starting from clang 8.0.0), it is also possible to provide a Compilation Database in JSON format in the compile_commands.json
file:
-p <folder containing compile_commands.json> or
-p=<folder containing compile_commands.json>
The compilation database should be provided in the compile_commands.json
file or generated by clang based on cmake; options separator '--'
must not be used.
For a list of hipify-clang
options, run hipify-clang --help
.
mkdir build dist
cd build
cmake \
-DCMAKE_INSTALL_PREFIX=../dist \
-DCMAKE_BUILD_TYPE=Release \
..
make -j install
On Windows, the following option should be specified for cmake
at first place: -G "Visual Studio 16 2019 Win64"
; the generated hipify-clang.sln
should be built by Visual Studio 16 2019
instead of make.
Please, see hipify-clang: Windows for the supported tools for building.
Debug build type -DCMAKE_BUILD_TYPE=Debug
is also supported and tested; LLVM+CLANG
should be built in Debug
mode as well.
64-bit build mode (-Thost=x64
on Windows) is also supported; LLVM+CLANG
should be built in 64-bit mode as well.
The binary can then be found at ./dist/bin/hipify-clang
.
hipify-clang
has unit tests using LLVM
lit
/FileCheck
.
LLVM+CLANG
should be built from sources, pre-built binaries are not exhaustive for testing. Before building ensure that the software required for building is of an appropriate version.
LLVM 9.0.1 or older:
- download
LLVM
+CLANG
sources; - build
LLVM+CLANG
:
Linux:
cmake \
-DCMAKE_INSTALL_PREFIX=../dist \
-DLLVM_SOURCE_DIR=../llvm \
-DLLVM_TARGETS_TO_BUILD="X86;NVPTX" \
-DCMAKE_BUILD_TYPE=Release \
../llvm
make -j install
Windows:
cmake \
-G "Visual Studio 16 2019" \
-A x64 \
-DCMAKE_INSTALL_PREFIX=../dist \
-DLLVM_SOURCE_DIR=../llvm \
-DLLVM_TARGETS_TO_BUILD="NVPTX" \
-DCMAKE_BUILD_TYPE=Release \
-Thost=x64 \
../llvm
Run Visual Studio 16 2019
, open the generated LLVM.sln
, build all, build project INSTALL
.
LLVM 10.0.0 or newer:
- download
LLVM project
sources; - build
LLVM project
:
Linux:
cmake \
-DCMAKE_INSTALL_PREFIX=../dist \
-DLLVM_SOURCE_DIR=../llvm-project \
-DLLVM_TARGETS_TO_BUILD="X86;NVPTX" \
-DLLVM_ENABLE_PROJECTS="clang" \
-DLLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN=ON \
-DCMAKE_BUILD_TYPE=Release \
../llvm-project/llvm
make -j install
Windows:
cmake \
-G "Visual Studio 16 2019" \
-A x64 \
-DCMAKE_INSTALL_PREFIX=../dist \
-DLLVM_SOURCE_DIR=../llvm-project \
-DLLVM_TARGETS_TO_BUILD="NVPTX" \
-DLLVM_ENABLE_PROJECTS="clang" \
-DLLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN=ON \
-DCMAKE_BUILD_TYPE=Release \
-Thost=x64 \
../llvm-project/llvm
Run Visual Studio 16 2019
, open the generated LLVM.sln
, build all, build project INSTALL
.
-
Ensure
CUDA
of minimum version 7.0 is installed.-
Having multiple CUDA installations to choose a particular version the
DCUDA_TOOLKIT_ROOT_DIR
option should be specified:-
Linux:
-DCUDA_TOOLKIT_ROOT_DIR=/usr/include
-
Windows:
-DCUDA_TOOLKIT_ROOT_DIR="c:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.0"
-DCUDA_SDK_ROOT_DIR="c:/ProgramData/NVIDIA Corporation/CUDA Samples/v11.0"
-
-
-
Ensure
cuDNN
of the version corresponding to CUDA's version is installed.-
Path to
cuDNN
should be specified by theCUDA_DNN_ROOT_DIR
option:-
Linux:
-DCUDA_DNN_ROOT_DIR=/usr/include
-
Windows:
-DCUDA_DNN_ROOT_DIR=d:/CUDNN/cudnn-11.0-windows10-x64-v8.0.4.30
-
-
-
Ensure
CUB
of the version corresponding to CUDA's version is installed.-
Path to CUB should be specified by the
CUDA_CUB_ROOT_DIR
option:-
Linux:
-DCUDA_CUB_ROOT_DIR=/srv/git/CUB
-
Windows:
-DCUDA_CUB_ROOT_DIR=d:/GIT/cub
-
-
-
Ensure
python
of minimum required version 2.7 is installed. -
Ensure
lit
andFileCheck
are installed - these are distributed withLLVM
.-
Install
lit
intopython
:-
Linux:
python /usr/llvm/11.0.0/llvm-project/llvm/utils/lit/setup.py install
-
Windows:
python d:/LLVM/11.0.0/llvm-project/llvm/utils/lit/setup.py install
-
-
Starting with LLVM 6.0.1 path to
llvm-lit
python script should be specified by theLLVM_EXTERNAL_LIT
option:-
Linux:
-DLLVM_EXTERNAL_LIT=/usr/llvm/11.0.0/build/bin/llvm-lit
-
Windows:
-DLLVM_EXTERNAL_LIT=d:/LLVM/11.0.0/build/Release/bin/llvm-lit.py
-
-
FileCheck
:-
Linux: copy from
/usr/llvm/11.0.0/build/bin/
toCMAKE_INSTALL_PREFIX/dist/bin
-
Windows: copy from
d:/LLVM/11.0.0/build/Release/bin
toCMAKE_INSTALL_PREFIX/dist/bin
-
Or specify the path to
FileCheck
inCMAKE_INSTALL_PREFIX
option
-
-
-
Set
HIPIFY_CLANG_TESTS
option turned on:-DHIPIFY_CLANG_TESTS=1
. -
Build and run tests:
On Linux the following configurations are tested:
Ubuntu 14: LLVM 4.0.0 - 7.1.0, CUDA 7.0 - 9.0, cuDNN 5.0.5 - 7.6.5.32
Ubuntu 16-18: LLVM 8.0.0 - 11.0.0, CUDA 8.0 - 10.2, cuDNN 5.1.10 - 8.0.4.30
Ubuntu 20: LLVM 9.0.0 - 11.0.0, CUDA 8.0 - 11.1, cuDNN 5.1.10 - 8.0.4.30
Minimum build system requirements for the above configurations:
Python 2.7, cmake 3.5.1, GNU C/C++ 5.4.0.
Here is an example of building hipify-clang
with testing support on Ubuntu 20.04.1
:
cmake
-DHIPIFY_CLANG_TESTS=1 \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=../dist \
-DCMAKE_PREFIX_PATH=/usr/llvm/11.0.0/dist \
-DCUDA_TOOLKIT_ROOT_DIR=/usr/include \
-DCUDA_DNN_ROOT_DIR=/usr/include \
-DCUDA_CUB_ROOT_DIR=/usr/CUB \
-DLLVM_EXTERNAL_LIT=/usr/llvm/11.0.0/build/bin/llvm-lit \
..
A corresponding successful output:
-- The C compiler identification is GNU 9.3.0
-- The CXX compiler identification is GNU 9.3.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found ZLIB: /usr/lib/x86_64-linux-gnu/libz.so (found version "1.2.11")
-- Found LLVM 11.0.0:
-- - CMake module path: /usr/llvm/11.0.0/dist/lib/cmake/llvm
-- - Include path : /usr/llvm/11.0.0/dist/include
-- - Binary path : /usr/llvm/11.0.0/dist/bin
-- Linker detection: GNU ld
-- Found PythonInterp: /usr/bin/python3.8 (found suitable version "3.8.5", minimum required is "2.7")
-- Found lit: /usr/local/bin/lit
-- Found FileCheck: /usr/llvm/11.0.0/dist/bin/FileCheck
-- Looking for pthread.h
-- Looking for pthread.h - found
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Failed
-- Looking for pthread_create in pthreads
-- Looking for pthread_create in pthreads - not found
-- Looking for pthread_create in pthread
-- Looking for pthread_create in pthread - found
-- Found Threads: TRUE
-- Found CUDA: /usr/include (found version "11.0")
-- Configuring done
-- Generating done
-- Build files have been written to: /usr/hipify/build
make test-hipify
A corresponding successful output:
Running HIPify regression tests
========================================
CUDA 11.0 - will be used for testing
LLVM 11.0.0 - will be used for testing
x86_64 - Platform architecture
Linux 5.4.0-51-generic - Platform OS
64 - hipify-clang binary bitness
64 - python 3.8.5 binary bitness
========================================
-- Testing: 66 tests, 12 threads --
PASS: hipify :: unit_tests/casts/reinterpret_cast.cu (1 of 66)
PASS: hipify :: unit_tests/device/atomics.cu (2 of 66)
PASS: hipify :: unit_tests/compilation_database/cd_intro.cu (3 of 66)
PASS: hipify :: unit_tests/device/device_symbols.cu (4 of 66)
PASS: hipify :: unit_tests/device/math_functions.cu (5 of 66)
PASS: hipify :: unit_tests/headers/headers_test_01.cu (6 of 66)
PASS: hipify :: unit_tests/headers/headers_test_02.cu (7 of 66)
PASS: hipify :: unit_tests/headers/headers_test_03.cu (8 of 66)
PASS: hipify :: unit_tests/headers/headers_test_05.cu (9 of 66)
PASS: hipify :: unit_tests/headers/headers_test_06.cu (10 of 66)
PASS: hipify :: unit_tests/headers/headers_test_04.cu (11 of 66)
PASS: hipify :: unit_tests/headers/headers_test_07.cu (12 of 66)
PASS: hipify :: unit_tests/headers/headers_test_10.cu (13 of 66)
PASS: hipify :: unit_tests/headers/headers_test_11.cu (14 of 66)
PASS: hipify :: unit_tests/headers/headers_test_08.cu (15 of 66)
PASS: hipify :: unit_tests/kernel_launch/kernel_launch_01.cu (16 of 66)
PASS: hipify :: unit_tests/headers/headers_test_09.cu (17 of 66)
PASS: hipify :: unit_tests/libraries/CAFFE2/caffe2_02.cu (18 of 66)
PASS: hipify :: unit_tests/libraries/CAFFE2/caffe2_01.cu (19 of 66)
PASS: hipify :: unit_tests/libraries/cuBLAS/cublas_0_based_indexing.cu (20 of 66)
PASS: hipify :: unit_tests/libraries/CUB/cub_03.cu (21 of 66)
PASS: hipify :: unit_tests/libraries/CUB/cub_01.cu (22 of 66)
PASS: hipify :: unit_tests/libraries/CUB/cub_02.cu (23 of 66)
PASS: hipify :: unit_tests/libraries/cuBLAS/cublas_sgemm_matrix_multiplication.cu (24 of 66)
PASS: hipify :: unit_tests/libraries/cuBLAS/rocBLAS/cublas_0_based_indexing_rocblas.cu (25 of 66)
PASS: hipify :: unit_tests/libraries/cuBLAS/rocBLAS/cublas_1_based_indexing_rocblas.cu (26 of 66)
PASS: hipify :: unit_tests/libraries/cuBLAS/cublas_1_based_indexing.cu (27 of 66)
PASS: hipify :: unit_tests/libraries/cuComplex/cuComplex_Julia.cu (28 of 66)
PASS: hipify :: unit_tests/libraries/cuDNN/cudnn_softmax.cu (29 of 66)
PASS: hipify :: unit_tests/libraries/cuFFT/simple_cufft.cu (30 of 66)
PASS: hipify :: unit_tests/libraries/cuBLAS/rocBLAS/cublas_sgemm_matrix_multiplication_rocblas.cu (31 of 66)
PASS: hipify :: unit_tests/libraries/cuRAND/poisson_api_example.cu (32 of 66)
PASS: hipify :: unit_tests/libraries/cuSPARSE/cuSPARSE_03.cu (33 of 66)
PASS: hipify :: unit_tests/libraries/cuRAND/benchmark_curand_generate.cpp (34 of 66)
PASS: hipify :: unit_tests/libraries/cuRAND/benchmark_curand_kernel.cpp (35 of 66)
PASS: hipify :: unit_tests/libraries/cuSPARSE/cuSPARSE_04.cu (36 of 66)
PASS: hipify :: unit_tests/libraries/cuSPARSE/cuSPARSE_05.cu (37 of 66)
PASS: hipify :: unit_tests/libraries/cuSPARSE/cuSPARSE_06.cu (38 of 66)
PASS: hipify :: unit_tests/libraries/cuSPARSE/cuSPARSE_07.cu (39 of 66)
PASS: hipify :: unit_tests/libraries/cuSPARSE/cuSPARSE_08.cu (40 of 66)
PASS: hipify :: unit_tests/libraries/cuSPARSE/cuSPARSE_09.cu (41 of 66)
PASS: hipify :: unit_tests/libraries/cuSPARSE/cuSPARSE_11.cu (42 of 66)
PASS: hipify :: unit_tests/namespace/ns_kernel_launch.cu (43 of 66)
PASS: hipify :: unit_tests/libraries/cuSPARSE/cuSPARSE_10.cu (44 of 66)
PASS: hipify :: unit_tests/pp/pp_if_else_conditionals.cu (45 of 66)
PASS: hipify :: unit_tests/pp/pp_if_else_conditionals_01.cu (46 of 66)
PASS: hipify :: unit_tests/pp/pp_if_else_conditionals_01_LLVM_10.cu (47 of 66)
PASS: hipify :: unit_tests/pp/pp_if_else_conditionals_LLVM_10.cu (48 of 66)
PASS: hipify :: unit_tests/samples/2_Cookbook/11_texture_driver/tex2dKernel.cpp (49 of 66)
PASS: hipify :: unit_tests/samples/2_Cookbook/0_MatrixTranspose/MatrixTranspose.cpp (50 of 66)
PASS: hipify :: unit_tests/samples/2_Cookbook/11_texture_driver/texture2dDrv.cpp (51 of 66)
PASS: hipify :: unit_tests/samples/2_Cookbook/13_occupancy/occupancy.cpp (52 of 66)
PASS: hipify :: unit_tests/samples/2_Cookbook/1_hipEvent/hipEvent.cpp (53 of 66)
PASS: hipify :: unit_tests/samples/2_Cookbook/2_Profiler/Profiler.cpp (54 of 66)
PASS: hipify :: unit_tests/samples/2_Cookbook/7_streams/stream.cpp (55 of 66)
PASS: hipify :: unit_tests/samples/MallocManaged.cpp (56 of 66)
PASS: hipify :: unit_tests/samples/2_Cookbook/8_peer2peer/peer2peer.cpp (57 of 66)
PASS: hipify :: unit_tests/samples/allocators.cu (58 of 66)
PASS: hipify :: unit_tests/samples/coalescing.cu (59 of 66)
PASS: hipify :: unit_tests/samples/dynamic_shared_memory.cu (60 of 66)
PASS: hipify :: unit_tests/samples/axpy.cu (61 of 66)
PASS: hipify :: unit_tests/samples/cudaRegister.cu (62 of 66)
PASS: hipify :: unit_tests/samples/intro.cu (63 of 66)
PASS: hipify :: unit_tests/samples/square.cu (64 of 66)
PASS: hipify :: unit_tests/samples/static_shared_memory.cu (65 of 66)
PASS: hipify :: unit_tests/samples/vec_add.cu (66 of 66)
Testing Time: 2.87s
Expected Passes : 66
[100%] Built target test-hipify
Tested configurations:
LLVM | CUDA | cuDNN | Visual Studio (latest) | cmake | Python |
---|---|---|---|---|---|
4.0.0 - 5.0.2 | 8.0 | 5.1.10 - 7.1.4.18 | 2015.14.0, 2017.15.5.2 | 3.5.1, 3.18.0 | 3.6.4, 3.8.5 |
6.0.0 - 6.0.1 | 9.0 | 7.0.5.15 - 7.6.5.32 | 2015.14.0, 2017.15.5.5 | 3.6.0, 3.18.0 | 3.7.2, 3.8.5 |
7.0.0 - 7.1.0 | 9.2 | 7.6.5.32 | 2017.15.9.11 | 3.13.3, 3.18.0 | 3.7.3, 3.8.5 |
8.0.0 - 8.0.1 | 10.0 | 7.6.5.32 | 2017.15.9.15 | 3.14.2, 3.18.0 | 3.7.4, 3.8.5 |
9.0.0 - 9.0.1 | 10.1 | 7.6.5.32 | 2017.15.9.20, 2019.16.4.5 | 3.16.4, 3.18.0 | 3.8.0, 3.8.5 |
10.0.0 - 11.0.0 | 8.0 - 11.1 | 7.6.5.32 - 8.0.4.30 | 2017.15.9.28, 2019.16.7.6 | 3.18.4 | 3.9.0 |
12.0.0git | 8.0 - 11.1 | 7.6.5.32 - 8.0.4.30 | 2017.15.9.28, 2019.16.7.6 | 3.18.4 | 3.9.0 |
Building with testing support by Visual Studio 16 2019
on Windows 10
:
cmake
-G "Visual Studio 16 2019" \
-A x64 \
-DHIPIFY_CLANG_TESTS=1 \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=../dist \
-DCMAKE_PREFIX_PATH=d:/LLVM/11.0.0/dist \
-DCUDA_TOOLKIT_ROOT_DIR="c:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.0" \
-DCUDA_SDK_ROOT_DIR="c:/ProgramData/NVIDIA Corporation/CUDA Samples/v11.0" \
-DCUDA_DNN_ROOT_DIR=d:/CUDNN/cudnn-11.0-windows10-x64-v8.0.4.30 \
-DCUDA_CUB_ROOT_DIR=d:/GIT/cub \
-DLLVM_EXTERNAL_LIT=d:/LLVM/11.0.0/build/Release/bin/llvm-lit.py \
-Thost=x64
..
A corresponding successful output:
-- Found LLVM 11.0.0:
-- - CMake module path: d:/LLVM/11.0.0/dist/lib/cmake/llvm
-- - Include path : d:/LLVM/11.0.0/dist/include
-- - Binary path : d:/LLVM/11.0.0/dist/bin
-- Found PythonInterp: c:/Program Files/Python39/python.exe (found suitable version "3.9.0", minimum required is "3.6")
-- Found lit: c:/Program Files/Python39/Scripts/lit.exe
-- Found FileCheck: d:/LLVM/11.0.0/dist/bin/FileCheck.exe
-- Found CUDA: c:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.0 (found version "11.0")
-- Configuring done
-- Generating done
-- Build files have been written to: d:/hipify/build
Run Visual Studio 16 2019
, open the generated hipify-clang.sln
, build project test-hipify
.
hipify-perl
is autogenerated perl-based script which heavily uses regular expressions.
Advantages:
-
Ease in use.
-
It doesn't check the input source CUDA code for correctness.
-
It doesn't have dependencies on 3rd party tools, including CUDA.
Disadvantages:
-
Current disability (and difficulty in implementing) of transforming the following constructs:
-
macros expansion;
-
namespaces:
-
redefines of CUDA entities in user namespaces;
-
using directive;
-
-
templates (some cases);
-
device/host function calls distinguishing;
-
header files correct injection;
-
complicated argument lists parsing.
-
-
Difficulties in supporting.
perl hipify-perl square.cu > square.cu.hip
To generate hipify-perl
, run hipify-clang --perl
. Output directory for the generated hipify-perl
file might be specified by --o-hipify-perl-dir
option.
To generate the above documentation with the actual information about all supported CUDA APIs in Markdown format, run hipify-clang --md
with or without output directory specifying (-o
).
The information contained herein is for informational purposes only, and is subject to change without notice. While every precaution has been taken in the preparation of this document, it may contain technical inaccuracies, omissions and typographical errors, and AMD is under no obligation to update or otherwise correct this information. Advanced Micro Devices, Inc. makes no representations or warranties with respect to the accuracy or completeness of the contents of this document, and assumes no liability of any kind, including the implied warranties of noninfringement, merchantability or fitness for particular purposes, with respect to the operation or use of AMD hardware, software or other products described herein. No license, including implied or arising by estoppel, to any intellectual property rights is granted by this document. Terms and limitations applicable to the purchase or use of AMD's products are as set forth in a signed agreement between the parties or in AMD's Standard Terms and Conditions of Sale.
AMD, the AMD Arrow logo, and combinations thereof are trademarks of Advanced Micro Devices, Inc. Other product names used in this publication are for identification purposes only and may be trademarks of their respective companies.
Copyright (c) 2014-2020 Advanced Micro Devices, Inc. All rights reserved.