【问题标题】:Reducing a data frame for computing harmonic speedup in R减少用于计算 R 中的谐波加速的数据帧
【发布时间】:2012-09-06 13:16:40
【问题描述】:

我有一个包含以下信息的数据集:

  • 工作负载名称
  • 使用的配置
  • 衡量的性能

这里有一个玩具数据集来说明我的问题(性能数据根本没有意义,我只是选择了不同的整数以使示例易于理解。实际上,数据将是来自性能测量的浮点值):

  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 &lt;- runif(8))。詹姆斯和扎克的回答都理解我的部分问题是错误的,所以我认为最好在问题中澄清这一点。无论如何,我概括了这两个答案来处理配置 1 的性能不是 (1, 2) 的情况

【问题讨论】:

    标签: r dataframe reduction


    【解决方案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
    

    【讨论】:

    • 我编辑了问题以将其概括为配置 1 的性能不是 (1, 2) 的情况。如果您认为有更好的方法,请随意更改它。无论如何,感谢您的回答,因为它确实为我指出了如何解决问题的正确方向:)
    【解决方案2】:

    对于这样的问题,我喜欢“重塑”数据框,使用 reshape2 包,为工作负载 a 提供一列,为工作负载 b 提供一列。然后很容易使用向量运算比较两列:

    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
    

    【讨论】:

    • 我编辑了问题以将其概括为配置 1 的性能不是 (1, 2) 的情况。如果您认为有更好的方法,请随意更改它。无论如何,感谢您的回答,因为它确实为我指出了如何解决问题的正确方向:)
    猜你喜欢
    • 1970-01-01
    • 2014-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-25
    • 2023-03-06
    相关资源
    最近更新 更多