|
@@ -0,0 +1,123 @@
|
|
|
+# StarPU --- Runtime system for heterogeneous multicore architectures.
|
|
|
+#
|
|
|
+# Copyright (C) 2014 Imag
|
|
|
+#
|
|
|
+# StarPU is free software; you can redistribute it and/or modify
|
|
|
+# it under the terms of the GNU Lesser General Public License as published by
|
|
|
+# the Free Software Foundation; either version 2.1 of the License, or (at
|
|
|
+# your option) any later version.
|
|
|
+#
|
|
|
+# StarPU is distributed in the hope that it will be useful, but
|
|
|
+# WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
+#
|
|
|
+# See the GNU Lesser General Public License in COPYING.LGPL for more details.
|
|
|
+
|
|
|
+
|
|
|
+# R script that is giving statistical analysis of the paje trace
|
|
|
+
|
|
|
+# Can be called from the command line with:
|
|
|
+# Rscript $this_script $range1 $range2 $name $outputfile $inputfiles
|
|
|
+
|
|
|
+# Package containing ddply function
|
|
|
+library(plyr)
|
|
|
+
|
|
|
+# Function for reading .csv file
|
|
|
+read_df <- function(file,range1,range2) {
|
|
|
+ df<-read.csv(file, header=FALSE, strip.white=TRUE)
|
|
|
+ names(df) <- c("Nature","ResourceId","Type","Start","End","Duration", "Depth", "Value")
|
|
|
+ df = df[!(names(df) %in% c("Nature","Type", "Depth"))]
|
|
|
+
|
|
|
+# Changing names if needed:
|
|
|
+ df$Value <- as.character(df$Value)
|
|
|
+ df$Value <- ifelse(df$Value == "F", "Freeing", as.character(df$Value))
|
|
|
+ df$Value <- ifelse(df$Value == "A", "Allocating", as.character(df$Value))
|
|
|
+ df$Value <- ifelse(df$Value == "W", "WritingBack", as.character(df$Value))
|
|
|
+ df$Value <- ifelse(df$Value == "No", "Nothing", as.character(df$Value))
|
|
|
+ df$Value <- ifelse(df$Value == "I", "Initializing", as.character(df$Value))
|
|
|
+ df$Value <- ifelse(df$Value == "D", "Deinitializing", as.character(df$Value))
|
|
|
+ df$Value <- ifelse(df$Value == "Fi", "FetchingInput", as.character(df$Value))
|
|
|
+ df$Value <- ifelse(df$Value == "Po", "PushingOutput", as.character(df$Value))
|
|
|
+ df$Value <- ifelse(df$Value == "C", "Callback", as.character(df$Value))
|
|
|
+ df$Value <- ifelse(df$Value == "B", "Overhead", as.character(df$Value))
|
|
|
+ df$Value <- ifelse(df$Value == "Sl", "Sleeping", as.character(df$Value))
|
|
|
+ df$Value <- ifelse(df$Value == "P", "Progressing", as.character(df$Value))
|
|
|
+ df$Value <- ifelse(df$Value == "U", "Unpartitioning", as.character(df$Value))
|
|
|
+ df$Value <- ifelse(df$Value == "Ar", "AllocatingReuse", as.character(df$Value))
|
|
|
+ df$Value <- ifelse(df$Value == "R", "Reclaiming", as.character(df$Value))
|
|
|
+ df$Value <- ifelse(df$Value == "Co", "DriverCopy", as.character(df$Value))
|
|
|
+ df$Value <- ifelse(df$Value == "CoA", "DriverCopyAsync", as.character(df$Value))
|
|
|
+
|
|
|
+# Considering only the states with a given name
|
|
|
+ if (name != "All")
|
|
|
+ df<-df[df$Value %in% name[[1]],]
|
|
|
+
|
|
|
+# Aligning to begin time from 0
|
|
|
+ m <- min(df$Start)
|
|
|
+ df$Start <- df$Start - m
|
|
|
+ df$End <- df$Start+df$Duration
|
|
|
+
|
|
|
+# Taking only the states inside a given range
|
|
|
+ df <- df[df$Start>=range1 & df$End<=range2,]
|
|
|
+
|
|
|
+# Return data frame
|
|
|
+ df
|
|
|
+}
|
|
|
+
|
|
|
+#########################################
|
|
|
+#########################################
|
|
|
+# Main
|
|
|
+#########################################
|
|
|
+# Reading command line arguments
|
|
|
+args <- commandArgs(trailingOnly = TRUE)
|
|
|
+range1<-as.numeric(args[1])
|
|
|
+if (range1==-1)
|
|
|
+ range1<-Inf
|
|
|
+range2<-as.numeric(args[2])
|
|
|
+if (range2==-1)
|
|
|
+ range2<-Inf
|
|
|
+name<-strsplit(args[3], ",")
|
|
|
+outputfile<-args[4]
|
|
|
+
|
|
|
+# Reading first file
|
|
|
+filename<-args[5]
|
|
|
+df<-read_df(filename,range1,range2)
|
|
|
+
|
|
|
+# Getting summary of the first file
|
|
|
+dfout<-ddply(df, c("Value"), summarize, Events_ = length(as.numeric(Duration)), Duration_ = sum(as.numeric(Duration)))
|
|
|
+names(dfout)<-c("Value",sprintf("Events_%s",filename),sprintf("Duration_%s",filename))
|
|
|
+
|
|
|
+i=6
|
|
|
+while (i <= length(args))
|
|
|
+ {
|
|
|
+# Reading next input file
|
|
|
+ filename<-args[i]
|
|
|
+ df<-read_df(filename,range1,range2)
|
|
|
+
|
|
|
+# Getting summary of the next file
|
|
|
+ dp<-ddply(df, c("Value"), summarize, Events_ = length(as.numeric(Duration)), Duration_ = sum(as.numeric(Duration)))
|
|
|
+ names(dp)<-c("Value",sprintf("Events_%s",filename),sprintf("Duration_%s",filename))
|
|
|
+
|
|
|
+# Merging results into one single data frame
|
|
|
+ if (nrow(dp)>0)
|
|
|
+ {
|
|
|
+ if (nrow(dfout)>0)
|
|
|
+ dfout<-merge(dfout,dp, by = "Value", all=TRUE)
|
|
|
+ else
|
|
|
+ dfout<-dp
|
|
|
+ }
|
|
|
+
|
|
|
+ i <- i+1
|
|
|
+ }
|
|
|
+
|
|
|
+# Cosmetics: change NA to 0
|
|
|
+dfout[is.na(dfout)] <- 0
|
|
|
+
|
|
|
+# Error: if there is no results for a given range and state
|
|
|
+if (nrow(dfout)==0)
|
|
|
+ stop("Result is empty!")
|
|
|
+
|
|
|
+# Write results into the new .csv file
|
|
|
+write.table(dfout, file=outputfile, row.names=FALSE, sep = ", ")
|
|
|
+
|
|
|
+
|