3

次の情報を含むデータセットがあります。

  • ワークロード名
  • 使用した構成
  • 測定されたパフォーマンス

ここに、私の問題を説明するおもちゃのデータ セットがあります (パフォーマンス データはまったく意味がありません。例を簡単に理解できるように、さまざまな整数を選択しただけです。実際には、そのデータはパフォーマンス測定から得られた浮動小数点値になります)。

  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) と特定の構成の結果は、一緒に処理する必要があります (ハーモニック スピードアップ式の分母の最初の 2 つのパフォーマンス測定値はワークロード A から取得され、残りの 2 つはワークロード B から取得されます)。
  • ワークロードのペアと構成ごとに、構成ベース (例では cfg 1) の値を使用してパフォーマンス値を「正規化」する必要があります。

aggregateorなどのR関数でそれを表現する方法がよくわかりませんddply(可能であれば、まったく)。

これを解決する方法を知っている人はいますか?

編集: 1..8 as を使用perfすると混乱が生じるのではないかと心配していました。簡単にするためにそうしましたが、値はそれらの値である必要はありません (たとえば、次のように初期化することを想像してください: dframe$perf <- runif(8))。ジェームズとザックの両方の回答は、私の質問のその部分が間違っていることを理解していたので、質問でこれを明確にする方がよいと思いました. とにかく、構成1のパフォーマンスが(1、2)ではない場合に対処するために、両方の答えを一般化しました

4

2 に答える 2

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
于 2012-09-06T18:42:33.553 に答える
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
于 2012-09-06T13:50:59.970 に答える