Skip to content

Commit 6725a6b

Browse files
rbuchdhruvr4
andauthored
Allow custom time intervals in Usage Profile with summary/sumDetail (#128)
Co-authored-by: dhruvr4 <55036273+dhruvr4@users.noreply.github.com>
1 parent 5ae1787 commit 6725a6b

File tree

3 files changed

+69
-28
lines changed

3 files changed

+69
-28
lines changed

src/projections/analysis/Analysis.java

Lines changed: 64 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@
66
import java.awt.Paint;
77
import java.io.File;
88
import java.io.IOException;
9+
import java.util.Arrays;
910
import java.util.Iterator;
1011
import java.util.SortedSet;
12+
import java.util.TreeSet;
1113

1214
import javax.swing.SwingWorker;
1315

@@ -411,39 +413,78 @@ public float[][] GetUsageData(int pnum, long begintime,
411413
return u.usage(pnum, begintime, endtime, getVersion() );
412414
}
413415
int numUserEntries=getSts().getEntryCount();
414-
long[][] data;
415-
long[][] phasedata;
416-
416+
long[] data;
417+
float ret[][] = new float[2][numUserEntries + 4];
418+
417419
/*BAD: silently ignores begintime and endtime*/
418420
if( sumAnalyzer.getPhaseCount()>1 ) {
419421
Iterator<Integer> iter = phases.iterator();
420-
data = sumAnalyzer.getPhaseChareTime(iter.next());
422+
data = sumAnalyzer.getPhaseChareTime(iter.next())[pnum].clone();
421423

422424
while (iter.hasNext() && pnum > -1)
423425
{
424-
phasedata = sumAnalyzer.getPhaseChareTime(iter.next());
426+
long[] phasedata = sumAnalyzer.getPhaseChareTime(iter.next())[pnum];
425427
{
426428
for(int q=0; q<numUserEntries; q++) {
427-
data[pnum][q] += phasedata[pnum][q];
428-
}
429+
data[q] += phasedata[q];
430+
}
429431
}
430432
}
431-
} else {
432-
data = sumAnalyzer.getChareTime();
433-
}
434-
float ret[][]=new float[2][numUserEntries+4];
435-
//Convert to percent-- .sum entries are always over the
436-
// entire program run.
437-
double scale=100.0/getTotalTime();
438-
for (int q=0;q<numUserEntries;q++){
439-
ret[0][q]=(float)(scale*data[pnum][q]);
440-
// dummy value for message send time at the moment ..
441-
// summary file reader needs to be fixed first
442-
ret[1][q] = (float )0.0;
443-
}
444-
return ret;
445-
}
446-
433+
}
434+
else if (hasSumDetailFiles()) {
435+
SortedSet<Integer> peSet = new TreeSet<>();
436+
peSet.add(pnum);
437+
438+
double intervalSize = intervalData.getIntervalSize();
439+
int intervalStart = (int) (begintime / intervalSize);
440+
int intervalEnd = (int) Math.ceil(endtime / intervalSize) - 1;
441+
int numIntervals = intervalEnd - intervalStart + 1;
442+
443+
MainWindow.runObject[0].LoadGraphData((long) intervalData.getIntervalSize(),
444+
intervalStart,
445+
intervalEnd, false, peSet);
446+
447+
int sumDetailData[][] = intervalData.sumDetailData();
448+
data = new long[numUserEntries];
449+
for (int interval = 0; interval < numIntervals; interval++) {
450+
for (int entry = 0; entry < numUserEntries; entry++) {
451+
data[entry] += sumDetailData[interval][entry];
452+
}
453+
}
454+
}
455+
else if (hasSumFiles()) {
456+
// The log has per-EP times across the entire execution, so use that when the whole interval is selected
457+
if (endtime - begintime == totalTime) {
458+
data = sumAnalyzer.getChareTime()[pnum];
459+
}
460+
// Otherwise, the best we can do is to use the utilization data without EP info
461+
else {
462+
long total = 0;
463+
byte utilData[][] = sumAnalyzer.getProcessorUtilization();
464+
int intervalStart = (int) (begintime / getSummaryIntervalSize());
465+
int intervalEnd = (int) Math.ceil(endtime / getSummaryIntervalSize()) - 1;
466+
for (int i = intervalStart; i <= intervalEnd; i++) {
467+
total += utilData[pnum][i];
468+
}
469+
// Processor utilization data is already in terms of percent, so return it directly after averaging over the
470+
// intervals rather than proceeding to the time -> percent conversion at the end of this function
471+
ret[0][0] = ((float) total) / (intervalEnd - intervalStart + 1);
472+
return ret;
473+
}
474+
}
475+
else {
476+
return null;
477+
}
478+
// Convert to percent
479+
double scale = 100.0 / (endtime - begintime);
480+
for (int q = 0; q < numUserEntries; q++) {
481+
ret[0][q] = (float) (scale * data[q]);
482+
// dummy value for message send time at the moment
483+
// summary file reader needs to be fixed first
484+
ret[1][q] = (float) 0.0;
485+
}
486+
return ret;
487+
}
447488
// // a == entry point index, t == type of data
448489
// public int[][] getUserEntryData( int a, int t ) {
449490
// return userEntryData[ a ][ t ];

src/projections/analysis/SumAnalyzer.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -470,6 +470,10 @@ public long[][] getChareTime()
470470
return ChareTime;
471471
}
472472

473+
public byte[][] getProcessorUtilization() {
474+
return ProcessorUtilization;
475+
}
476+
473477
public long[][] getPhaseChareTime(int Phase)
474478
{
475479
return PhaseChareTime[Phase];

src/projections/gui/ProfileWindow.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -205,11 +205,7 @@ private void CreateLayout(){
205205

206206
public void showDialog(){
207207
if (dialog == null) {
208-
if ((!MainWindow.runObject[myRun].hasLogData()) && (!MainWindow.runObject[myRun].hasSumDetailData())) {
209-
dialog = new RangeDialog(this, "Usage Profile", null, true);
210-
} else {
211-
dialog = new RangeDialog(this, "Usage Profile", null, false);
212-
}
208+
dialog = new RangeDialog(this, "Usage Profile", null, false);
213209
}
214210

215211
dialog.displayDialog();

0 commit comments

Comments
 (0)