.results.sh 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. #!/bin/bash
  2. if [ -z "$RESULT_FIELDS" ]; then
  3. declare -a RESULT_FIELDS=()
  4. RESULT_FIELDS+=("FMM Kernel name" "kernel" )
  5. RESULT_FIELDS+=("Maximum Tree Depth" "max_d" )
  6. RESULT_FIELDS+=("Order of multipole expansions" "m" )
  7. RESULT_FIELDS+=("|" "|" )
  8. RESULT_FIELDS+=("Maximum Relative Error \[Output\]" "Linf(e)")
  9. fi
  10. if [ -z "$PROF_FIELDS" ]; then
  11. declare -a PROF_FIELDS=()
  12. PROF_FIELDS+=("InitTree" )
  13. PROF_FIELDS+=("SetupFMM" )
  14. PROF_FIELDS+=("RunFMM" )
  15. PROF_FIELDS+=("UpwardPass" )
  16. PROF_FIELDS+=("ReduceBcast" )
  17. PROF_FIELDS+=("DownwardPass")
  18. fi
  19. declare -a DEFAULT_FIELDS=()
  20. DEFAULT_FIELDS+=("nodes" )
  21. DEFAULT_FIELDS+=("mpi_proc")
  22. DEFAULT_FIELDS+=("threads" )
  23. DEFAULT_FIELDS+=("|" )
  24. RESULT_FIELDS+=("|" "|")
  25. PROF_FIELDS+=("|" )
  26. RESULT_FNAME=${RESULT_DIR}/$(basename ${0%.*}).out;
  27. rm -f ${RESULT_FNAME};
  28. # Print Result Header
  29. RESULT_HEADER="# ${RESULT_HEADER-"Script: $0 Profiling Result Format: Time (FLOP/s)"} #"
  30. printf "%${#RESULT_HEADER}s\n" |tr " " "#" | tee -a ${RESULT_FNAME};
  31. printf "${RESULT_HEADER} \n" | tee -a ${RESULT_FNAME};
  32. printf "%${#RESULT_HEADER}s\n" |tr " " "#" | tee -a ${RESULT_FNAME};
  33. # Default Field Columns
  34. COLUMN_HEADER=""
  35. for (( i = 0; i < ${#DEFAULT_FIELDS[@]}; i++ )) do
  36. COLUMN=${DEFAULT_FIELDS[$i]};
  37. if [ "$COLUMN" == "|" ]; then
  38. COLUMN_HEADER="${COLUMN_HEADER} |";
  39. else
  40. COLUMN_HEADER="${COLUMN_HEADER}$(printf " %10s" "$COLUMN")";
  41. fi
  42. done
  43. # Result Field Columns
  44. for (( i = 1; i < ${#RESULT_FIELDS[@]}; i=$(($i+2)) )) do
  45. COLUMN=${RESULT_FIELDS[$i]};
  46. if [ "$COLUMN" == "|" ]; then
  47. COLUMN_HEADER="${COLUMN_HEADER} |";
  48. else
  49. COLUMN_HEADER="${COLUMN_HEADER}$(printf " %10s" "$COLUMN")";
  50. fi
  51. done
  52. # Profiling Field Columns
  53. for (( i = 0; i < ${#PROF_FIELDS[@]}; i++ )) do
  54. COLUMN=${PROF_FIELDS[$i]};
  55. if [ "$COLUMN" == "|" ]; then
  56. COLUMN_HEADER="${COLUMN_HEADER} |";
  57. else
  58. COLUMN_HEADER="${COLUMN_HEADER}$(printf " %17s" "$COLUMN")";
  59. fi
  60. done
  61. # Print Column Headers
  62. COLUMN_HEADER="|${COLUMN_HEADER}";
  63. printf "%${#COLUMN_HEADER}s\n" |tr " " "=" | tee -a ${RESULT_FNAME}; #==========
  64. printf "${COLUMN_HEADER} \n" | tee -a ${RESULT_FNAME};
  65. printf "%${#COLUMN_HEADER}s\n" |tr " " "=" | tee -a ${RESULT_FNAME}; #==========
  66. # Create output rows
  67. declare -a RESULT_ROW=()
  68. for (( i=0; i<${#nodes[@]}; i++ )) ; do
  69. RESULT_ROW[i]="";
  70. done;
  71. # Row Values (Default Fields)
  72. for (( i = 0; i < ${#DEFAULT_FIELDS[@]}; i++ )) do
  73. COLUMN=${DEFAULT_FIELDS[$i]};
  74. for (( j=0; j<${#nodes[@]}; j++ )) ; do
  75. if [ "${nodes[j]}" == ":" ]; then continue; fi;
  76. if [ "$COLUMN" == "|" ]; then
  77. RESULT_ROW[j]="${RESULT_ROW[j]} |";
  78. else
  79. eval "colval=\${${COLUMN}[$j]}";
  80. RESULT_ROW[j]="${RESULT_ROW[j]}$(printf " %10s" "${colval}")";
  81. fi
  82. done
  83. done
  84. ################### Loop over all runs ###################
  85. for (( l=0; l<${#nodes[@]}; l++ )) ; do
  86. ( # Begin parallel subshell
  87. RESULT_FNAME=${RESULT_FNAME}_${l};
  88. # File name.
  89. FNAME_NOMIC=${RESULT_DIR}/$(basename ${EXEC})_${fname[l]}.out;
  90. FNAME_MIC=${RESULT_DIR}/$(basename ${EXEC})_mic_${fname[l]}.out;
  91. FNAME_ASYNC=${RESULT_DIR}/$(basename ${EXEC})_async_${fname[l]}.out;
  92. subrow_cnt=0;
  93. for (( k=0; k<3; k++ )) ; do
  94. case $k in
  95. 0) FNAME=${FNAME_NOMIC};;
  96. 1) FNAME=${FNAME_MIC};;
  97. 2) FNAME=${FNAME_ASYNC};;
  98. esac
  99. if [ ! -f ${FNAME} ] ; then continue; fi;
  100. if [ ! -s ${FNAME} ] ; then continue; fi;
  101. subrow_cnt=$(( $subrow_cnt + 1 ))
  102. ######################### Parse Data #################################
  103. ROW_VALUE=${RESULT_ROW[l]};
  104. # Parse Data: Results
  105. for (( i = 0; i < ${#RESULT_FIELDS[@]}; i=$(($i+2)) )) do
  106. x="${RESULT_FIELDS[i]}"
  107. if [ "$x" == "|" ]; then
  108. ROW_VALUE="${ROW_VALUE} |";
  109. continue;
  110. fi
  111. PARAM[i]="$(grep -hir "$x" ${FNAME} | tail -n 1 | rev | cut -d ' ' -f 1 | rev)";
  112. ROW_VALUE="${ROW_VALUE}$(printf " %10s" "${PARAM[i]}")";
  113. done
  114. #---------------------------------------------------------------------
  115. # Parse Data: Time, Flop, Flop/s
  116. PROC_NOMIC="$(grep -hir "Number of MPI processes:" ${FNAME_NOMIC} | tail -n 1 | tr -s ' ' | rev | cut -d ' ' -f 1 | rev)"
  117. PROC="$(grep -hir "Number of MPI processes:" ${FNAME} | tail -n 1 | tr -s ' ' | rev | cut -d ' ' -f 1 | rev)"
  118. for (( i = 0; i < ${#PROF_FIELDS[@]}; i++ )) do
  119. x="${PROF_FIELDS[i]}"
  120. if [ "$x" == "|" ]; then
  121. ROW_VALUE="${ROW_VALUE} |";
  122. continue;
  123. fi
  124. T_MAX[i]="$(grep -hir "$x " ${FNAME} | tail -n 1 | tr -s ' ' | rev | cut -d ' ' -f 10 | rev)"
  125. if [ "${T_MAX[i]}" == "" ]; then continue; fi;
  126. FP_AVG[i]="$(grep -hir "$x " ${FNAME_NOMIC} | tail -n 1 | tr -s ' ' | rev | cut -d ' ' -f 8 | rev)"
  127. FP_AVG[i]=$(echo "scale=10;${FP_AVG[i]}*${PROC_NOMIC}/${mpi_proc[l]}" | bc 2> /dev/null)
  128. FLOPS[i]=$(echo "scale=10;${FP_AVG[i]}/(${T_MAX[i]}+0.0001)" | bc 2> /dev/null)
  129. if [ "${FLOPS[i]}" != "" ] && [ -f ${FNAME_MIC} ] && [ -f ${FNAME_ASYNC} ] && [ -f ${FNAME_NOMIC} ] ; then
  130. T_MAX_NOASYNC[i]="$(grep -hir "$x " ${FNAME_MIC} | tail -n 1 | tr -s ' ' | rev | cut -d ' ' -f 10 | rev)"
  131. if [ "${T_MAX_NOASYNC[i]}" == "" ]; then continue; fi;
  132. compare_result1=$(echo "${T_MAX[i]}<0.5*${T_MAX_NOASYNC[i]}" | bc)
  133. compare_result2=$(echo "${T_MAX[i]}<0.01" | bc)
  134. if [ ${compare_result1} -eq 1 ] && [ ${compare_result2} -eq 1 ] ; then
  135. FLOPS[i]=$(echo "scale=10;${FP_AVG[i]}/${T_MAX_NOASYNC[i]}" | bc 2> /dev/null)
  136. fi
  137. fi
  138. FLOPS[i]=$(echo "scale=10;${FLOPS[i]}*${mpi_proc[l]}/${nodes[l]}" | bc 2> /dev/null)
  139. TIMING_FORMAT=" %9.3f (%5.1f)"
  140. ROW_VALUE="${ROW_VALUE}$(printf "${TIMING_FORMAT}" "${T_MAX[i]}" "${FLOPS[i]}")";
  141. done
  142. #=====================================================================
  143. ######################### Print Data #################################
  144. printf "|${ROW_VALUE}\n" >> ${RESULT_FNAME};
  145. #=====================================================================
  146. done
  147. if [[ $l == $(( ${#nodes[@]}-1 )) ]] || [ "${nodes[l]}" == ":" ]; then
  148. printf "%${#COLUMN_HEADER}s\n" |tr " " "=" >> ${RESULT_FNAME}; #==========
  149. elif [[ $subrow_cnt > 1 ]]; then
  150. printf "%${#COLUMN_HEADER}s\n" |tr " " "-" >> ${RESULT_FNAME}; #----------
  151. fi
  152. )& # End parallel subshell
  153. # Combine results
  154. if (( ($l+1) % 10 == 0 )) || [[ $l == $(( ${#nodes[@]}-1 )) ]] ; then
  155. wait;
  156. for (( i=0; i<${#nodes[@]}; i++ )) ; do
  157. RESULT_FNAME_=${RESULT_FNAME}_${i};
  158. if [ -f ${RESULT_FNAME_} ] ; then
  159. cat ${RESULT_FNAME_} | tee -a ${RESULT_FNAME};
  160. rm ${RESULT_FNAME_};
  161. fi;
  162. done
  163. fi
  164. done