set -eou pipefail export WORK_DIR=/rust/cwpears/cudas SIMULTANEOUS_DOWNLOADS=4 SIMULTANEOUS_EXTRACTS=2 URLS=( https://developer.nvidia.com/compute/cuda/10.0/Prod/local_installers/cuda_10.0.130_410.48_linux https://developer.nvidia.com/compute/cuda/10.1/Prod/local_installers/cuda_10.1.105_418.39_linux.run https://developer.nvidia.com/compute/cuda/10.1/Prod/local_installers/cuda_10.1.168_418.67_linux.run https://developer.download.nvidia.com/compute/cuda/10.1/Prod/local_installers/cuda_10.1.243_418.87.00_linux.run https://developer.download.nvidia.com/compute/cuda/10.2/Prod/local_installers/cuda_10.2.89_440.33.01_linux.run ) function cuda_release { version_re='/([0-9]+\.[0-9]+\.*[0-9]*)/' if [[ $1 =~ $version_re ]]; then echo ${BASH_REMATCH[1]} else echo "no match" exit 1 fi } function download { wget --no-check-certificate -P "$WORK_DIR" -c $1 } export -f download # export to subshells function extract { fname="$WORK_DIR"/$(basename $1) dirname="${fname%.*}" echo "$fname -> $dirname" rm -rf "$dirname" if [[ $1 == *"0.130"* ]]; then $SHELL "$fname" --silent --override --toolkit --toolkitpath="$dirname" $SHELL "$fname" --silent --override --extract="$dirname" rm -f $dirname/cuda-linux* rm -f $dirname/cuda-samples-* elif [[ $1 == *"1.105"* ]] || [[ $1 == *"1.168"* ]]; then $SHELL "$fname" --silent --override --toolkit --toolkitpath="$dirname" --defaultroot="$dirname" $SHELL "$fname" --silent --override --extract="$dirname" rm -f $dirname/cuda-linux* rm -f $dirname/cuda-samples-* elif [[ $1 == *"1.243"* ]] || [[ $1 == *"2.89"* ]]; then $SHELL "$fname" --silent --override --override-driver-check --toolkit --toolkitpath="$dirname" --defaultroot="$dirname" $SHELL "$fname" --silent --override --override-driver-check --extract="$dirname" rm -f $dirname/cuda-linux* rm -f $dirname/cuda-samples-* fi } export -f extract # export to subshells function cuda_version { fname="$WORK_DIR"/$(basename $1) dirname="${fname%.*}" version=$(grep -roh -E 'CUDA_VERSION ([0-9]+)' $dirname/include | grep -o -E '[0-9]+') echo CUDA_VERSION '(CUDA API Version)' $version } function path_size { fname="$WORK_DIR"/$(basename $1) dirname="${fname%.*}" if stat -t $dirname/$2 >/dev/null 2>&1; then # tests if glob matches anything du -sLc $dirname/$2 | tail -n1 | cut -f1 else echo 0 fi } function so_size { fname="$WORK_DIR"/$(basename $1) dirname="${fname%.*}" du -sLc $dirname/lib64/$2*.so | tail -n1 | cut -f1 } function dir_syms { shopt -s globstar fname="$WORK_DIR"/$(basename $1) dirname="${fname%.*}" nm -D --defined-only $dirname/lib64/$2.so | wc -l } function cuda_size { fname="$WORK_DIR"/$(basename $1) dirname="${fname%.*}" du -s "$dirname" | cut -f1 } function cusparse_size { so_size $1 libcusparse } function cublas_size { so_size $1 libcublas } function nvcc_size { path_size $1 bin/nvcc } function cufft_size { so_size $1 libcufft } function curand_size { so_size $1 libcurand } function cusolver_size { so_size $1 libcusolver } function npp_size { so_size $1 libnpp* } function nsight_compute_size { a=$(path_size $1 NsightCompute-*) b=$(path_size $1 nsight-compute-*) echo $a + $b | bc -l } function nsight_systems_size { a=$(path_size $1 NsightSystems-*) b=$(path_size $1 nsight-systems-*) echo $a + $b | bc -l } function cupti_size { fname="$WORK_DIR"/$(basename $1) dirname="${fname%.*}" du -sLc $dirname/extras/CUPTI/lib64/libcupti*.so | tail -n1 | cut -f1 } function gdb_size { path_size $1 bin/cuda-gdb* } function cudart_size { so_size $1 libcudart } function nvrtc_size { so_size $1 libnvrtc } function nsight_size { path_size $1 libnsight } function driver_size { path_size $1 NVIDIA-* } function pct { echo "x=$1 / $2 * 100; scale=2; x/1" | bc -l } function cusparse_syms { dir_syms $1 libcusparse } function cublas_syms { dir_syms $1 libcublas } function cusolver_syms { dir_syms $1 libcusolver } function cufft_syms { dir_syms $1 libcufft } function curand_syms { dir_syms $1 libcurand } function cudart_syms { dir_syms $1 libcudart } function cupti_syms { shopt -s globstar fname="$WORK_DIR"/$(basename $1) dirname="${fname%.*}" nm -D --defined-only $dirname/extras/CUPTI/lib64/libcupti*.so | wc -l } function npp_syms { dir_syms $1 libnpp* } function sym_table { printf "${TABLE_START}" printf "${ROW_START}${HCELL_START}CUDA Release${HCELL_END}" printf "${HCELL_START}cuSPARSE${HCELL_END}" printf "${HCELL_START}cuBLAS${HCELL_END}" printf "${HCELL_START}cuSOLVER${HCELL_END}" printf "${HCELL_START}cuFFT${HCELL_END}" printf "${HCELL_START}cuRAND${HCELL_END}" printf "${HCELL_START}cudart${HCELL_END}" printf "${HCELL_START}cupti${HCELL_END}" printf "${HCELL_START}npp${HCELL_END}" printf "${ROW_END}" for url in ${URLS[*]}; do _r=$(cuda_release "$url") printf "${ROW_START}" printf "${CELL_START}$_r${CELL_END}" printf "${CELL_START}$(cusparse_syms $url)${CELL_END}" printf "${CELL_START}$(cublas_syms $url)${CELL_END}" printf "${CELL_START}$(cusolver_syms $url)${CELL_END}" printf "${CELL_START}$(cufft_syms $url)${CELL_END}" printf "${CELL_START}$(curand_syms $url)${CELL_END}" printf "${CELL_START}$(cudart_syms $url)${CELL_END}" printf "${CELL_START}$(cupti_syms $url)${CELL_END}" printf "${CELL_START}$(npp_syms $url)${CELL_END}" printf "$ROW_END" done printf "${TABLE_END}" } function sym_html { TABLE_START="