@ -1,6 +1,6 @@
@@ -1,6 +1,6 @@
# M I T L i c e n s e
#
# Copyright ( c ) 2 0 2 2 - 2 0 2 3 A d v a n c e d M i c r o D e v i c e s , I n c . A l l r i g h t s r e s e r v e d .
# Copyright ( c ) 2 0 2 2 - 2 0 2 4 A d v a n c e d M i c r o D e v i c e s , I n c . A l l r i g h t s r e s e r v e d .
#
# P e r m i s s i o n i s h e r e b y g r a n t e d , f r e e o f c h a r g e , t o a n y p e r s o n o b t a i n i n g a c o p y
# o f t h i s s o f t w a r e a n d a s s o c i a t e d d o c u m e n t a t i o n files ( the "Software" ) , t o d e a l
@ -29,7 +29,9 @@ set(GPU_RUNTIME "HIP" CACHE STRING "Switches between HIP and CUDA")
@@ -29,7 +29,9 @@ set(GPU_RUNTIME "HIP" CACHE STRING "Switches between HIP and CUDA")
# O n l y s u p p o r t e d o n HIP ( not CUDA )
if ( NOT "${GPU_RUNTIME}" STREQUAL "HIP" )
set ( ERROR_MESSAGE "GPU_RUNTIME is set to \" ${ GPU_RUNTIME } \".\nGPU_RUNTIME must be HIP. " )
set ( ERROR_MESSAGE
" G P U _ R U N T I M E i s s e t t o \ " $ { G P U _ R U N T I M E } \ " . \ n G P U _ R U N T I M E m u s t b e H I P . "
)
message ( FATAL_ERROR ${ ERROR_MESSAGE } )
endif ( )
@ -39,9 +41,17 @@ set(CMAKE_${GPU_RUNTIME}_EXTENSIONS OFF)
@@ -39,9 +41,17 @@ set(CMAKE_${GPU_RUNTIME}_EXTENSIONS OFF)
set ( CMAKE_ ${ GPU_RUNTIME } _STANDARD_REQUIRED ON )
if ( WIN32 )
set ( ROCM_ROOT "$ENV{HIP_PATH}" CACHE PATH "Root directory of the ROCm installation" )
set ( ROCM_ROOT
" $ E N V { H I P _ P A T H } "
C A C H E P A T H
" R o o t d i r e c t o r y o f t h e R O C m i n s t a l l a t i o n "
)
else ( )
set ( ROCM_ROOT "/opt/rocm" CACHE PATH "Root directory of the ROCm installation" )
set ( ROCM_ROOT
" / o p t / r o c m "
C A C H E P A T H
" R o o t d i r e c t o r y o f t h e R O C m i n s t a l l a t i o n "
)
endif ( )
list ( APPEND CMAKE_PREFIX_PATH "${ROCM_ROOT}" )
@ -49,40 +59,55 @@ list(APPEND CMAKE_PREFIX_PATH "${ROCM_ROOT}")
@@ -49,40 +59,55 @@ list(APPEND CMAKE_PREFIX_PATH "${ROCM_ROOT}")
if ( NOT DEFINED CMAKE_HIP_ARCHITECTURES )
set ( GPU_ARCHITECTURES "all" CACHE STRING "GPU architectures to compile for" )
else ( )
set ( GPU_ARCHITECTURES "${CMAKE_HIP_ARCHITECTURES}" CACHE STRING "GPU architectures to compile for" )
set ( GPU_ARCHITECTURES
" $ { C M A K E _ H I P _ A R C H I T E C T U R E S } "
C A C H E S T R I N G
" G P U a r c h i t e c t u r e s t o c o m p i l e f o r "
)
endif ( )
if ( GPU_ARCHITECTURES STREQUAL "all" )
set ( GPU_ARCHITECTURES "gfx803;gfx900;gfx906;gfx908;gfx90a;gfx1030;gfx1100;gfx1101;gfx1102" CACHE STRING "GPU architectures to compile for" FORCE )
set ( GPU_ARCHITECTURES
" g f x 8 0 3 ; g f x 9 0 0 ; g f x 9 0 6 ; g f x 9 0 8 ; g f x 9 0 a ; g f x 1 0 3 0 ; g f x 1 1 0 0 ; g f x 1 1 0 1 ; g f x 1 1 0 2 "
C A C H E S T R I N G
" G P U a r c h i t e c t u r e s t o c o m p i l e f o r "
F O R C E
)
endif ( )
# R e m o v e d u p l i c a t e s
list ( REMOVE_DUPLICATES GPU_ARCHITECTURES )
message ( STATUS "GPU_ARCHITECTURES: ${GPU_ARCHITECTURES}" )
set_source_files_properties ( main.hip PROPERTIES COMPILE_OPTIONS "--cuda-host-only" )
set_source_files_properties (
m a i n . h i p
P R O P E R T I E S C O M P I L E _ O P T I O N S " - - c u d a - h o s t - o n l y "
)
find_program (
L L V M _ D I S _ C O M M A N D l l v m - d i s
P A T H _ S U F F I X E S b i n
P A T H S
$ { R O C M _ R O O T } / l l v m
$ { C M A K E _ I N S T A L L _ P R E F I X } / l l v m
R E Q U I R E D )
L L V M _ D I S _ C O M M A N D
l l v m - d i s
P A T H _ S U F F I X E S b i n
P A T H S $ { R O C M _ R O O T } / l l v m $ { C M A K E _ I N S T A L L _ P R E F I X } / l l v m
R E Q U I R E D
)
# G e n e r a t e t h e d e v i c e L L V M I R u s i n g t h e H I P c o m p i l e r .
foreach ( HIP_ARCHITECTURE ${ GPU_ARCHITECTURES } )
add_custom_command (
O U T P U T m a i n _ $ { H I P _ A R C H I T E C T U R E } . l l m a i n _ $ { H I P _ A R C H I T E C T U R E } . b c
C O M M A N D
$ { C M A K E _ H I P _ C O M P I L E R } - - c u d a - d e v i c e - o n l y - c - e m i t - l l v m $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / m a i n . h i p
- - o f f l o a d - a r c h = $ { H I P _ A R C H I T E C T U R E } - o m a i n _ $ { H I P _ A R C H I T E C T U R E } . b c
- I $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / . . / . . / C o m m o n - s t d = c + + 1 7
C O M M A N D
$ { L L V M _ D I S _ C O M M A N D } m a i n _ $ { H I P _ A R C H I T E C T U R E } . b c - o m a i n _ $ { H I P _ A R C H I T E C T U R E } . l l
D E P E N D S $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / m a i n . h i p
V E R B A T I M
C O M M E N T " G e n e r a t i n g m a i n _ $ { H I P _ A R C H I T E C T U R E } . l l " )
O U T P U T m a i n _ $ { H I P _ A R C H I T E C T U R E } . l l m a i n _ $ { H I P _ A R C H I T E C T U R E } . b c
C O M M A N D
$ { C M A K E _ H I P _ C O M P I L E R } - - c u d a - d e v i c e - o n l y - c - e m i t - l l v m
$ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / m a i n . h i p
- - o f f l o a d - a r c h = $ { H I P _ A R C H I T E C T U R E } - o m a i n _ $ { H I P _ A R C H I T E C T U R E } . b c - I
$ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / . . / . . / C o m m o n - s t d = c + + 1 7
C O M M A N D
$ { L L V M _ D I S _ C O M M A N D } m a i n _ $ { H I P _ A R C H I T E C T U R E } . b c - o
m a i n _ $ { H I P _ A R C H I T E C T U R E } . l l
D E P E N D S $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / m a i n . h i p
V E R B A T I M
C O M M E N T " G e n e r a t i n g m a i n _ $ { H I P _ A R C H I T E C T U R E } . l l "
)
endforeach ( )
if ( WIN32 )
@ -104,21 +129,23 @@ foreach(HIP_ARCHITECTURE ${GPU_ARCHITECTURES})
@@ -104,21 +129,23 @@ foreach(HIP_ARCHITECTURE ${GPU_ARCHITECTURES})
add_custom_command (
O U T P U T m a i n _ $ { H I P _ A R C H I T E C T U R E } . $ { O B J _ T Y P E }
C O M M A N D
$ { C M A K E _ H I P _ C O M P I L E R } - f P I C - t a r g e t a m d g c n - a m d - a m d h s a - m c p u = $ { H I P _ A R C H I T E C T U R E } m a i n _ $ { H I P _ A R C H I T E C T U R E } . l l
- o $ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } / m a i n _ $ { H I P _ A R C H I T E C T U R E } . $ { O B J _ T Y P E }
$ { C M A K E _ H I P _ C O M P I L E R } - f P I C - t a r g e t a m d g c n - a m d - a m d h s a
- m c p u = $ { H I P _ A R C H I T E C T U R E } m a i n _ $ { H I P _ A R C H I T E C T U R E } . l l - o
$ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } / m a i n _ $ { H I P _ A R C H I T E C T U R E } . $ { O B J _ T Y P E }
D E P E N D S m a i n _ $ { H I P _ A R C H I T E C T U R E } . l l
V E R B A T I M
C O M M E N T " G e n e r a t i n g m a i n _ $ { H I P _ A R C H I T E C T U R E } . $ { O B J _ T Y P E } " )
C O M M E N T " G e n e r a t i n g m a i n _ $ { H I P _ A R C H I T E C T U R E } . $ { O B J _ T Y P E } "
)
endforeach ( )
# C r e a t e a n o f f l o a d - b u n d l e f r o m t h e a s s e m b l e d o b j e c t f i l e s . T h i s n e e d s t h e c l a n g - o f f l o a d - b u n d l e r t o o l .
find_program (
O F F L O A D _ B U N D L E R _ C O M M A N D c l a n g - o f f l o a d - b u n d l e r
O F F L O A D _ B U N D L E R _ C O M M A N D
c l a n g - o f f l o a d - b u n d l e r
P A T H _ S U F F I X E S b i n
P A T H S
$ { R O C M _ R O O T } / l l v m
$ { C M A K E _ I N S T A L L _ P R E F I X } / l l v m
R E Q U I R E D )
P A T H S $ { R O C M _ R O O T } / l l v m $ { C M A K E _ I N S T A L L _ P R E F I X } / l l v m
R E Q U I R E D
)
# G e n e r a t e o b j e c t b u n d l e .
# T h e i n v o c a t i o n t o g e n e r a t e i s
@ -132,9 +159,19 @@ set(BUNDLE_INPUTS "-input=${NULDEV}")
@@ -132,9 +159,19 @@ set(BUNDLE_INPUTS "-input=${NULDEV}")
# G e n e r a t e B U N D L E _ O B J E C T S a s a s t r i n g o f : $ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } / m a i n _ $ { H I P _ A R C H I T E C T U R E } . $ { O B J _ T Y P E }
set ( BUNDLE_OBJECTS "" )
foreach ( HIP_ARCHITECTURE ${ GPU_ARCHITECTURES } )
set ( BUNDLE_TARGETS "${BUNDLE_TARGETS},hipv4-amdgcn-amd-amdhsa--${HIP_ARCHITECTURE}" )
list ( APPEND BUNDLE_INPUTS "-input=${CMAKE_CURRENT_BINARY_DIR}/main_${HIP_ARCHITECTURE}.${OBJ_TYPE}" )
list ( APPEND BUNDLE_OBJECTS "${CMAKE_CURRENT_BINARY_DIR}/main_${HIP_ARCHITECTURE}.${OBJ_TYPE}" )
set ( BUNDLE_TARGETS
" $ { B U N D L E _ T A R G E T S } , h i p v 4 - a m d g c n - a m d - a m d h s a - - $ { H I P _ A R C H I T E C T U R E } "
)
list (
A P P E N D
B U N D L E _ I N P U T S
" - i n p u t = $ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } / m a i n _ $ { H I P _ A R C H I T E C T U R E } . $ { O B J _ T Y P E } "
)
list (
A P P E N D
B U N D L E _ O B J E C T S
" $ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } / m a i n _ $ { H I P _ A R C H I T E C T U R E } . $ { O B J _ T Y P E } "
)
endforeach ( )
# I n v o k e c l a n g - o f f l o a d - b u n d l e r t o g e n e r a t e a n o f f l o a d b u n d l e .
@ -142,44 +179,37 @@ set(BUNDLE "${CMAKE_CURRENT_BINARY_DIR}/offload_bundle.hipfb")
@@ -142,44 +179,37 @@ set(BUNDLE "${CMAKE_CURRENT_BINARY_DIR}/offload_bundle.hipfb")
add_custom_command (
O U T P U T " $ { B U N D L E } "
C O M M A N D
" $ { O F F L O A D _ B U N D L E R _ C O M M A N D } "
- t y p e = o
- b u n d l e - a l i g n = 4 0 9 6
" $ { B U N D L E _ T A R G E T S } "
$ { B U N D L E _ I N P U T S }
" - o u t p u t = $ { B U N D L E } "
" $ { O F F L O A D _ B U N D L E R _ C O M M A N D } " - t y p e = o - b u n d l e - a l i g n = 4 0 9 6
" $ { B U N D L E _ T A R G E T S } " $ { B U N D L E _ I N P U T S } " - o u t p u t = $ { B U N D L E } "
D E P E N D S $ { B U N D L E _ O B J E C T S }
V E R B A T I M )
V E R B A T I M
)
# C r e a t e t h e d e v i c e b i n a r y b y a s s e m b l i n g t h e t e m p l a t e t h a t i n c l u d e s
# t h e o f f l o a d b u n d l e t h a t w a s j u s t g e n e r a t e d u s i n g a n . i n c b i n d i r e c t i v e .
# T h i s n e e d s a n a s s e m b l e r .
find_program (
L L V M _ M C _ C O M M A N D l l v m - m c
L L V M _ M C _ C O M M A N D
l l v m - m c
P A T H _ S U F F I X E S b i n
P A T H S
$ { R O C M _ R O O T } / l l v m
$ { C M A K E _ I N S T A L L _ P R E F I X } / l l v m
R E Q U I R E D )
P A T H S $ { R O C M _ R O O T } / l l v m $ { C M A K E _ I N S T A L L _ P R E F I X } / l l v m
R E Q U I R E D
)
# I n v o k e l l v m - m c t o g e n e r a t e a n o b j e c t f i l e c o n t a i n i n g t h e o f f l o a d b u n d l e .
set ( DEVICE_OBJECT "${CMAKE_CURRENT_BINARY_DIR}/main_device.${OBJ_TYPE}" )
add_custom_command (
O U T P U T " $ { D E V I C E _ O B J E C T } "
C O M M A N D
" $ { L L V M _ M C _ C O M M A N D } "
- t r i p l e " $ { H O S T _ T A R G E T } "
" $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / $ { H I P _ O B J _ G E N _ F I L E } "
- o " $ { D E V I C E _ O B J E C T } "
" $ { L L V M _ M C _ C O M M A N D } " - t r i p l e " $ { H O S T _ T A R G E T } "
" $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / $ { H I P _ O B J _ G E N _ F I L E } " - o " $ { D E V I C E _ O B J E C T } "
- - f i l e t y p e = o b j
D E P E N D S " $ { B U N D L E } "
V E R B A T I M )
V E R B A T I M
)
# F i n a l l y , c r e a t e t h e e x e c u t a b l e .
add_executable (
$ { e x a m p l e _ n a m e }
m a i n . h i p
$ { D E V I C E _ O B J E C T } )
add_executable ( ${ example_name } main.hip ${ DEVICE_OBJECT } )
# M a k e e x a m p l e r u n n a b l e u s i n g c t e s t
add_test ( ${ example_name } ${ example_name } )