From cdf02a8a0d77c1f443bed975ec04eaebdb4ed387 Mon Sep 17 00:00:00 2001 From: Aaron En Ye Shi Date: Mon, 18 Jan 2021 20:06:54 +0000 Subject: [PATCH] SWDEV-263964 - Fix hipconfig to work on Windows Modify hipconfig and hipcc to properly run Windows compiler executables. Support Windows Environmental Variables and AMD Display Adapter info. Update flags to include quotes for paths that have spaces, such as Program Files. Change-Id: Ib721b318bd88be7dfa1247a30ce78c7ed6a334e8 [ROCm/clr commit: 31e772adb5753d3eca41c98e1f62d939bcf0f24f] --- projects/clr/hipamd/bin/hipcc | 27 ++++++------- projects/clr/hipamd/bin/hipconfig | 61 +++++++++++++++++++++--------- projects/clr/hipamd/bin/hipvars.pm | 14 +++++-- 3 files changed, 69 insertions(+), 33 deletions(-) diff --git a/projects/clr/hipamd/bin/hipcc b/projects/clr/hipamd/bin/hipcc index 32f1411a77..ac52b1fde3 100755 --- a/projects/clr/hipamd/bin/hipcc +++ b/projects/clr/hipamd/bin/hipcc @@ -54,8 +54,6 @@ if(scalar @ARGV == 0){ $verbose = $ENV{'HIPCC_VERBOSE'} // 0; # Verbose: 0x1=commands, 0x2=paths, 0x4=hipcc args -$isWindows = $^O eq 'MSWin32'; - $HIPCC_COMPILE_FLAGS_APPEND=$ENV{'HIPCC_COMPILE_FLAGS_APPEND'}; $HIPCC_LINK_FLAGS_APPEND=$ENV{'HIPCC_LINK_FLAGS_APPEND'}; @@ -100,6 +98,7 @@ BEGIN { use lib "$base_dir/"; use hipvars; +$isWindows = $hipvars::isWindows; $HIP_RUNTIME = $hipvars::HIP_RUNTIME; $HIP_PLATFORM = $hipvars::HIP_PLATFORM; $HIP_COMPILER = $hipvars::HIP_COMPILER; @@ -147,11 +146,11 @@ $setStdLib = 0; # TODO - set to 0 $default_amdgpu_target = 1; if ($HIP_PLATFORM eq "amd") { - $HIPCC="$HIP_CLANG_PATH/clang++"; + $HIPCC="\"$HIP_CLANG_PATH/clang++\""; # If $HIPCC clang++ is not compiled, use clang instead if ( ! -e $HIPCC ) { - $HIPCC="$HIP_CLANG_PATH/clang"; + $HIPCC="\"$HIP_CLANG_PATH/clang\""; $HIPLDFLAGS = "--driver-mode=g++"; } @@ -185,9 +184,9 @@ if ($HIP_PLATFORM eq "amd") { } else { $HIPCXXFLAGS .= " -std=c++11"; } - $HIPCXXFLAGS .= " -isystem $HIP_CLANG_INCLUDE_PATH/.."; - $HIPCFLAGS .= " -isystem $HIP_CLANG_INCLUDE_PATH/.."; - $HIPLDFLAGS .= " -L$HIP_LIB_PATH"; + $HIPCXXFLAGS .= " -isystem \"$HIP_CLANG_INCLUDE_PATH/..\""; + $HIPCFLAGS .= " -isystem \"$HIP_CLANG_INCLUDE_PATH/..\""; + $HIPLDFLAGS .= " -L\"$HIP_LIB_PATH\""; if ($isWindows) { $HIPLDFLAGS .= " -lamdhip64"; } @@ -196,9 +195,11 @@ if ($HIP_PLATFORM eq "amd") { $HIPCXXFLAGS .= " -Xclang -fallow-half-arguments-and-returns -D__HIP_HCC_COMPAT_MODE__=1"; } - $HSA_PATH=$ENV{'HSA_PATH'} // "$ROCM_PATH/hsa"; - $HIPCXXFLAGS .= " -isystem $HSA_PATH/include"; - $HIPCFLAGS .= " -isystem $HSA_PATH/include"; + if (not $isWindows) { + $HSA_PATH=$ENV{'HSA_PATH'} // "$ROCM_PATH/hsa"; + $HIPCXXFLAGS .= " -isystem $HSA_PATH/include"; + $HIPCFLAGS .= " -isystem $HSA_PATH/include"; + } } elsif ($HIP_PLATFORM eq "nvidia") { $CUDA_PATH=$ENV{'CUDA_PATH'} // '/usr/local/cuda'; @@ -220,8 +221,8 @@ if ($HIP_PLATFORM eq "amd") { } # Add paths to common HIP includes: -$HIPCXXFLAGS .= " -isystem $HIP_INCLUDE_PATH" ; -$HIPCFLAGS .= " -isystem $HIP_INCLUDE_PATH" ; +$HIPCXXFLAGS .= " -isystem \"$HIP_INCLUDE_PATH\"" ; +$HIPCFLAGS .= " -isystem \"$HIP_INCLUDE_PATH\"" ; my $compileOnly = 0; my $needCXXFLAGS = 0; # need to add CXX flags to compile step @@ -585,7 +586,7 @@ if($HIP_PLATFORM eq "amd"){ if($default_amdgpu_target eq 1) { if (defined $ENV{HCC_AMDGPU_TARGET}) { $targetsStr = $ENV{HCC_AMDGPU_TARGET}; - } else { + } elsif (not $isWindows) { # Else try using rocm_agent_enumerator $ROCM_AGENT_ENUM = "${ROCM_PATH}/bin/rocm_agent_enumerator"; $targetsStr = `${ROCM_AGENT_ENUM} -t GPU`; diff --git a/projects/clr/hipamd/bin/hipconfig b/projects/clr/hipamd/bin/hipconfig index 2e75fd7706..88b657e21f 100755 --- a/projects/clr/hipamd/bin/hipconfig +++ b/projects/clr/hipamd/bin/hipconfig @@ -17,6 +17,7 @@ BEGIN { use lib "$base_dir/"; use hipvars; +$isWindows = $hipvars::isWindows; $HIP_RUNTIME = $hipvars::HIP_RUNTIME; $HIP_PLATFORM = $hipvars::HIP_PLATFORM; $HIP_COMPILER = $hipvars::HIP_COMPILER; @@ -44,13 +45,17 @@ GetOptions( ); if ($HIP_COMPILER eq "clang") { - $HIP_CLANG_VERSION = `$HIP_CLANG_PATH/clang++ --version`; + $HIP_CLANG_VERSION = `\"$HIP_CLANG_PATH/clang++\" --version`; $HIP_CLANG_VERSION=~/.*clang version (\S+).*/; $HIP_CLANG_VERSION=$1; - $CPP_CONFIG = " -D__HIP_PLATFORM_HCC__= -D__HIP_PLATFORM_AMD__= -I$HIP_PATH/include -I$HIP_CLANG_PATH/../lib/clang/$HIP_CLANG_VERSION -I$HSA_PATH/include"; -} + $CPP_CONFIG = " -D__HIP_PLATFORM_HCC__= -D__HIP_PLATFORM_AMD__= -I\"$HIP_PATH/include\" -I\"$HIP_CLANG_PATH/../lib/clang/$HIP_CLANG_VERSION\""; + # HIP on Windows does not need HSA_PATH + if (not $isWindows) { + $CPP_CONFIG .= " -I$HSA_PATH/include"; + } +} if ($HIP_PLATFORM eq "nvidia") { $CPP_CONFIG = " -D__HIP_PLATFORM_NVCC__= -D__HIP_PLATFORM_NVIDIA__= -I$HIP_PATH/include -I$CUDA_PATH/include"; }; @@ -129,16 +134,27 @@ if (!$printed or $p_full) { if ($HIP_COMPILER eq "clang") { print "== hip-clang\n"; - print ("HSA_PATH : $HSA_PATH\n"); + if (not $isWindows) { + print ("HSA_PATH : $HSA_PATH\n"); + } print ("HIP_CLANG_PATH : $HIP_CLANG_PATH\n"); - system("$HIP_CLANG_PATH/clang++ --version"); - system("$HIP_CLANG_PATH/llc --version"); - print ("hip-clang-cxxflags : "); - system("$HIP_PATH/bin/hipcc --cxxflags"); - printf("\n"); - print ("hip-clang-ldflags : "); - system("$HIP_PATH/bin/hipcc --ldflags"); - printf("\n"); + system("\"$HIP_CLANG_PATH/clang++\" --version"); + system("\"$HIP_CLANG_PATH/llc\" --version"); + if ($isWindows) { + printf("hip-clang-cxxflags : "); + $win_output = `perl \"$HIP_PATH/bin/hipcc\" --cxxflags`; + printf("$win_output \n"); + printf("hip-clang-ldflags : "); + $win_output = `perl \"$HIP_PATH/bin/hipcc\" --ldflags`; + printf("$win_output \n"); + } else { + print ("hip-clang-cxxflags : "); + system("$HIP_PATH/bin/hipcc --cxxflags"); + printf("\n"); + print ("hip-clang-ldflags : "); + system("$HIP_PATH/bin/hipcc --ldflags"); + printf("\n"); + } } else { print ("Unexpected HIP_COMPILER: $HIP_COMPILER\n"); } @@ -153,14 +169,25 @@ if (!$printed or $p_full) { print "\n" ; print "=== Environment Variables\n"; - system("echo PATH=\$PATH"); - system("env | egrep '^HIP|^HSA|^CUDA|^LD_LIBRARY_PATH'"); + if ($isWindows) { + print ("PATH=$ENV{PATH}\n"); + system("set | findstr /B /C:\"HIP\" /C:\"HSA\" /C:\"CUDA\" /C:\"LD_LIBRARY_PATH\""); + } else { + system("echo PATH=\$PATH"); + system("env | egrep '^HIP|^HSA|^CUDA|^LD_LIBRARY_PATH'"); + } print "\n" ; - print "== Linux Kernel\n"; - print "Hostname : "; system ("hostname"); - system ("uname -a"); + if ($isWindows) { + print "== Windows Display Drivers\n"; + print "Hostname : "; system ("hostname"); + system ("wmic path win32_VideoController get AdapterCompatibility,InstalledDisplayDrivers,Name | findstr /B /C:\"Advanced Micro Devices\""); + } else { + print "== Linux Kernel\n"; + print "Hostname : "; system ("hostname"); + system ("uname -a"); + } if (-e "/usr/bin/lsb_release") { system ("/usr/bin/lsb_release -a"); diff --git a/projects/clr/hipamd/bin/hipvars.pm b/projects/clr/hipamd/bin/hipvars.pm index 5ab99909eb..b919f16232 100644 --- a/projects/clr/hipamd/bin/hipvars.pm +++ b/projects/clr/hipamd/bin/hipvars.pm @@ -38,6 +38,8 @@ sub can_run { } } +$isWindows = $^O eq 'MSWin32'; + # # TODO: Fix rpath LDFLAGS settings # @@ -57,7 +59,13 @@ if (-e "$HIP_PATH/../bin/rocm_agent_enumerator") { } $CUDA_PATH=$ENV{'CUDA_PATH'} // '/usr/local/cuda'; $HSA_PATH=$ENV{'HSA_PATH'} // "$ROCM_PATH/hsa"; -$HIP_CLANG_PATH=$ENV{'HIP_CLANG_PATH'} // "$ROCM_PATH/llvm/bin"; + +# Windows has a different structure, all binaries are inside hip/bin +if ($isWindows) { + $HIP_CLANG_PATH=$ENV{'HIP_CLANG_PATH'} // "$HIP_PATH/bin"; +} else { + $HIP_CLANG_PATH=$ENV{'HIP_CLANG_PATH'} // "$ROCM_PATH/llvm/bin"; +} # HIP_ROCCLR_HOME is used by Windows builds $HIP_ROCCLR_HOME=$ENV{'HIP_ROCCLR_HOME'}; @@ -80,7 +88,7 @@ $HIP_RUNTIME = $ENV{'HIP_RUNTIME'} // $hipInfo{'HIP_RUNTIME'} // "rocclr"; if (defined $HIP_RUNTIME and $HIP_RUNTIME eq "rocclr" and !defined $HIP_ROCCLR_HOME) { my $hipvars_dir = dirname($0); if (-e "$hipvars_dir/../lib/bitcode") { - $HIP_ROCCLR_HOME = abs_path($hipvars_dir . "/.."); + $HIP_ROCCLR_HOME = Cwd::abs_path($hipvars_dir . "/.."); } else { $HIP_ROCCLR_HOME = $HIP_PATH; # use HIP_PATH } @@ -113,4 +121,4 @@ parse_config_file("$hipvars::HIP_PATH/bin/.hipVersion", \%hipVersion); $HIP_VERSION_MAJOR = $hipVersion{'HIP_VERSION_MAJOR'} // $HIP_BASE_VERSION_MAJOR; $HIP_VERSION_MINOR = $hipVersion{'HIP_VERSION_MINOR'} // $HIP_BASE_VERSION_MINOR; $HIP_VERSION_PATCH = $hipVersion{'HIP_VERSION_PATCH'} // "0"; -$HIP_VERSION="$HIP_VERSION_MAJOR.$HIP_VERSION_MINOR.$HIP_VERSION_PATCH"; \ No newline at end of file +$HIP_VERSION="$HIP_VERSION_MAJOR.$HIP_VERSION_MINOR.$HIP_VERSION_PATCH";