TProof-Liteを使う

学生さんに「TProof-liteというのを使うとマルチコアのマシンのリソースを効率的に使えますよ」と教えてもらう。TProofというのは昔どこかで調べてたぶん自分には関係無いものだと思ってたけど、ちゃんとデスクトップやラップトップのマルチコアを使う方法があるのを知った。TProof-Liteというらしい。

PROOF-Lite (available starting from ROOT version 5.22/00) is a version of PROOF optimized for multicore desktops and laptops.
https://root.cern.ch/proof-multicore-desktop-laptop-proof-lite

TProof-Liteはインストールは不要。ROOTのインストールの際になにもオプションをつけなくても使える。version 5.22/00とあるので、2010年のリリースから使えたらしい。確かにCPUのマルチコア化が一般的になってきた時期ですね。全く知らなかった。

知ったばかりなのであまり理解していないが、たとえばTChain::Draw()のような作業をする時にたくさんのCPUを使うと格段に早くなる上、進捗状況も表示してくれるようになる。たとえば、TTreeを持つrun0001.rootのような名前のファイルを元にTChainを作って、中のadc0というBranchをヒストグラムに入れたい場合、以下のようにする。

root [0] TProof::Open("");
root [1] TChain *ch = new TChain("tree");
root [2] ch->Add("run00*.root");
root [3] ch->SetProof();
root [4] ch->Draw("adc0>>h0(4096,0.,4096.)","","");

普通の作業と違う部分は、TProof::Open("");とch->SetProof();の二行だけ。ただし、TProofは僕の環境ではタブでの候補では出てこなかった。あと、SetProof()はTChainにはあるがTTreeにはないので、一つのファイルでもTChainを作る必要があるが、そもそも一つのファイルならばあまり並列化する必要はないか。他の作業はシングルCPUでの作業と完全に同じ。すると、以下のようなプログレスパーが出てくる。

これは全部で3000イベントしかないサンプルなので、並列化の恩恵よりもmargeする際の時間のほうが大きいが、大きなデータファイルならば単純にCPUの数倍とまではいかないにしても早くなる。ちなみに、Drawの際に>>でヒストグラムを定義しないと動かない模様。

これだけでもかなり便利なのだが、MakeSelectorを使うといろいろとできる。まだちゃんと整理できていないので、そのうち続きは書く。一応参考URLだけ載せておく。MakeSelectorでできるファイルにBegin()とSlaveBegin()がある理由がようやく理解できた。

https://root.cern.ch/using-tselector-proof

https://root.cern.ch/processing-proof