• 検索結果がありません。

エンコード開始から終了まで

ドキュメント内 2002 avidemux MPEG-4 : : : G99P045-1 (ページ 30-39)

第 4 章 並列版 avidemux の実装 12

4.4 コードの追加・修正

4.4.6 エンコード開始から終了まで

メニューから「Save AVI」を選択し、保存ファイル名を決定するとエンコード が開始され、決定された保存ファイル名でエンコード結果のファイルが保存され る。そこで、各PEで分割してエンコードを行い、各PEでのエンコード結果を

ファイルを収集、結合し、結合結果のファイルをユーザが決定した保存ファイル 名で保存するまでの処理について説明する。

フレーム区間の割り振り

保存ファイル名が決定された後呼び出される関数はavidemux/gui savenew.cpp 内のA SaveAudioNVideoである。この関数が呼び出された時点で各PEは自分 の受け持ちとなるフレーム区間を算出する。受け持ちフレーム区間の算出には以 下のような計算を行っている。

1PEが受け持つフレーム数= (終了フレーム- 開始フレーム) / PE数

あるPEでの開始フレーム =開始フレーム + (1PEが受け持つフレーム数 x 自身のランク)

あるPEでの終了フレーム=あるPEでの開始フレーム+ 1PEが受け持つ フレーム数 - 1

フレーム数は整数値であるので、PE数で割る際余りが出てしまう。それについ て現時点の実装では、余りの分を全て最終PEに全て押し付けるかたちとなって いる。

この後、ユーザにより決定された保存ファイル名一時的に退避させ、各PE毎 の決め打ちのテンポラリファイル名に置き換え、各PE毎に実際のエンコード工 程に移る。

ファイルの収集

エンコードが完了した時点で、親PEは子PEからのファイル受信、子PEは 親PEへのファイル送信の処理に移る。

³

if(myid==0)filegather_recvfiles();

else filegather_sendfile();

µ ´

送信、受信にはブロッキング通信を用いた。動作の流れとしては、

子PE

filegather sendfile

1. 親PEへファイルサイズ通知(ブロッキング通信のため親PEがこれを 受信するまで停止)

2. 親PEへファイルを送信

³

void filegather_recvfiles(void) {

(中略)

for(i = 1; i<nprocs; i++) {

// ファイルサイズ通知、兼、ファイル送信準備完了通知受信

MPI_Recv(&buffsize,1,MPI_INT,MPI_ANY_SOURCE,0,MPI_COMM_WORLD,&mpistatus);

source = mpistatus.MPI_SOURCE;

(中略)

buff = (char *)malloc(buffsize);

// ファイル受信

MPI_Recv(buff,buffsize,MPI_CHAR,source,1,MPI_COMM_WORLD,&mpistatus);

ofstream out(tmpsaveavifilename, ios::out |ios::binary);

out.write(buff,buffsize);

out.close();

free(buff);

} }

µ ´

親PE

filegather recvfiles

1. 子PEからファイルサイズ通知を受信(ブロッキング通信のためいずれ かの子PEから送信があるまで停止)

2. ファイルサイズ通知をしてきた子PEからファイルを受信

3. 子PE全てからのファイル受信を完了したら終了、そうでなければ1 へ戻る

³

void filegather_sendfile(void) {

(中略)

ifstream in(tmpsaveavifilename, ios::in | ios::binary);

in.seekg(0,ios::end);

filesize = in.tellg();

in.seekg(0,ios::beg);

buff = (char *)malloc(filesize);

in.read(buff,filesize);

MPI_Send(&filesize,1,MPI_INT,0,0,MPI_COMM_WORLD); // ファイ ル サイズ送信

MPI_Send(buff,filesize,MPI_CHAR,0,1,MPI_COMM_WORLD); // ファイ ル送信

free(buff);

in.close();

}

µ ´

といったものになっている。MPI Gatherに似た動作となっているが、受信結果 をファイルに格納をしている点がことなる。

ファイルの結合、保存

全PEでのエンコード結果のファイルが親PEに集まったら、ファイルの結合 に入る。結合には元からavidemuxに存在した関数、A openAvi(AVIファイルの オープン)、A appendAvi(オープンしているファイル末尾に別のAVIファイルを 結合)、A SaveAudioNVideo(変数audioProcessMode、videoProcessModeを共に 0とすることでオープンしてあるAVIファイルをエンコード工程なしで保存)に 僅かに手を加えたものを使用した。

³

A_openAvi_pe0(tmpsaveavifilename00);

for(i=1;i<nprocs;i++) {

tmpsaveavifilename[filename_length] = ’0’ + (int)(i / 10);

tmpsaveavifilename[filename_length+1] = ’0’ +(i % 10);

tmpsaveavifilename[filename_length+2] = ’\0’;

A_appendAvi_pe0(tmpsaveavifilename);

}

tmpsaveavifilename[filename_length] = ’\0’;

frameStart = tmpframeStart;

frameEnd = tmpframeEnd;

A_SaveAudioNVideo_pe0(realname);

µ ´

第 5 章 並列版 avidemux の性能評価

実装した並列版avidemuxの性能評価を行った。映像ソースとしては解像度640x360, フレーム数35899のDivX動画、解像度320x240,フレーム数900の無圧縮AVIの 二種類を用い、それらをDivXのCQ(固定品質)、パラメータ4でエンコードし た。実行環境は第3章で説明したfolon4である。なお、今回はSMPマシン用実 装が間に合わなかったため、1ノード辺り1PEの設定で使用している。

