In previous posts I had shown how to use R to generate the kappa and sigma coefficients for use with the USL equation.
I start with the data that I've compiled on the system based upon the number of concurrent threads and the throughput measured:
1: p,x 2: 1,1 3: 3,2.998108449 4: 5,4.995428752 5: 7,6.928278689 6: 10,7.539249685 7: 13,11.50488651 8: 15,11.79476671 9: 20,15.65936318 10: 30,13.61349306 11: 40,16.50567465 12: 50,14.83716898The number of threads is represented by "p" and the throughput is represented by "x"
I wrote the following R function to automagically create a plot of the data points for the above file and generate the USL curve along the data points and highlight the maximum theoretical point for the USL:
1: # Example usage:2: # plotUSL("c:/benchmark/benchmark.csv", "Benchmark data with USL curve")
3: # CSV file must have two columns with a header of "p, x"
4: # Example: 5: # p, x 6: # 1, 1 7: # 2, 1.5 8: # 3, 2 9: 10: plotUSL <- function(dataFile, graphTitle) { 11: uslData <- read.csv(dataFile, header=TRUE); 12: uslData$c <- uslData$x / uslData$x[1]; 13: usl <- nls(c ~ p/(1+sigma*(p-1)+kappa*p*(p-1)), 14: uslData,15: algorithm="port",
16: start=c(sigma=0.0, kappa=0.0), 17: lower=c(0,0));18: sigma <- coef(usl)["sigma"];
19: kappa <- coef(usl)["kappa"];
20: p <- 1:round(1.75 * max(uslData$p)); 21: Relative_Capacity <- p/(1+sigma*(p-1)+kappa*p*(p-1));22: plot(p, Relative_Capacity, type="l", ylim=c(0, round(max(Relative_Capacity, uslData$c)*1.1)));
23: points(uslData$p, uslData$c, pch=20); 24: 25: indexValue <- 1; 26: testValue <- Relative_Capacity[1]; 27: maxValue <- max(Relative_Capacity); 28: 29: while(testValue != maxValue) {
30: indexValue = indexValue + 1; 31: testValue = Relative_Capacity[indexValue]; 32: }; 33: 34: points(p[indexValue], Relative_Capacity[indexValue], col=2, pch=13, cex=2.0); 35: 36: title(main=graphTitle, col.main="black", font.main=4, cex=1.5);
37: title(sub=sprintf("USL max at p = %d with Relative_Capacity = %f",
38: indexValue, 39: Relative_Capacity[indexValue]), 40: col.main="black",
41: font.main=4, 42: cex=1.5); 43: };And viola, we can quick and dirty results after invoking the function!
> plotUSL("g:/usl/benchmark.csv", "Benchmark data with USL curve")

This function could easily be modified to accept a third parameter and save off the image to a JPG, PNG or even PDF. But I leave that as an exercise for the reader.