2012-09-06 38 views
3

計算諧波加速我有包含以下信息的數據集:減少數據幀中的R

  • 負荷名稱
  • 配置用於
  • 測量性能

在這裏,你有一個玩具數據集來說明我的問題(性能數據根本沒有意義,我只是選擇了不同的整數來使示例容易遵循,實際上數據將是浮點數從性能測量來牛逼值):

workload cfg perf 
1  a 1 1 
2  b 1 2 
3  a 2 3 
4  b 2 4 
5  a 3 5 
6  b 3 6 
7  a 4 7 
8  b 4 8 

可以使用生成它:

dframe <- data.frame(workload=rep(letters[1:2], 4), 
        cfg=unlist(lapply(seq_len(4), 
           function(x) { return(c(x, x)) })), 
        perf=round(seq_len(8)) 
        ) 

我試圖來計算不同配置的諧波加速。爲此需要基本配置(在本例中爲cfg = 1)。然後高次諧波加速計算爲:

      num_workloads 
HS(cfg_i) = num_workloads/ sum  (perf(cfg_base, wl_j)/perf(cfg_i, wl_j)) 
           wl_j 

例如,對於配置2將是:

HS(cfg_2) = 2/[perf(cfg_1, wl_1)/perf(cfg_2, wl_1) + 
       perf(cfg_1, wl_2)/perf_cfg_2, wl_2)] 

我想計算諧波加速每工作量對和配置。通過使用示例數據集,其結果必然是:

workload.pair cfg  harmonic.speedup 
1  a-b  1 2/(1/1 + 2/2) = 1 
2  a-b  2 2/(1/3 + 2/4) = 2.4 
3  a-b  3 2/(1/5 + 2/6) = 3.75 
4  a-b  4 2/(1/7 + 2/8) = 5.09 

我與aggregateddply,以找到一種不使用循環溶液中掙扎,但我一直沒能拿出一個工作解。所以,我面臨的基本問題是:

  • 如何處理工作負載和配置之間的關係。給定工作量對(AB)和給定配置的結果必須一起處理(諧波加速公式的分母中的前兩個性能度量來自工作量A,而其他兩個來自工作量B)
  • 對於每個工作負載對和配置,我需要使用來自配置庫(示例中的cfg 1)的值來「規範化」性能值

我真的不知道如何用一些R函數來表示,例如aggregateddply(如果有可能的話)。

有誰知道這是如何解決的?

編輯:我不知道如何使用1..8作爲perf可能會導致一些混淆。爲了簡單起見,我這樣做了,但這些值不需要是那些值(例如,想象如下初始化它們:dframe$perf <- runif(8))。詹姆斯和扎克的答案都理解我的問題的一部分是錯誤的,所以我認爲最好在問題中澄清這一點。無論如何,我全身都答覆處理情況進行配置1的性能不是(1,2)

回答

1

試試這個:

library(plyr) 
baseline <- dframe[dframe$cfg == 1,]$perf 
hspeed <- function(x) length(x)/sum(baseline/x) 
ddply(dframe,.(cfg),summarise,workload.pair=paste(workload,collapse="-"), 
    harmonic.speedup=hspeed(perf)) 
    cfg workload.pair harmonic.speedup 
1 1   a-b   1.000000 
2 2   a-b   2.400000 
3 3   a-b   3.750000 
4 4   a-b   5.090909 
+0

我編輯以它推廣到的情況下的問題,其中對於配置1的表現並不'(1,2)'。如果你認爲有更好的方法去做,可以隨意改變它。無論如何,感謝您的答案,因爲它真的指出我如何解決問題的正確方向:) – betabandido

1

對於這樣的問題,我喜歡「重塑」的數據幀,使用reshape2包,爲工作負載a提供一列,爲工作負載提供一列b。它是那麼容易比較使用矢量運算的2列:

library(reshape2) 
dframe <- dcast(dframe, cfg~workload, value.var='perf') 
baseline <- dframe[dframe$cfg == 1, ] 
dframe$harmonic.speedup <- 2/((baseline$a/dframe$a)+(baseline$b/dframe$b)) 
> dframe 
    cfg a b harmonic.speedup 
1 1 1 2   1.000000 
2 2 3 4   2.400000 
3 3 5 6   3.750000 
4 4 7 8   5.090909 
+0

我編輯了這個問題,以推廣到配置1的性能不是'(1,2)'的情況。如果你認爲有更好的方法去做,可以隨意改變它。無論如何,感謝您的答案,因爲它真的指出我如何解決問題的正確方向:) – betabandido