図5.1は並列効果を示したグラフである。横軸はPE数であり、逐次版をPE数 1として扱っている。縦軸は「逐次版での所要時間/各PE数での所要時間」によ り算出した並列効果である。細かい測定値については表5.1に示す。値の単位はは secである。それぞれの値について説明すると、totalがエンコード開始からファイ ル結合終了までの時間、bcastingがファイルオープン時のブロードキャストにか かった時間、mergingがファイル結合にかかった時間、gatheringがPE0がファイル 受信待ち受け状態になった時点からファイル回収完了の時点までの時間、enctime maxがもっともエンコードに時間がかかったPEのエンコード時間、enctime min がもっともはやくエンコードが完了したPEのエンコード時間、enctime pe0が PE0でのエンコード時間、enctime avgが全PEでのエンコード時間の平均をとっ たもの、waittime maxが子PEがエンコード完了した後、PE0へのファイル転送 を行える状態になるまでにかかった時間の中で最も大きいものである。

両者とも概ね並列効果のみられる結果となった。PE数が大きくなったところ で性能が落ちている個所があるが、まず、DivX動画をソースとしたものについて は、この性能低下の原因として、ファイル結合にかかる時間のばらつきがあげら れる。ばらつきの範囲の絶対値についてはPE数が小さいときとPE数が大きい ときとで大差ないのだが、エンコードにかかる時間が小さくなるにつれ全体の時 間に占めるファイル結合にかかる時間の割合が増え、結果として性能に響いてき てしまっている。ばらつきの出る原因自体についてはこの個所は元々avidemuxに あったコードをブラックボックス的に流用しているだけなので分からない。次に、

Avi動画をソースとしたものについては、性能低下の原因として、まずフレーム 区間が細かく分割されることにより、各担当区間毎でエンコードにかかる時間に ばらつきが出やすくなり、子PEの待ち時間も含めたファイル回収にかかる時間 が増えたことがあげられる。また、フレーム数が少なくエンコード自体にかかる 時間も少なかったことからエンコード工程自体の並列効果の低下も起こっている。

PE数 total bcasting merging gathering enctime max enctime min

1 1500 0 0 0 1500 1500

2 766 1.13 3.46 54.4 757 708

3 529 2.22 7.46 50.4 520 470

4 404 2.22 3.51 43.0 400 348

5 336 3.33 7.51 41.3 327 271

6 280 3.33 3.39 36.9 276 224

7 242 3.33 3.47 31.5 238 192

8 219 3.33 6.09 25.5 212 163

9 195 4.65 9.93 13.1 184 145

10 172 4.44 3.61 9.96 168 133

11 161 4.66 8.87 3.95 151 120

12 150 4.44 3.53 12.0 146 109

13 148 4.44 8.65 13.0 139 99.5

14 136 4.44 3.54 16.0 132 94.1

15 126 4.66 3.43 14.8 122 88.3

16 122 4.44 8.45 11.8 113 80.6

PE数 enctime pe0 enctime avg waittime max

1 1500 1500 0

2 708 732 1.27

3 471 487 1.87

4 358 368 10.4

5 287 293 16.8

6 240 243 15.8

7 207 210 15.2

8 187 183 24.3

9 171 164 27.2

10 159 148 25.9

11 148 134 27.7

12 134 123 25.4

13 127 113 27.2

14 116 106 22.3

15 108 98.0 19.7

16 101 92.0 20.9

表 5.1: DivX 640x360 35899frames to DivX CQ4

PE数 total bcasting merging gathering enctime max enctime min

1 18 0 0 0 18 18

2 9.11 1.20 0.234 0.0716 8.83 8.81

3 6.48 2.40 0.514 0.158 5.94 5.81

4 4.90 2.61 0.252 0.103 4.62 4.53

5 3.97 3.60 0.205 0.211 3.75 3.55

6 3.52 3.81 0.301 0.269 3.20 2.95

7 3.17 3.81 0.224 0.374 2.94 2.49

8 2.53 3.60 0.249 0.0534 2.26 2.13

9 2.36 5.00 0.215 0.151 2.13 1.88

10 2.12 4.79 0.257 0.0558 1.81 1.70

11 2.64 4.82 0.226 0.728 2.40 1.58

12 2.22 5.01 0.224 0.480 1.98 1.46

13 1.82 4.79 0.338 0.0582 1.43 1.31

14 1.72 4.79 0.280 0.146 1.43 1.21

15 2.06 4.79 0.310 0.472 1.75 1.22

16 2.62 4.79 0.276 1.19 2.29 1.05

PE数 enctime pe0 enctime avg waittime max

1 18 18 0

2 8.81 8.82 0.0292

3 5.81 5.87 0.0203

4 4.54 4.57 0.0225

5 3.55 3.64 0.0125

6 2.95 3.10 0.0105

7 2.58 2.65 0.0862

8 2.23 2.20 0.100

9 1.99 1.98 0.113

10 1.81 1.75 0.118

11 1.68 1.74 0.0966

12 1.51 1.69 0.0518

13 1.43 1.35 0.121

14 1.29 1.29 0.0791

15 1.28 1.45 0.0676

16 1.16 1.53 0.133

表 5.2: Avi 320x240 900frames to DivX CQ4

図 5.1: 並列avidemuxの性能評価

第 6 章 まとめと今後の課題

ドキュメント内 2002 avidemux MPEG-4 : : : G99P045-1 (ページ 30-39)

関連したドキュメント