Repository: incubator-systemml Updated Branches: refs/heads/master a6428f7d8 -> 0abb3db01
[SYSTEMML-1602] Improve formatting of heavy hitter output Align heavy hitter instruction statistics in columns in tabular format. Closes #496. Project: http://git-wip-us.apache.org/repos/asf/incubator-systemml/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-systemml/commit/0abb3db0 Tree: http://git-wip-us.apache.org/repos/asf/incubator-systemml/tree/0abb3db0 Diff: http://git-wip-us.apache.org/repos/asf/incubator-systemml/diff/0abb3db0 Branch: refs/heads/master Commit: 0abb3db019c043b4bdb1918194417f03df336619 Parents: a6428f7 Author: Deron Eriksson <[email protected]> Authored: Fri May 19 16:32:27 2017 -0700 Committer: Deron Eriksson <[email protected]> Committed: Fri May 19 16:32:27 2017 -0700 ---------------------------------------------------------------------- .../java/org/apache/sysml/utils/Statistics.java | 93 +++++++++++++++----- 1 file changed, 69 insertions(+), 24 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/0abb3db0/src/main/java/org/apache/sysml/utils/Statistics.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/utils/Statistics.java b/src/main/java/org/apache/sysml/utils/Statistics.java index 49633d8..808267d 100644 --- a/src/main/java/org/apache/sysml/utils/Statistics.java +++ b/src/main/java/org/apache/sysml/utils/Statistics.java @@ -22,6 +22,7 @@ package org.apache.sysml.utils; import java.lang.management.CompilationMXBean; import java.lang.management.GarbageCollectorMXBean; import java.lang.management.ManagementFactory; +import java.text.DecimalFormat; import java.util.Arrays; import java.util.Comparator; import java.util.HashMap; @@ -504,42 +505,86 @@ public class Statistics return _cpInstCounts.get(opcode); } + /** + * Obtain a string tabular representation of the heavy hitter instructions + * that displays the time, instruction count, and optionally GPU stats about + * each instruction. + * + * @param num + * the maximum number of heavy hitters to display + * @return string representing the heavy hitter instructions in tabular + * format + */ @SuppressWarnings("unchecked") - public static String getHeavyHitters( int num ) - { + public static String getHeavyHitters(int num) { int len = _cpInstTime.size(); - if( num <= 0 || len <= 0 ) + if (num <= 0 || len <= 0) return "-"; - - //get top k via sort - Entry<String,Long>[] tmp = _cpInstTime.entrySet().toArray(new Entry[len]); + + // get top k via sort + Entry<String, Long>[] tmp = _cpInstTime.entrySet().toArray(new Entry[len]); Arrays.sort(tmp, new Comparator<Entry<String, Long>>() { - public int compare(Entry<String, Long> e1, Entry<String, Long> e2) { - return e1.getValue().compareTo(e2.getValue()); - } + public int compare(Entry<String, Long> e1, Entry<String, Long> e2) { + return e1.getValue().compareTo(e2.getValue()); + } }); - - //prepare output string + + final String numCol = "#"; + final String instCol = "Instruction"; + final String timeSCol = "Time(s)"; + final String countCol = "Count"; + final String gpuCol = "GPU"; StringBuilder sb = new StringBuilder(); - for( int i=0; i<Math.min(num, len); i++ ){ - String key = tmp[len-1-i].getKey(); - sb.append("-- "+(i+1)+") \t"); - sb.append(key); - sb.append(" \t"); - sb.append(String.format("%.3f", ((double)tmp[len-1-i].getValue())/1000000000)); - sb.append(" sec \t"); - sb.append(_cpInstCounts.get(key)); - sb.append("\t"); + int numHittersToDisplay = Math.min(num, len); + int maxNumLen = String.valueOf(numHittersToDisplay).length(); + int maxInstLen = instCol.length(); + int maxTimeSLen = timeSCol.length(); + int maxCountLen = countCol.length(); + DecimalFormat sFormat = new DecimalFormat("#,##0.000"); + for (int i = 0; i < numHittersToDisplay; i++) { + Entry<String, Long> hh = tmp[len - 1 - i]; + String instruction = hh.getKey(); + Long timeNs = hh.getValue(); + double timeS = (double) timeNs / 1000000000.0; + + maxInstLen = Math.max(maxInstLen, instruction.length()); + + String timeSString = sFormat.format(timeS); + maxTimeSLen = Math.max(maxTimeSLen, timeSString.length()); + + maxCountLen = Math.max(maxCountLen, String.valueOf(_cpInstCounts.get(instruction)).length()); + } + sb.append(String.format( + " %" + maxNumLen + "s %-" + maxInstLen + "s %" + maxTimeSLen + "s %" + maxCountLen + "s", numCol, + instCol, timeSCol, countCol)); + if (GPUStatistics.DISPLAY_STATISTICS) { + sb.append(" "); + sb.append(gpuCol); + } + sb.append("\n"); + for (int i = 0; i < numHittersToDisplay; i++) { + String instruction = tmp[len - 1 - i].getKey(); + + Long timeNs = tmp[len - 1 - i].getValue(); + double timeS = (double) timeNs / 1000000000.0; + String timeSString = sFormat.format(timeS); + + Long count = _cpInstCounts.get(instruction); + sb.append(String.format( + " %" + maxNumLen + "d %-" + maxInstLen + "s %" + maxTimeSLen + "s %" + maxCountLen + "d", + (i + 1), instruction, timeSString, count)); + // Add the miscellaneous timer info if (GPUStatistics.DISPLAY_STATISTICS) { - sb.append(GPUStatistics.getStringForCPMiscTimesPerInstruction(key)); + sb.append(" "); + sb.append(GPUStatistics.getStringForCPMiscTimesPerInstruction(instruction)); } sb.append("\n"); } - + return sb.toString(); } - + /** * Returns the total time of asynchronous JIT compilation in milliseconds. * @@ -715,7 +760,7 @@ public class Statistics sb.append("Total JVM GC count:\t\t" + getJVMgcCount() + ".\n"); sb.append("Total JVM GC time:\t\t" + ((double)getJVMgcTime())/1000 + " sec.\n"); LibMatrixDNN.appendStatistics(sb); - sb.append("Heavy hitter instructions (name, time, count):\n" + getHeavyHitters(maxHeavyHitters)); + sb.append("Heavy hitter instructions:\n" + getHeavyHitters(maxHeavyHitters)); } return sb.toString();
