Skip to content

Commit 03a5d7d

Browse files
dhruvr4dhruvr4rbuch
authored
Allow SumDetail logs to be used in Extrema Analysis (#130)
Co-authored-by: dhruvr4 <[email protected]> Co-authored-by: Ronak Buch <[email protected]>
1 parent 724a310 commit 03a5d7d

File tree

4 files changed

+84
-39
lines changed

4 files changed

+84
-39
lines changed

src/projections/Tools/Extrema/ExtremaWindow.java

Lines changed: 52 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -305,38 +305,62 @@ private void constructToolData(final long startTime, final long endTime ) {
305305
int numPEs = selectedPEs.size();
306306
tempData = new double[numPEs][];
307307

308-
// Create a list of worker threads
309-
LinkedList<Runnable> readyReaders = new LinkedList<Runnable>();
308+
if (MainWindow.runObject[myRun].hasLogData()) {
309+
// Create a list of worker threads
310+
LinkedList<Runnable> readyReaders = new LinkedList<Runnable>();
310311

311-
int pIdx=0;
312-
313-
for(Integer pe : selectedPEs){
314-
readyReaders.add( new ThreadedFileReader(pe, startTime, endTime,
315-
numActivities, numActivityPlusSpecial, selectedActivity, selectedAttribute) );
316-
pIdx++;
317-
}
318-
319-
320-
// Determine a component to show the progress bar with
321-
Component guiRootForProgressBar = null;
322-
if(thisWindow!=null && thisWindow.isVisible()) {
323-
guiRootForProgressBar = thisWindow;
324-
} else if(MainWindow.runObject[myRun].guiRoot!=null && MainWindow.runObject[myRun].guiRoot.isVisible()){
325-
guiRootForProgressBar = MainWindow.runObject[myRun].guiRoot;
326-
}
312+
for (Integer pe : selectedPEs) {
313+
readyReaders.add(new ThreadedFileReader(pe, startTime, endTime,
314+
numActivities, numActivityPlusSpecial, selectedActivity, selectedAttribute));
315+
}
327316

328-
// Pass this list of threads to a class that manages/runs the threads nicely
329-
TimedProgressThreadExecutor threadManager = new TimedProgressThreadExecutor("Loading Extrema in Parallel", readyReaders, guiRootForProgressBar, true);
330-
threadManager.runAll();
317+
// Determine a component to show the progress bar with
318+
Component guiRootForProgressBar = null;
319+
if (thisWindow != null && thisWindow.isVisible()) {
320+
guiRootForProgressBar = thisWindow;
321+
} else if (MainWindow.runObject[myRun].guiRoot != null && MainWindow.runObject[myRun].guiRoot.isVisible()) {
322+
guiRootForProgressBar = MainWindow.runObject[myRun].guiRoot;
323+
}
331324

325+
// Pass this list of threads to a class that manages/runs the threads nicely
326+
TimedProgressThreadExecutor threadManager = new TimedProgressThreadExecutor("Loading Extrema in Parallel", readyReaders, guiRootForProgressBar, true);
327+
threadManager.runAll();
328+
329+
// Retrieve results from each thread, storing them into tempData
330+
int pIdx = 0;
331+
Iterator<Runnable> iter = readyReaders.iterator();
332+
while (iter.hasNext()) {
333+
ThreadedFileReader r = (ThreadedFileReader) iter.next();
334+
tempData[pIdx] = r.myData;
335+
pIdx++;
336+
}
337+
} else if (MainWindow.runObject[myRun].hasSumDetailData()) {
338+
int intervalSize = (int) MainWindow.runObject[myRun].getSumDetailIntervalSize();
339+
int startInterval = (int) ((float) startTime / intervalSize);
340+
int endInterval = (int) Math.ceil((float) endTime / intervalSize) - 1;
341+
342+
MainWindow.runObject[myRun].LoadGraphData(intervalSize, startInterval, endInterval, false, selectedPEs);
343+
344+
int[][] sumDetailData_PE_EP = MainWindow.runObject[myRun].getSumDetailData_PE_EP();
345+
346+
double scale = 100.0 / (endTime - startTime);
347+
// Use sum files to get the idle data, sumDetail files do not contain idle data
348+
double[] idleTemp = MainWindow.runObject[myRun].sumAnalyzer.getTotalIdlePercentagePerPE(startInterval, endInterval);
349+
350+
// Assume that each PE has the same number of EPs
351+
final int numEPs = sumDetailData_PE_EP[0].length;
352+
for (int pe = 0; pe < sumDetailData_PE_EP.length; pe++) {
353+
double lis[] = new double[numEPs + 2];
354+
double sum = 0.0;
355+
for (int ep = 0; ep < numEPs; ep++) {
356+
lis[ep] = sumDetailData_PE_EP[pe][ep] * scale;
357+
sum += lis[ep];
358+
}
332359

333-
// Retrieve results from each thread, storing them into tempData
334-
int pIdx2=0;
335-
Iterator<Runnable> iter = readyReaders.iterator();
336-
while (iter.hasNext()) {
337-
ThreadedFileReader r = (ThreadedFileReader) iter.next();
338-
tempData[pIdx2] = r.myData;
339-
pIdx2++;
360+
lis[numEPs] = idleTemp[pe];
361+
lis[numEPs + 1] = 100.0 - sum - lis[numEPs];
362+
tempData[pe] = lis;
363+
}
340364
}
341365

342366
// Compute Extrema elements depending on attribute type.

src/projections/Tools/TimeProfile/TimeProfileWindow.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -445,7 +445,7 @@ else if( MainWindow.runObject[myRun].hasSumFiles()){
445445
//Bilge
446446
if( MainWindow.runObject[myRun].hasSumDetailFiles()){
447447
//idle time calculation for sum detail
448-
int[] idlePercentage = MainWindow.runObject[myRun].sumAnalyzer.getTotalIdlePercentage();
448+
double[] idlePercentage = MainWindow.runObject[myRun].sumAnalyzer.getTotalIdlePercentagePerInterval();
449449
for(int i=0;i<numIntervals;i++){
450450
graphData[i][numEPs+1] = idlePercentage[i];
451451
}

src/projections/analysis/SumAnalyzer.java

Lines changed: 30 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -626,15 +626,36 @@ private String nextString(String description)
626626
return tokenizer.sval;
627627
}
628628

629-
public int[] getTotalIdlePercentage(){
630-
int[] totalIdlePercentage = new int[IntervalCount];
631-
for(int i=0; i<nPe; i++){
632-
for(int j=0; j<IntervalCount; j++){
633-
totalIdlePercentage[j] += IdlePercentage[i][j] / IntervalCount;
634-
}
635-
}
636-
return totalIdlePercentage;
637-
}
629+
public double[] getTotalIdlePercentagePerInterval() {
630+
return getTotalIdlePercentagePerInterval(0, IntervalCount - 1);
631+
}
632+
633+
public double[] getTotalIdlePercentagePerInterval(int startInterval, int endInterval) {
634+
double numIntervals = endInterval - startInterval + 1;
635+
double[] totalIdlePercentage = new double[(int) numIntervals];
636+
for (int pe = 0; pe < nPe; pe++) {
637+
for (int interval = startInterval; interval <= endInterval; interval++) {
638+
totalIdlePercentage[interval - startInterval] += IdlePercentage[pe][interval] / numIntervals;
639+
}
640+
}
641+
return totalIdlePercentage;
642+
}
643+
644+
public double[] getTotalIdlePercentagePerPE() {
645+
return getTotalIdlePercentagePerPE(0, IntervalCount - 1);
646+
}
647+
648+
public double[] getTotalIdlePercentagePerPE(int startInterval, int endInterval) {
649+
double numIntervals = endInterval - startInterval + 1;
650+
double[] totalIdlePercentage = new double[nPe];
651+
for (int pe = 0; pe < nPe; pe++) {
652+
for (int interval = startInterval; interval <= endInterval; interval++) {
653+
totalIdlePercentage[pe] += IdlePercentage[pe][interval] / numIntervals;
654+
}
655+
}
656+
return totalIdlePercentage;
657+
}
658+
638659
public byte[][] getIdlePercentage(){
639660
return IdlePercentage;
640661
}

src/projections/gui/MainMenuManager.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ private void stateChanged(int state, int sumDetail) {
165165
userEventsMenuItem.setEnabled(false);
166166
userStatsTimeMenuItem.setEnabled(false);
167167
userStatsProcMenuItem.setEnabled(false);
168-
outlierAnalysisMenuItem.setEnabled(false);
168+
outlierAnalysisMenuItem.setEnabled(true);
169169
multirunAnalysisMenuItem.setEnabled(true);
170170
noiseMinerMenuItem.setEnabled(true);
171171
memoryUsageMenuItem.setEnabled(true);

0 commit comments

Comments
 (0)