なが月・19日目

19日目

午前

今日は予約図書を借りに行くなどいくつか所用があったので午前はそれに費やされた。

午後

借りてきた「並列プログラミング入門」(片桐孝洋著)を読み進める。

複数のCPUでアクセスできるメモリ単位の計算機資源をノードという、という説明でどの文節に区切りを入れてよいのか判然としないが、通常HPCの利用にあたってはノード単位で利用申請をして料金を支払うなどするから、自分に割り当てられたCPUと、そこからのアクセスに限って読み書きが許されるメモリ領域のことを合わせてノードと言うのだろう。そのノード内で並列化するためにはメモリを共用した処理であるスレッドを利用する。スレッドの規格としてpthreadやOpenMPがあり、来学期授業ではこのOpenMPを使用する。あるメモリアドレスの値を読み出し加算して元の場所に書き込む処理を複数回行いたい場合、直列の代わりに並列で行うと書き換わる前に値が別のスレッドで参照されて正しく加算結果が得られない、といったことが生じる。そのために必要な排他制御のためにセマフォというデータ構造を用いる。各スレッドがこのセマフォを見ることになると共有メモリへのアクセス頻度が増し、性能が劣化するため、できる限りローカルの中で完結した演算とするのがよい。

また、ループを分割して並列処理(for int i = 0; i < N; ++iのものを0~(n/2 - 1), n/2~(n - 1) で2つに分けて2スレッドで処理するなど)する場合は、前のループでの結果を利用するような処理(a[i] = a[i -1]など)を行ってしまうと、ループの分割地点を超えてスレッド間で結果を共有できないので並列化できないことになる。このような処理を流れ依存(Flow dependency)という。例えば1個のループ内で1つの配列の中で取り扱う要素が1つになるように複数のループに分割することで、そのループ時点での状態のみを用いて処理ができるようになるので、並列化できるようだ。

OpenMPで並列化した処理中の変数は基本的にスレッド間で共有されてしまうため、別のスレッドによって書き換えられては困るようなものはプライベート変数として宣言しなければならない。

さっそくCLionで書いてみようと思ったらc:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/bin/ld.exe: cannot find -lpthreadと出てコンパイルに失敗する。ならばとWindows Subsystem for LinuxUbuntuで直にgccを叩いてもダメで困ってしまった。軽く検索していくつか対処法を試したがうまくいかない。また明日からアルバイトで十分な時間が取れなくなってしまうので来週取り組みたい。

AEチュートリアル、今日はhttps://helpx.adobe.com/after-effects/how-to/create-video-visual-effects.htmlで風景の中にテキストが存在していたかのように追加する方法を学んだ。風景と画角から深度を推定して同一高さの平面に点を設定しているのだろう。そしてそのうち3点から推定される平面上にあったと仮定してテキストを配置、点群の移動に合わせてテキストも動くという仕組みのように思われる。

画像中の物体追跡を行ってその部分にだけぼかしを適用するには、動画フッテージレイヤーを選択中にペンツールで領域を塗りつぶして(前回と同様)マスクしてから、マスクレイヤーをタイムライン中で右クリックして「マスクをトラック」する。そして画面右側のトラッカーペインで順にフレームを解析していき、もし大きくマスクがズレたなら停止して調整しそこから再開する。こうして動画全体でトラッキングが完了したら、映像全体にまずブラーエフェクトをかけ、次いでエフェクトのオプションの「コンポジットオプション」からマスクリファレンスを追加する。これでマスクは「映像のうち表示する部分を示すもの」から「映像の中でエフェクトを適用する領域を示すもの」に役割を変えたことになる。

VR制作では全車両の再セットアップが終わった。来週は以前より効率的な配置を行えるよう過去の汚いコードを書き換えることになりそうだ。